微信小程序之模板消息推送

最近在用sanic框架写微信小程序,其中写了一个微信消息推送,还挺有意思的,写了个小demo

具体见官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html

文档其实写的很详细清除了,包括返回数据的类型,报错信息

大致流程就是:调用微信小程序的接口,获取access_token,然后再调用发送模板信息的接口,发送消息

获取access_token

access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。------>我们后台可以用edis存储,然后定时任务,2小时失效

获取access_token调用接口:

#https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

#参数说明

#参数    是否必须    说明
grant_type    是    获取access_token填写client_credential
appid    是    第三方用户唯一凭证
secret    是    第三方用户唯一凭证密钥,即appsecret
#返回说明

#正常情况下,微信会返回下述JSON数据包给公众号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}
#参数说明

#参数    说明
access_token    获取到的凭证
expires_in    凭证有效时间,单位:秒
#错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}
#返回码说明

#返回码    说明
-1    系统繁忙,此时请开发者稍候再试
0    请求成功
40001    AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性
40002    请确保grant_type字段值为client_credential
40164    调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。(小程序及小游戏调用不要求IP地址在白名单内。)

接口参数以及返回参数

发送模板信息请求地址

POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN

#参数
string access_token
#接口调用凭证:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

string touser
#接收者(用户)的 openid

string template_id
#所需下发的模板消息的id

string page
#点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。

string form_id
#表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id

string data
#模板内容,不填则下发空模板

string emphasis_keyword
#模板需要放大的关键词,不填则默认无放大

接口参数

接口判断返回值

#返回值
#Object
#返回的 JSON 数据包

#属性    类型    说明    支持版本
errcode    number    错误码
errmsg    string    错误信息
errcode 的合法值

#值    说明
40037    template_id不正确
41028    form_id不正确,或者过期
41029    form_id已被使用
41030    page不正确
45009    接口调用超过限额(目前默认每个帐号日调用限额为100万)
POST 数据格式:JSON
#请求数据示例
{
  "touser": "OPENID",
  "template_id": "TEMPLATE_ID",
  "page": "index",
  "form_id": "FORMID",
  "data": {
      "keyword1": {
          "value": "339208499"
      },
      "keyword2": {
          "value": "2015年01月05日 12:30"
      },
      "keyword3": {
          "value": "腾讯微信总部"
      } ,
      "keyword4": {
          "value": "广州市海珠区新港中路397号"
      }
  },
  "emphasis_keyword": "keyword1.DATA"
}
#返回数据示例
{
 "errcode": 0,
 "errmsg": "ok",
 "template_id": "wDYzYZVxobJivW9oMpSCpuvACOfJXQIoKUm0PY397Tc"
}

返回值

全部代码展示

这里面有个特别的参数是

string form_id

表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id

如果想钻空子,如果服务端想主动发送模板消息,可以提前手机formId

构建formId 池,每次将用户提交的表单都搜集起来存入formId池,需要发送通知的时候从中取出即可。
    将用户有可能点击的区域覆盖一层不可见的button,并将整个页面用于传输formId的button包裹在一Form标签内,一旦用户有点击按钮的操作,就将获取到的formId传送走。

import requests
import json as osjson
import configparser
from Model.RedisDB import VideoData

_cf = configparser.ConfigParser()
_cf.read("/septnet/config/ServerConf_V2.conf")

# 获取微信access_token
async def get_access_token():
    try:
        payload = {
            ‘grant_type‘: ‘client_credential‘,
            ‘appid‘: _cf.get("wechat","APPID"),
            ‘secret‘: _cf.get("wechat","APPSECRET")
        }
        req = requests.get(‘https://api.weixin.qq.com/cgi-bin/token‘, params=payload, timeout=3, verify=False)
        access_token = req.json().get(‘access_token‘,"")
        print(‘access_token‘, access_token)
        return access_token
    except Exception as e:
        print(e)

# 发送模板消息
def template_push(openid,form_id,date,access_token):
    data = {
        "touser": openid,
        "template_id":  _cf.get("wechat","TEMPLATE_ID"),
        "form_id": form_id,
        ‘page‘: ‘pages/selectDetail/selectDetail?chooseSubjectTaskId=5b8de9ac705deb7cfa927abc‘,
        "data": {
            ‘keyword1‘: {
                ‘value‘: date
            },
            ‘keyword2‘: {
                ‘value‘: ‘收到消息请尽快进入小程序中接收视频邀请,在2分钟内如未进行操作,视频无法成功接通,需对方再次重新发起视频邀请‘
            }
        },
        "emphasis_keyword": ‘‘
    }

    push_url = ‘https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={}‘.format(access_token)
    result = requests.post(push_url, json=data, timeout=3, verify=False)
    return result

# 发送视频通话模板消息
async def sendTemplateMessage(key,openid, form_id, date):
    req=await VideoData.get(key)
    if not req:
        access_token=get_access_token()
        if not access_token:
            return False
        try:
            req_push=template_push(openid, form_id, date, access_token)
            req_redis = await VideoData.set(key,access_token,ex=2*60*60)
            if not req_redis:
                return False
            errcode = req_push.json().get("errcode")
            if errcode==0:
                return True
            return False
        except Exception as e:
            print(e)

    access_token = osjson.loads(req)
    template_push(openid, form_id, date, access_token)
    return True

原文地址:https://www.cnblogs.com/zzy-9318/p/9831641.html

时间: 2024-10-17 02:38:10

微信小程序之模板消息推送的相关文章

微信小程序开发模板消息的时候 出现 errcode: 41028, errmsg: "invalid form id hint:

小程序开发模板消息的时候  出现 errcode: 41028, errmsg: "invalid form id hint: 我是使用的微信支付发送模板消息,提示的formid无效的 大家知道获取到的prepay id 还非常的诡异  他不是直接一个参数 而是还带了字符串 比如 prepay_id=wx2017xx 这样格式的 那传递到微信模板消息这里的formid上要怎么传值呢? 最后检验是需要去除掉prepay id 这个字符串的  然后传递过去就可以了 然后,还会有提示无效的,就是没有支

微信小程序发送模板消息(最通俗易懂)

公司需要用到微信小程序推送   经过一下午的资料查阅,得出以下经验. 首先得去微信公众平台小程序的模板消息  创建模板  也能通过接口去创建,但是我觉得挺麻烦的  还不如去后台创建 下面是我写的测试代码,只有具体数据都是测试的模拟数据,实际业务肯定需要拿到业务数据,大家后面可以自我发挥. 对了,还有一点,电脑的小程序的开发工具是拿不到formid 的  会提示 the formId is a mock one ,只能用手机测试才能拿到formid 下面看代码吧: 这个是前台页面 1 <butto

微信小程序-发送模板消息(C#)

步骤一:获取模板ID 有两个方法可以获取模版ID 通过模版消息管理接口获取模版ID 在微信公众平台手动配置获取模版ID 步骤二:页面的 <form/> 组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息.或者当用户完成支付行为,可以获取prepay_id用于发送模板消息. 步骤三:调用接口下发模板消息 今天重要的说第三步怎么实现,前面的步骤比较简单就略过. ----------------------------

C# MVC 微信支付之微信模板消息推送

微信支付之微信模板消息推送 今天我要跟大家分享的是"模板消息"的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不牛逼吗?现在的社会,人多多少少都有或轻或重的"强迫症".就是,看到有未读消息,都要去看一下.特别是现在的微信,大部分可以几个小时不看手机QQ有没有新消息来,但是这大部分人绝对做不到一个小时不看微信有没有消息来.现在的微信,真特么是神一样的存在,几乎人人手机上都会有微信.而且,如果你的公众号是服务号的话,这个

ASP.NET 微信公众平台模板消息推送功能完整开发

最近公众平台的用户提出了新需求,他们希望当收到新的邮件或者日程的时候,公众平台能主动推送一条提醒给用户.看了看平台提供的接口,似乎只有[模板消息]能尽量满足这一需求,但不得不说微信提供的实例太少,而且只有PHP的,不过摸索了一下还是成功的实现了. 首先是准备工作,需要申请开通[模板消息]功能,网上教程很多.然后申请通过之后,用户可以从现有的模板里选择15个使用,也可以自己添加模板使用.这里吐槽一下:申请添加新的模板时,微信出于保护用户的目的禁止了一些“看起来会很频繁”的消息类型,比如这图里的——

php实现微信模板消息推送

转自:https://www.jb51.net/article/137428.htm 这篇文章主要为大家详细介绍了php实现微信模板消息推送,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了php微信模板消息推送的具体代码,供大家参考,具体内容如下 1.微信公众号模板消息配置 2.PHP代码 /** * 发送模板消息 */ public function send_notice(){ //获取access_token if ($_COOKIE['access_token']

微信小程序客服消息之解决方案

小程序自公开发布起就有消息推送功能,但由于张小龙对于微信小程序的定义为极简的生活方式,所以为了避免小程序发送过多的推送消息骚扰用户对于小程序消息推送制定了许多的规则和限制. 一.小程序客服消息的意义: 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 二.小程序把推送消息定义为两大类:模板消息和客服消息 模板消息:后台可以制作消息模板,商户可以将模板消息发送给接受过服务的用户,用户接受过一次服务(以是否产生支付数据为准)

Java对接微信公众号模板消息推送

内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html 不过请注意这一点 ok,我们继续:再来完成公众号的基本配置: 服务器地址(URL):必须以http://或https://开头,分别支持80端口和443端口.这个URL是很重要的,需要响应微信发送的token验证 令牌(To

微信模板消息推送

微信公众号消息推送 前提 环境: python 3 框架: django 1.11.9 需要有自己的服务器来响应微信发送的Token验证~~ 当然, 下面的代码用上了博主的服务器, 直接复制博主的也能用, 如果没有响应, 说明博主没启服务 测试环境 这里先介绍测试号的开发: 测试接口链接: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 点击链接进入页面,会看到一个二维码,用微信扫描后就会分配给你一个微信公众测试账号: