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

介绍

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

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

限制

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

准备步骤

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

官方文档

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

微信模板消息官方文档:https://developers.weixin.qq....

添加模板

image.png

这时候需要记下模板 id

image.png

获取 access token

接口详情

https请求方式: GET https://api.weixin.qq.com/cgi...

参数说明

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

返回说明

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

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

代码

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...

POST数据说明

POST数据示例如下:

      {
           "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数据包示例:

 {
    "errcode":0,
     "errmsg":"ok",
     "msgid":200228332
  }

代码

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))

欢迎来到我的博客:https://codeplot.top/
技术分类文章
微信公众号开发分类文章~~~~

你可能感兴趣的:(python,django,微信开发,微信公众号开发,推送消息)