更新时间(2020/12/2)
大家好,众所周知,今年左右新出的订阅消息对商家和用户的友好度都极低,少了一个直接发信息到微信的最重要的渠道。
那么我们动动歪心思,直接发消息到公众号(其实这是不是wx的本意???)。
所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,
但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限。
为方便公众号用户方便、快捷地接入小程序服务,公众号用户可复用公众号资质创建小程序。
当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。
当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升。
这还不美滋滋吗,对于小商家来说等于无限次了。
所以我们一开始最好就在公众号进行微信认证,复用公众号的资质来注册小程序(注意,可以复用5个(好像))。
(我付出了¥300的惨痛代价)。
--------------------------------------------------------------------------------
以上搞定后,流程走起
重点中的重点:为您的函数申请公网固定ip
有了这个ip之后,没有服务器的我们(穷)就能绕过ip白名单,这不正是真正的云开发精神吗?
0.用你的小程序账号登陆腾讯云,并在里面新建一个云函数
>>
选择你要发消息到公众号的小程序
-----------------我是2020/10/23的拎包哥-----------------------
创建并选择角色
记得在
https://console.cloud.tencent.com/cam/role
创建角色
勾选tcb,scf
在搜索框里搜scf,tcb后,有什么策略就勾选什么策略
创建角色名
在云函数启用刚刚新建的角色
ps. 记得做好这一步,不然各种报错
missing authorationo key // 报错:缺失授权键
you are not authorized to xxx // 你没有权限去xxx
1.打开 https://cloud.tencent.com/document/product/583/38198 ,申请白名单
2.审核通过后,再跟着步骤走。
最后你的云函数会得到一个公网固定ip
3.开始码云函数的代码
如下,记得把wx-server-sdk和request-promise的包都npm下来。
依赖包可以通过这里上传上来
我的做法
把获取的accessToken储存在云开发的数据库里。这样就不用担心access token的生成次数超过限制了
'use strict';
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const resInfo = db.collection('resInfo')
const appid = '公众号的APPID'; // APPID
const secret = '公众号的密钥'; // Secret
const rp = require('request-promise')
exports.main_handler = async (event, context, callback) => {
var that = this
var options = {
url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&secret=' + secret,
json: true
}
return await rp(options)
.then(async res1 => {
return await resInfo.where({name:'outInfo'}).update({
data: {
access_token: res1.access_token
}
}).then(res2 => {
return res2
})
}).catch(err => {
return err
})
}
公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,
过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档。
4.设置触发器(触发器偶尔会失灵,所以最好是59min触发一次)。
权限设置
由于云函数的访问不存在openid,所以安全规则必须为任何人可读可写。
5.有了可以稳定刷新的access_token后,根据需求挑选你的公众号模板消息,开始你的表演。
例如:做餐饮小程序的朋友都想用户下单后发送订单信息到商户。那么就需要
获取商户的openid
步骤
注:公众号的openid在小程序开发工具就可以查出来
5.1 获取公众号openid列表
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN
- 注意我没有加上next_openid = NEXT_OPENID,是为了取出公众号的所有的openid
- openid列表在 res.data.openid
5.2 for循环openid列表,根据商户的微信信息(nickname,city等等)找出只属于商户的openid
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
---------------------------------------
var openidList = openid列表
for(var i in openidList){
wx.request({
url:'https://api.weixin.qq.com/cgi-bin/user/info?access_token='+ openList[i] + '&lang=zh_CN',
success(){
console.log(....)
}
})
}
这里就不用unionid了,不用浪费时间在上面), 就可以使用只发给商户的模板消息了。
公众号对应文档链接
- https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html
- https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId,
-----------------------------------------效果图---------------------------------------
--------------------------------------------------------------------------------
哎,差不多了,感觉是有点折腾,如果感觉还是不够直白的,可以指出来我继续补充 。
求点赞,你的评论就是对拎包哥最大的支持。
===================更新于2020/10/23======================
这玩意儿有点新手不友好了吗,咋没人看啊。。。
您好,新建函数用的模板还是新建一个空白的呢,我就是小白,有点看不懂,运行环境是Nodejs8.9,还需要别的要求吗
请问这个有次数限制吗?可以无时间限制无次数限制的给公众号用户发吗?
谢谢,很有帮助!
collection.update:fail missing authoration key, redeploy the function; at collection.update api;
运行报错,想知道collection的值哪里错了,resinfo和ourinfo填的是我自己数据库的值
这个不需要指定保存的小程序的云环境的IP吗
感谢您的分享,上面您提到根据https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 获取公众号的openid, 可是这个接口本身就要传递openid啊,难道这里的openid是小程序中用户的openid也可以?
2. 一般来说,这个是在商家起步的时候获取商家openid用的,此时公众号里没有多少openid,很好辨认的。就算此时公众号已经有很多粉丝,你可以根据商家自己微信号的信息做做i f判断 就好了。
前提是用小程序的人也关注了对应的公众号,这个其实很难做到
前排吃瓜