最近在用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": ""
},
"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

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

  1. 微信小程序:模板消息推送提示{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXXXX]”}

    在开发小程序 模板消息定时推送功能时,在开发版测试程序功能运行正常,但提交到线上后提示报错{“errcode”:41030,”errmsg”:”invalid page hint: [gP1eXXXX ...

  2. 微信小程序新服务消息推送 —— 订阅消息

    微信团队前不久公测了「订阅消息」,原有的小程序模板消息接口将于 2020 年 1 月 10 日下线,届时将无法发送模板消息.「订阅消息」将完全替代「模板消息」,这两天得空测试了一波. 1.下发权限机制 ...

  3. 微信小程序发送模板消息

    微信小程序发送模板消息 标签(空格分隔): php 看小程序文档 [模板消息文档总览]:https://developers.weixin.qq.com/miniprogram/dev/framewo ...

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

    小程序开发模板消息的时候  出现 errcode: 41028, errmsg: "invalid form id hint: 我是使用的微信支付发送模板消息,提示的formid无效的 大家 ...

  5. 微信小程序的模板消息与小程序订阅消息

    小程序订阅消息 功能介绍 消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验. 订阅消息推送位置:服务通知 订阅消息下发条件:用户自主订阅 订阅消息卡片跳 ...

  6. 微信小程序 发送模板消息的功能实现

    背景 - 小程序开发的过程中,绝大多数会满足微信支付 - 那么,作为友好交互的体现,自然就会考虑到支付后的消息通知咯 - 所以,我的小程序项目也要求完成这个效果,so.分享一下自己的实现步骤,以方便道 ...

  7. Python 发送微信小程序的模板消息

    在小程序的开发过程中,会存在模板消息的发送,具体文档见 这里,模板消息的发送是和语言无关的,这里将简要写一下怎么用 Python 给用户发送模板消息.     通过文档可以知道,发送的时候,需要使用小 ...

  8. 订阅消息---由于微信小程序取消模板消息,限只能开发订阅消息

    订阅消息开发步骤: 1.小程序管理后台添加订阅消息的模板 2.小程序前端编写调用(拉起)订阅授权 wx.requestSubscribeMessage({ tmplIds: ['34fwe1211xx ...

  9. 微信小程序-发送模板消息

    1 添加一个小程序的消息模板,获取到模板id,存储到数据库中,方便以后修改调用 2. https://developers.weixin.qq.com/miniprogram/dev/api-back ...

随机推荐

  1. neo4j简单学习

    阅读更多 背景 最近在一些论坛或者新闻里看到了neo4j,一种擅长处理图形的数据库. 据说非常适合做一些join关系型的查询,所以抽空也看了下相关文档,给自己做个技术储备. 过程 深入学习之前,先在网 ...

  2. Python之lambda && reduce

    lambda类似于C里面的#define或者C++里面的内联函数(inline),一般都小巧精悍 >>> g=lambda x,y:x*y >>> g(3,7) 2 ...

  3. tomcat部署项目后,项目没有成功部署到tomcat里面,或者部署的是之前项目

    用svn下载java项目到本地,导入eclipse里面,然后部署到tomcat里,启动tomcat,一闪而过,在浏览器中打开,报404错(找不到页面),其实是项目没有成功部署到tomcat,可以打开t ...

  4. Javascript权威指南——读书笔记

    一.JavaScript核心语法 1.字符串中接受RegExp参数的方法 (1)text.search(pattern)返回首次匹配成功的位置 (2)text.match(pattern)返回匹配组成 ...

  5. Android消息处理:EventBus、BroadCast和Handler-优缺点比较

    上一篇研究了EventBus的使用方法,但随之而来的一系列问题也是值得思考,EventBus到底给项目带来了什么?它与Android原有的消息处理机制有什么区别和优缺点?项目在什么场景下采用Event ...

  6. Django rest_framework 自动生成接口文档

    自动生成接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 1. 安装依赖 REST fram ...

  7. 【记录】Windows host配置域名

    程序员开发中可能会需要域名访问程序,说白了就是修改hosts文件,过程如下: 1:找到本机hosts文件路径一般位置在: C:\Windows\System32\drivers\etc 2:右键编辑h ...

  8. C# 关于获取周,月,年时间大全

    DateTime now = DateTime.Now; DayOfWeek dayOfWeek = now.DayOfWeek; : (int)dayOfWeek; //本周第一天(此结果是周一,如 ...

  9. 【Luogu】【关卡2-2】交叉模拟(2017年10月)

    任务说明:这里也是模拟,但是会混有些别的部分.思维难度不大,但是编写起来会有些难度.

  10. python 获取淘宝商品信息

    python cookie 获取淘宝商品信息 # //get_goods_from_taobao import requests import re import xlsxwriter cok='' ...