一、背景
最近開發(fā)的一個小程序項(xiàng)目需要通過服務(wù)號來推送通知。但是在最開始開發(fā)小程序的時候并沒有考慮到這個功能。
二、準(zhǔn)備條件
預(yù)備知識:
小程序openid:小程序用戶的唯一id
公眾號openid:公眾號用戶的唯一id
unionid:同一用戶,對同一個微信開放平臺下的不同應(yīng)用,unionid是相同的
準(zhǔn)備:
1.將小程序與公眾號綁定(綁定后才可獲取unionid),官方文檔:小程序與公眾號綁定獲取unionid
2.接入微信公眾平臺開發(fā),也就是給服務(wù)號配置一下開發(fā)者服務(wù)器。當(dāng)有用戶關(guān)注/取消服務(wù)號時,微信服務(wù)器會推送關(guān)注/取消的事件給我們的服務(wù)器。官方文檔:接入微信公眾平臺開發(fā)
3.獲取公眾號用戶列表,即所有用戶的公眾號openid。官方文檔:獲取公眾號用戶列表
4.通過公眾號openid獲取用戶的unionid。官方文檔:通過公眾號openid獲取unionid
5.推送服務(wù)號消息。官方文檔:公眾號發(fā)送模版消息
注意:
1.在上述的一些接口中,需要獲取access_token。小程序和公眾號的access_token是不同的,需要用各自的appid和secret去獲取。
2.access_token每天只能獲取200次,有效期是7200秒。所以應(yīng)該把它加入緩存,而不是每次都去獲取新的access_token。
三、開始開發(fā)
將小程序用戶與公眾號用戶關(guān)聯(lián):
小程序用戶openid→unionid←公眾號用戶openid
要想將小程序與公眾號用戶關(guān)聯(lián),第一件事就是獲取用戶的unionid。
我們可以在兩種情況下獲取用戶的unionid:
一、如果用戶已經(jīng)關(guān)注了公眾號,那么在用戶登錄的時候,就可以獲取到unionid
二、如果用戶沒有關(guān)注公眾號,那么得讓前端調(diào)用wx.getUserInfo,把加密數(shù)據(jù)給后端解密拿到unionid。
解密需要session_key,而session_key又有有效期,得注意它過期的情況。
當(dāng)用戶關(guān)注公眾號時,微信會推送事件給我們(本文準(zhǔn)備條件的第2條)。
通過關(guān)注事件,我們可以拿到用戶的公眾號openid,再獲取unionid(本文準(zhǔn)備條件的第4條)。拿到unionid后,去數(shù)據(jù)庫查詢這個unionid的用戶,并把公眾號openid保存。
但是,還有兩個情況沒有考慮到:
一、在我們開發(fā)之前,已經(jīng)關(guān)注了公眾號的用戶沒有去關(guān)聯(lián)
解決方案:
獲取微信公眾號的用戶列表,再依次獲取用戶unionid(本文準(zhǔn)備條件的第3、4條)。注意,此操作非常耗時。
二、用戶先關(guān)注了公眾號,但是從來沒用過小程序(數(shù)據(jù)庫里沒有unionid,導(dǎo)致無法關(guān)聯(lián))
解決方案:
新建一張表,把這個公眾號用戶先記錄下來。當(dāng)小程序用戶登錄時,先檢查一遍這張表嘗試關(guān)聯(lián)。
至此,小程序用戶與公眾號用戶就已經(jīng)完成了關(guān)聯(lián)。
發(fā)送模版消息:
這個就很簡單了,照著官方文檔(本文準(zhǔn)備條件的第5條)做就行了。
需要注意的是,參數(shù)別寫錯了,我就是把miniprogram放到data里面去了,導(dǎo)致不能跳轉(zhuǎn)小程序文章來源:http://www.zghlxwxcb.cn/news/detail-800300.html
最后附上發(fā)送模版消息的python代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-800300.html
def send_oa_msg(oa_openid, template_id, jump_param, param):
"""
發(fā)送模版消息
"""
oa_token = get_oa_access_token()
url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={oa_token}'.format(oa_token=oa_token)
post_data = {
"touser": oa_openid,
"template_id": template_id,
"miniprogram": jump_param,
"data": param
}
res = requests.post(url, json=post_data)
result = res.json()
if result['errcode'] == 0:
return True
else:
return False
到了這里,關(guān)于【小程序】微信小程序關(guān)聯(lián)公眾號(服務(wù)號)推送通知消息的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!