将小程序与服务号消息推送相结合,不要再处于一种傻傻地不能够分辨清楚的状态啦!这样一套组合拳的形式,能够使得你的用户从此以后再也无法逃脱掉。
你是否也曾碰到过这般状况呢:使用者使用完小程序后便即刻离开了,当想要再度联系到他们时却毫无办法?甭着急,就在今天我会将把小程序关联服务号以实现消息推送这个完整类型的解决办法分享出来了,此方法路径可才不是我才想出来拍拍脑袋随便分享的,而是我在实际开展的项目当中已经成功实践并验证可行了的了,可以说是绝对十足的实用干货了。
在动手开展相关操作之前,要先去确认三件事情。其一,你所拥有的小程序已然通过了微信认证,进而拿到了 appid 以及 secret。其二,服务号同样也必须得是已认证过的状态,并且同样要准备好它的 appid 还有 secret。其三,这是最为关键的一步,要把这两个账号绑定到同一个微信开放平台之下。
此三项认证皆不可或缺,我当初仅是由于服务号未认证,历经折腾两日方才发觉乃为此问题。绑定开放平台系为使小程序与服务号的 unionid 得以打通,这是后续所有操作的根基所在。2024 年微信官方对该规则予以强化,未认证的账号诸多接口均无法使用。
已经完成了准备工作,接下来要去获取服务号的access_token,它可是调用服务号任意接口不可或缺的通行证,借助官方提供的接口凭借appid以及secret便可成功拿到。特别要留心的是这个token有效期仅有两小时,故而建议借助定时任务予以刷新。
获取到了token,紧接着去获取关注服务号的全部用户列表。调用获取用户列表的接口,传递access_token便可。返回的数据当中存在一个openid列表,这全都是你所服务指向的对象。我通常会把这个列表存储到数据库里,以此来方便后续的操作,毕竟微信对每日调用次数进行了限制。
//接口地址换成自己服务号appid和secret
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=secret,
当拥有了openid列表之后,接下来要开展的是获取每一个用户的详细信息这一行为。进行调用获取用户基本信息接口这个动作时,是需要access_token以及openid这两个参数的。而返回的那些数据涵盖范围很广泛,含有昵称、头像、性别、地理位置,甚至还包含关注时间。
可提出建议,在后台构建一张表格用于存储这些数据,其字段涵盖openid、unionid、昵称、头像、关注状态等。每天凌晨借助定时任务予以更新一回,以防止因频繁调用接口而受到限制。到了2025年,微信针对用户隐私保护变得更为严格了,存储这些信息务必要做好加密处理。
getServiceMessage: (req, res, next) => {
const access_token = req.query.access_token;
let url = `https://api.weixin.qq.com/cgi-bin/user/get?access_token=${access_token}`;
request.get(url, function (error, response, body) {
let data = JSON.parse(body);
if (data != null) {
res.send(data);
}
else {
res.send(error);
}
})
},
用户开启小程序之际,前端予以调用的 wx.login 去获取临时 code;后端当其获取了 code 之后,借助官方接口来换取 session_key 以及 openid;需留意这一步只是能够取得小程序的 openid,而无法获取 unionid。
着重之处出现了,鉴于之前早就已经将小程序跟服务号绑定至同一个开放平台咯,因而借助这个openid以调用获取unionid的接口,便能够获取到用户的unionid。存在这样一种情况,这个unionid类似用户的身份证,在小程序与服务号相互之间属于唯一的那般。
getServiceAll: (req, res, next) => {
const access_token = req.query.access_token;
const openid = req.query.openid;
let url = `https://api.weixin.qq.com/cgi-bin/user/info?access_token=${access_token}&openid=${openid}&lang=zh_CN`;
request.get(url, function (error, response, body) {
let data = JSON.parse(body);
if (data != null) {
res.send(data);
}
else {
res.send(error);
}
})
},
手里现在有了用户的unionid,那么就能够去往之前建好的关注用户表当中去进行查询,查看这个unionid所对应的服务号openid究竟是否存在。要是存在的话,那就表明这个用户关注了你的服务号,如此一来便可以给他推送消息了。
这一步,相当关键和重要里面超级关键紧要的一部。我在用此个方案时,向一家在网上做买卖并有很大客流量人数较稳定有较多交易的客户推送信息,他们那个小型程序每日固定活跃使用5万的人数,当中存在3.8万的这类人同时对服务号给予关心留意关注留存。依靠unionid相连串联,信息传递送达成功率有效比率从以前原本的20%升高增长提高到超出95%。购买再次重复比率直接翻番在原有的基础翻倍增长了。
getUserMessage: (req, res, next) => {
const code = req.query.code;
const appid = '';//自己小程序的appid(可以写死)
const secret = '';//自己小程序的secret(可以写死)
let url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code +"&grant_type=authorization_code";
request.get(url, function (error, response, body) {
let data = JSON.parse(body);
if (data != null) {
res.send(data);
}
else {
res.send(error);
}
})
},
于拿到服务号openid以后,推送那模板消息便变得简单起来了。首先要在小程序后台去申请模板,在审核通过之后就会拿到模板ID。接着调用发送模板消息的接口,此操作乃需要access_token、openid、模板ID以及具体的数据的。
要是想着一次给好多人推送,那能够把openid放置到数组里头进行循环发送。不过要留意微信接口存在频率限制,普通服务号每一天是10万次,建议添加个延迟。我通常借助队列来处理,每秒发送5条左右,这样既不会触发限制,又能够确保送达。
最后再提醒一下,倘若用户选择取消对服务号的关注,借由这个途径是无法接收到消息的。因而在进行推送之前,务必要对用户的关注状态予以判断,防止徒然耗费接口次数。
在小程序与服务号进行对接期间遇见了啥样难以处理的问题呢?欢迎于评论区域分享你遭遇困境的经历,为这篇章目点赞之后收藏起来,后期实施推送功能时笔直依照所呈现的去操作便可以啦!