需求背景
采用微信登錄的授權(quán)的 網(wǎng)頁應用 需要用到 服務(wù)號 的模板下發(fā)功能
例如在某電商網(wǎng)頁上進行了購買操作,需要相關(guān)聯(lián)的服務(wù)號發(fā)送一條購買成功的模板消息彪置。(如果關(guān)注了京東的服務(wù)號拄踪,每次在京東上買東西的時候會受到服務(wù)號下發(fā)模板消息)
需要達成效果如下:
實現(xiàn)思路
微信開發(fā)會遇到兩種常見的用戶ID,openid 和 unionid
每個用戶對開放平臺有唯一的unionid
每個用戶對于每個服務(wù)號或者網(wǎng)頁/APP應用有不同的openid
需要以unionid為橋梁打通 網(wǎng)頁應用 和 服務(wù)號 的數(shù)據(jù)關(guān)聯(lián)拳魁。
實現(xiàn)步驟
- 服務(wù)號和開放平臺認證 并 服務(wù)號綁定開放平臺惶桐。
- 用戶在網(wǎng)頁應用采用微信授權(quán)登錄,授權(quán)成功后根據(jù) code 獲取用戶 unionid
- 部署服務(wù)號消息訂閱服務(wù)器潘懊,接受微信推送的事件消息(例如服務(wù)號關(guān)注事件姚糊,取消關(guān)注事件)
- 在用戶關(guān)注公眾號的時候,訂閱服務(wù)器獲取訂閱用戶的服務(wù)號openid
- 用服務(wù)號openid獲取userinfo(用戶信息)授舟,其中包括unionid
- 通過unionid確定用戶身份救恨,將服務(wù)號openid寫入該用戶表
- 在業(yè)務(wù)發(fā)生的時候,通過服務(wù)號openid直接下發(fā)模板消息释树。
網(wǎng)頁應用授權(quán)
第一步:請求CODE
步驟1:在頁面中先引入如下JS文件(支持https):
http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
步驟2:在需要使用微信登錄的地方實例以下JS對象:
var obj = new WxLogin({
self_redirect:false,
id:"login_container",
appid: "appid",
scope: "snsapi_login",
redirect_uri: "",
state: "",
style: "",
href: ""
});
步驟3: 用戶在手機上確認授權(quán)后肠槽,頁面會自動重定向到redirect_uri上,并且?guī)蟘ode和state參數(shù)奢啥。
第二步:通過code獲取access_token
通過code獲取access_token
直接調(diào)下面的接口即可
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
正確的返回結(jié)果如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
獲取用戶信息
access_token 可以用來進一步獲取用戶公開信息(包括頭像秸仙,名字,地理位置)
直接調(diào)下面的接口即可
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
正確的返回消息如下
{
"openid": "oAX1fwQevayrMNxAZGvoa8kvZCMc",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "Guangzhou",
"province": "Guangdong",
"country": "CN",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/vi_32/4WFBCHqe458kAocTXqVPV5CHxHmYQs414DcqRqmC3jTZVYYqGvRbSgNYGRIeUaCge6r8AD6bcsU1RzfldGHJKg/132",
"privilege": [
"chinaunicom"
],
"unionid": "oTq_VwExIiigeoJtP8r0FrQj7Cqk"
}
部署服務(wù)號消息訂閱服務(wù)器
參考官方文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
第一步: 填寫服務(wù)器配置
登錄微信公眾平臺官網(wǎng)后桩盲,在公眾平臺官網(wǎng)的開發(fā)-基本設(shè)置頁面寂纪,勾選協(xié)議成為開發(fā)者,點擊“修改配置”按鈕正驻,填寫服務(wù)器地址(URL)弊攘、Token和EncodingAESKey抢腐,其中URL是開發(fā)者用來接收微信消息和事件的接口URL。Token可由開發(fā)者可以任意填寫襟交,用作生成簽名(該Token會和接口URL中包含的Token進行比對迈倍,從而驗證安全性)。EncodingAESKey由開發(fā)者手動填寫或隨機生成捣域,將用作消息體加解密密鑰啼染。
第二步:驗證消息的確來自微信服務(wù)器
開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上焕梅,GET請求攜帶參數(shù)如下表所示:
參數(shù) | 描述 |
---|---|
signature | 微信加密簽名迹鹅,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)贞言。 |
timestamp | 時間戳 |
nonce | 隨機數(shù) |
echostr | 隨機字符串 |
開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)斜棚。若確認此次GET請求來自微信服務(wù)器,請原樣返回echostr參數(shù)內(nèi)容该窗,則接入生效弟蚀,成為開發(fā)者成功,否則接入失敗酗失。加密/校驗流程如下:
1)將token义钉、timestamp、nonce三個參數(shù)進行字典序排序 2)將三個參數(shù)字符串拼接成一個字符串進行sha1加密 3)開發(fā)者獲得加密后的字符串可與signature對比规肴,標識該請求來源于微信
express 版本的驗證代碼
// var crypto = require('crypto');
// const hash = crypto.createHash('sha1')
var wxReceiver = function(req, res, next) {
console.log('wxReceiver-body: ', req.body);
const signature = req.query.signature
const timestamp = req.query.timestamp
const nonce = req.query.nonce
const echostr = req.query.echostr
const arr = [nonce, 'njjnjn', timestamp]
arr.sort()
const tStr = arr[0] + arr[1] + arr[2]
hash.update(tStr)
const hashResult = hash.digest('hex')
if(hashResult == signature) {
// 這是來自微信官方的消息
res.send(echostr)
}
};
依據(jù)接口文檔實現(xiàn)業(yè)務(wù)邏輯
驗證URL有效性成功后即接入生效捶闸,成為開發(fā)者。你可以在公眾平臺網(wǎng)站中申請微信認證拖刃,認證成功后删壮,將獲得更多接口權(quán)限,滿足更多業(yè)務(wù)需求兑牡。
成為開發(fā)者后醉锅,用戶每次向公眾號發(fā)送消息、或者產(chǎn)生自定義菜單发绢、或產(chǎn)生微信支付訂單等情況時,開發(fā)者填寫的服務(wù)器配置URL將得到微信服務(wù)器推送過來的消息和事件垄琐,開發(fā)者可以依據(jù)自身業(yè)務(wù)邏輯進行響應边酒,如回復消息
消息是XML格式的,這是xml parse后的 消息模式長這樣
{
tousername: [ 'gh_15a5ec8f6116' ],
fromusername: [ 'oC9vJwnxrquE5Ss2PEL49TX-3hpI' ],
createtime: [ '1524646369' ],
msgtype: [ 'event' ],
event: [ 'TEMPLATESENDJOBFINISH' ],
msgid: [ '252565859871080449' ],
status: [ 'success' ]
}
這里面fromusername就是服務(wù)號的openid
推送模板消息
官方文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
這個功能需要審核才能用狸窘,審核之后先添加模板
然后直接調(diào)用接口即可發(fā)送模板消息
<!--http請求方式: POST-->
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
POST數(shù)據(jù)示例如下:
{
"touser":"OPENID",
"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",
"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"
}
}
}