这篇主要针对小程序进行演示,既然是发送消息,那么就有三个问题。发送什么内容,给谁发送,怎么发送!往下一条一条解决。
- 发送什么消息内容 - 通过微信公众号平台 选择对应的消息模板
选择以后在我的模板里面就出现了。
- 发给谁
既然是发送信息,那么必须有收件人的地址,在微信生态里面,只要是通过微信登录用户都会根据不同小程序分配一个唯一的openid(每个小程序都不一样,但是在当前小程序是唯一的)。因为我的系统是使用手机号码注册的,并没有使用微信登录,那么如果要得到微信分配的openid就需要在注册时候使用微信登录一次,只是为了得到当前用户的openid。代码如下//前面是自己的注册逻辑
uni.login({ provider: 'weixin', success: function(res) { let appid = '*******' // 通过微信小程序后台 开发管理 开发设置得到 let secret = '*******' // 同上 let url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + res.code + '&grant_type=authorization_code'; uni.request({ url: url, // 请求路径 success: result => { console.info(result.data.openid); // 在此处得到openid 保存数据库即可 每个用户在不同的小程序下是不一样的 }, }); } });
做完这一步已经得到了收件人,不过微信的限制是你需要在需要发送的地方让用户许可(如果没有这个限制,怕你的小程序一直给客户发骚扰信息),这个用个实例说下,比如我的是考试系统,那么如果客户预约了某场考试,那么我就会在预约按钮上增加一个逻辑用来获取用户允许接受信息的权限(用户点击一次,你能发一次,微信后台有记录)
//上面是考试预约逻辑
uni.requestSubscribeMessage({ tmplIds: ['*******'], // 你的模板id 此处是可以多个模板id的 不过我的是一个 success(res) { console.log('已授权接收订阅消息') } })
效果如下
-
用户点击完毕以后,等于你有了一次给当前用户发送一条当前模板的权利。如果你搞个循环让这个授权弹出5次,那么你就能给当前这个客户发送5次。
- 往下就是怎么发的问题了,可以通过自己的后台服务发送,当然也可以是前台,只要能访问网络都可以,这里选用的是python后台进行发送,其他的代码都差不多。还有考试的例子,他预约以后,我在后台建立个定时任务,当这个考试的前10分钟开始批量给预约过考试的用户发送。因为发送是通过腾讯服务发送的,所以需要先进行token认证。
appid = "***" // 微信id 获取方式和上面面一样 secret = "***" // 同上 token_url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}" request = urllib.request.Request(token_url) # get服务器请求 token_result = urllib.request.urlopen(request).read() token_result=str(token_result, encoding = "utf-8") token_result=eval(token_result) print(token_result) serverToken = token_result.get('access_token')
认证以后得到token,就可以发送了
// data为模板的 内容
data = { # 用户的openId 就是前台注册的时候保存到数据库那个 "touser": '*****', # 订阅消息模板id "template_id": "*****", # 要跳转的页面 这里可以跳转到小程序的某个页面,可以带参数 "page": "pages/index/index", # 模板消息对应的内容设置 每个字段类型可以根据自己的模板设置 "data": { "thing1": { "value": "距开考时间仅剩10分钟,请您按时参加!" }, "thing2": { "value": "2020年国家公务员考试模拟考试" }, "date3": { "value": "2019年10月1日 15:01" }, "thing11": { "value": "一建水利" } } } url = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={serverToken}'.format(serverToken = serverToken)# 数据格式化(从这里开始对上面的data进行格式化,转成符合post的json参数形式) data = json.dumps(data) # 数据格式化 data = bytes(data, 'utf8') # 数据格式化 request = urllib.request.Request(url) # post服务器请求 result = urllib.request.urlopen(request, data).read() # 打印结果 print(result)
最终效果
- 往下就是怎么发的问题了,可以通过自己的后台服务发送,当然也可以是前台,只要能访问网络都可以,这里选用的是python后台进行发送,其他的代码都差不多。还有考试的例子,他预约以后,我在后台建立个定时任务,当这个考试的前10分钟开始批量给预约过考试的用户发送。因为发送是通过腾讯服务发送的,所以需要先进行token认证。