我的博客

django 微信公众号开发 - 给用户主动推送消息(发送模板消息,python公众号开发)

目录
  1. 介绍
  2. 限制
  3. 准备步骤
  4. 官方文档
  5. 添加模板
  6. 获取 access token
    1. 接口详情
    2. 代码
  7. 调用接口,发送模板消息
    1. 接口详情
    2. 代码

介绍

给微信公众号用户主动推送消息指的是发送模板消息。可以随时给用户发送提醒。功能非常丰富,比如提醒用户特定事件(该付费了,商品降价,任务执行成功,遇到错误等等)。

不仅可以向用户发送文字消息,还可以实现用户点击后跳转指定网页或小程序。

限制

但是该功能也受到很多限制。模板消息顾名思义,只能根据模板发送消息,模板可以从模板库选择,也可以自己创建,但是必须通过审核才能使用。而且只有微信公众号可以使用模板消息,且要通过微信认证(目前的条件是必须要有营业执照才能注册公众号,个人注册的是订阅号,无法通过微信认证)

准备步骤

  1. 通过微信认证

  2. 另外要发送消息,先要绑定用户 openid,具体操作请间我前一篇文章:django 微信公众号开发 - 获取授权 绑定用户微信 openid

官方文档

官方文档写的比较复杂,而且没有示例代码。

微信模板消息官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

添加模板

image.png

这时候需要记下模板 id

image.png

获取 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数据包给公众号:

1
{"access_token":"ACCESS_TOKEN","expires_in":7200}

代码

1
2
3
4
5
6
7
8
9
10
exp_time = 0
access_token = ''
def get_access_token():
global exp_time, access_token
if time.time() > exp_time:
r = requests.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET')
d = json.loads(r.text)
access_token = d['access_token']
exp_time = time.time() + d['expires_in'] - 10 # 减一点防止快到时间的时候已经失效了
return access_token

python 获取微信公众号 access token

调用接口,发送模板消息

接口详情

http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

POST数据说明

POST数据示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"touser":"OPENID",
"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",
"miniprogram":{
"appid":"xiaochengxuappid12345",
"pagepath":"index?foo=bar"
},
"data":{
"first": {
"value":"恭喜你购买成功!",
"color":"#173177"
},
"keyword1":{
"value":"巧克力",
"color":"#173177"
},
"keyword2": {
"value":"39.8元",
"color":"#173177"
},
"keyword3": {
"value":"2014年9月22日",
"color":"#173177"
},
"remark":{
"value":"欢迎再次购买!",
"color":"#173177"
}
}
}

参数说明

参数 是否必填 说明
touser 接收者openid
template_id 模板ID
url 模板跳转链接(海外帐号没有跳转能力)
miniprogram 跳小程序所需数据,不需跳小程序可不用传该数据
appid 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
pagepath 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏
data 模板数据
color 模板内容字体颜色,不填默认为黑色

注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。

返回码说明

在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

1
2
3
4
5
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def send_msg(idx):
users = UserProfile.objects.filter(school=request.user.userpro file.school, user_type='工作人员', vacation_manage=True)
data = {
"touser":"OPENID",
"template_id":"xxxxxxxxx",
"url":"https://xxxx.com/view/%d/" % idx,
"data":{
"first": {
"value": "",
"color": "#173177"
},
"keyword1":{
"value": '',
"color":"#173177"
},
"keyword2": {
"value": data,
"color":"#173177"
},
"keyword3": {
"value": '',
"color":"#173177"
},
"remark":{
"value": description,
"Data": description,
"color":"#173177"
}
}
}
for u in users:
if u.openid:
data['touser'] = u.openid
url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' + get_access_token()
r = requests.post(url, json.dumps(data))

评论无需登录,可以匿名,欢迎评论!