微信開放平臺開發(fā):用unionid打通網(wǎng)頁應用 與 服務(wù)號 的用戶數(shù)據(jù)關(guān)聯(lián)

需求背景

采用微信登錄的授權(quán)的 網(wǎng)頁應用 需要用到 服務(wù)號 的模板下發(fā)功能

例如在某電商網(wǎng)頁上進行了購買操作,需要相關(guān)聯(lián)的服務(wù)號發(fā)送一條購買成功的模板消息彪置。(如果關(guān)注了京東的服務(wù)號拄踪,每次在京東上買東西的時候會受到服務(wù)號下發(fā)模板消息)

需要達成效果如下:

image

實現(xiàn)思路

微信開發(fā)會遇到兩種常見的用戶ID,openid 和 unionid

每個用戶對開放平臺有唯一的unionid

每個用戶對于每個服務(wù)號或者網(wǎng)頁/APP應用有不同的openid

需要以unionid為橋梁打通 網(wǎng)頁應用 和 服務(wù)號 的數(shù)據(jù)關(guān)聯(lián)拳魁。

實現(xiàn)步驟

  1. 服務(wù)號和開放平臺認證 并 服務(wù)號綁定開放平臺惶桐。
  2. 用戶在網(wǎng)頁應用采用微信授權(quán)登錄,授權(quán)成功后根據(jù) code 獲取用戶 unionid
  3. 部署服務(wù)號消息訂閱服務(wù)器潘懊,接受微信推送的事件消息(例如服務(wù)號關(guān)注事件姚糊,取消關(guān)注事件)
  4. 在用戶關(guān)注公眾號的時候,訂閱服務(wù)器獲取訂閱用戶的服務(wù)號openid
  5. 用服務(wù)號openid獲取userinfo(用戶信息)授舟,其中包括unionid
  6. 通過unionid確定用戶身份救恨,將服務(wù)號openid寫入該用戶表
  7. 在業(yè)務(wù)發(fā)生的時候,通過服務(wù)號openid直接下發(fā)模板消息释树。

網(wǎng)頁應用授權(quán)

參考官方文檔 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=4d3543ff030ecd73c21923bd8426d08678986d88&lang=

第一步:請求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ā)者手動填寫或隨機生成捣域,將用作消息體加解密密鑰啼染。

image

第二步:驗證消息的確來自微信服務(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"
                   }
           }
       }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翻擒,一起剝皮案震驚了整個濱河市氓涣,隨后出現(xiàn)的幾起案子牛哺,更是在濱河造成了極大的恐慌,老刑警劉巖劳吠,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件引润,死亡現(xiàn)場離奇詭異,居然都是意外死亡痒玩,警方通過查閱死者的電腦和手機淳附,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢古,“玉大人奴曙,你說我怎么就攤上這事〔菅龋” “怎么了洽糟?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堕战。 經(jīng)常有香客問我坤溃,道長,這世上最難降的妖魔是什么践啄? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任浇雹,我火速辦了婚禮,結(jié)果婚禮上屿讽,老公的妹妹穿的比我還像新娘昭灵。我一直安慰自己,他們只是感情好伐谈,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布烂完。 她就那樣靜靜地躺著,像睡著了一般诵棵。 火紅的嫁衣襯著肌膚如雪抠蚣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天履澳,我揣著相機與錄音嘶窄,去河邊找鬼。 笑死距贷,一個胖子當著我的面吹牛柄冲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忠蝗,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼现横,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戒祠,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤骇两,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姜盈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體低千,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年贩据,在試婚紗的時候發(fā)現(xiàn)自己被綠了栋操。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡饱亮,死狀恐怖矾芙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情近上,我是刑警寧澤剔宪,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站壹无,受9級特大地震影響葱绒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斗锭,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一地淀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岖是,春花似錦帮毁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聪轿,卻和暖如春爷肝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陆错。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工灯抛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音瓷。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓牧愁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親外莲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容