現在很多網(wǎng)站都已經(jīng)建立了一套完整的用戶(hù)賬號體系,基于這套體系,再做其他應用的用戶(hù)擴展就非常方便。例如,有了微軟的outlook賬戶(hù),就可以登錄win8,可以登錄微軟的郵箱,還可以登錄skype。同樣地,一個(gè)Apple ID可以享受蘋(píng)果的所有服務(wù)。正所謂,一個(gè)賬號,處處使用。
對于企業(yè),可能會(huì )有產(chǎn)品線(xiàn)通常有網(wǎng)站,app,微信公眾號等。統一各產(chǎn)品線(xiàn)的賬號體系,實(shí)現一個(gè)賬號處處使用的目標是非常有必要的。網(wǎng)站和app使用同一個(gè)賬號,不需要做任何多余的工作,客戶(hù)只要有用戶(hù)名密碼即可登錄。對于微信公眾號,由于它是基于微信公眾平臺的一個(gè)應用,需要遵守平臺的規則,所以需要做一些額外的工作才能達到賬號互通的目標。
接下來(lái)我們就來(lái)討論一下,如何做到微信公眾號用戶(hù)與網(wǎng)站用戶(hù)的賬號體系無(wú)縫對接。
當用戶(hù)關(guān)注微信公眾號后,會(huì )有一些交互,交互過(guò)程中可能需要獲取到用戶(hù)的身份信息(對應到網(wǎng)站的賬戶(hù)信息),例如在公眾號中下單,查詢(xún)訂單等操作。那么現在問(wèn)題來(lái)了:對于同一個(gè)用戶(hù),我們如何建立微信公眾號用戶(hù)(openid)與網(wǎng)站用戶(hù)(userid)之間的對應關(guān)系。這個(gè)過(guò)程我們稱(chēng)之為綁定。
為了簡(jiǎn)化討論,我總結了這樣兩個(gè)場(chǎng)景:
一、用戶(hù)已注冊成為我們的網(wǎng)站用戶(hù),但還未關(guān)注我們的微信公眾號;
二、用戶(hù)未注冊,但已關(guān)注我們的微信公眾號。
對于以上兩種情況,下面分別討論。
場(chǎng)景一
用戶(hù)已注冊成為我們的網(wǎng)站用戶(hù),但還未關(guān)注我們的微信公眾號。如何方便用戶(hù)關(guān)注公眾號,同時(shí)又能把用戶(hù)和微信公眾號綁定在一起呢?很自然地就可以想到二維碼這個(gè)入口。
最近幾年,二維碼的應用特別廣泛。微信對二維碼的推廣及應用可以說(shuō)是如魚(yú)得水,微信二維碼支付,微信二維碼登錄,微信二維碼名片等等??梢哉f(shuō),二維碼已經(jīng)成為O2O中連接線(xiàn)上線(xiàn)下的重要紐帶。小馬哥也稱(chēng)"二維碼是線(xiàn)上線(xiàn)下的一個(gè)關(guān)鍵入口"。
在這里,需要用戶(hù)在網(wǎng)站上先登錄,然后在合適的地方給出一個(gè)綁定入口,比如在個(gè)人設置里。綁定流程如下:
這里需要用到微信的二維碼生成功能:http://mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html
關(guān)于微信二維碼,官方文檔中這樣說(shuō):
目前有2種類(lèi)型的二維碼,分別是臨時(shí)二維碼和永久二維碼,前者有過(guò)期時(shí)間,有效期30天(2592000秒),但能夠生成較多數量,后者無(wú)過(guò)期時(shí)間,數量較少(目前參數只支持1--100000,即10萬(wàn)個(gè))。兩種二維碼分別適用于賬號綁定、用戶(hù)來(lái)源統計等場(chǎng)景。
顯然,我們使用臨時(shí)二維碼比較合適。每當用戶(hù)刷新頁(yè)面時(shí),都可以生成一次。
由于二維碼里可以帶有場(chǎng)景值(scene_id),當用戶(hù)掃描帶有場(chǎng)景值的二維碼后,微信服務(wù)器會(huì )把場(chǎng)景值推送給我們自己的服務(wù)器,我們拿到場(chǎng)景值后,就可以做驗證和綁定邏輯。注意:生成二維碼需要認證后的服務(wù)號。
一次完整的綁定流程應該是這樣的:
①用戶(hù)登錄網(wǎng)頁(yè),點(diǎn)擊“綁定微信賬戶(hù)”;
②后臺使用微信接口,生成二維碼鏈接返回給前端顯示,并建立場(chǎng)景值A與用戶(hù)的對應關(guān)系;
③用戶(hù)掃描二維碼,并點(diǎn)擊關(guān)注微信公眾號(假如已關(guān)注,直接跳到④);
④后臺接收微信服務(wù)器推送的場(chǎng)景值A;
⑤后臺根據場(chǎng)景值A,查詢(xún)到對應的用戶(hù)ID(依賴(lài)于②中建立的對應關(guān)系);
⑥建立用戶(hù)userid與微信用戶(hù)openid的對應關(guān)系;
⑦給用戶(hù)的微信客戶(hù)端推送“綁定成功”的提示;
⑧通知前臺頁(yè)面,綁定已完成,刷新頁(yè)面,并返回一些微信賬戶(hù)信息。完成綁定。
其中,②中,“建立場(chǎng)景值A與用戶(hù)之間的對應關(guān)系”,因為用戶(hù)已經(jīng)登錄,所以用戶(hù)點(diǎn)擊“綁定微信賬戶(hù)”時(shí),我們可以在后臺分配一個(gè)臨時(shí)場(chǎng)景值A與用戶(hù)ID之間的對于關(guān)系。對于用戶(hù)量不大的網(wǎng)站,可以直接使用php中的apc來(lái)緩存,并設置一個(gè)過(guò)期時(shí)間(與臨時(shí)二維碼過(guò)期時(shí)間設置成一樣即可)。不要使用session來(lái)存儲這種對應關(guān)系,因為④中是微信的推送事件,是不帶session信息的,可以使用redis這類(lèi)緩存或DB來(lái)存儲。另,這里要使用臨時(shí)二維碼,數量上沒(méi)有限制,只有時(shí)間限制,前臺定時(shí)刷新即可。
⑧中,因為http沒(méi)有推送機制,所以最簡(jiǎn)單的方法就是輪詢(xún)去查詢(xún),是否已經(jīng)完成綁定,完成綁定后再刷新頁(yè)面。
完成綁定后,用戶(hù)再跟我們的微信公眾號交互時(shí),根據openid可以找到對應的userid,即完成身份識別。對于之前提到的下單,查詢(xún)訂單,都是可以實(shí)現的。
整個(gè)綁定過(guò)程并不復雜,實(shí)現起來(lái)也沒(méi)有太大的技術(shù)難度,最關(guān)鍵的是思路。
上述流程是用戶(hù)已經(jīng)在網(wǎng)頁(yè)端登錄了,也就是說(shuō)已經(jīng)注冊用戶(hù)。對于沒(méi)有登錄的情況,我們也可以做,在登錄頁(yè)面生成一個(gè)二維碼,讓用戶(hù)用微信掃一掃。假如用戶(hù)已經(jīng)注冊,則可以自動(dòng)登錄,并完成網(wǎng)站賬號和微信賬號的綁定;假如用戶(hù)沒(méi)有注冊,則網(wǎng)頁(yè)跳轉到綁定賬號頁(yè)面,只要用戶(hù)輸入郵箱密碼快速注冊,同時(shí)也完成了網(wǎng)站賬號和微信用戶(hù)的綁定。實(shí)現技術(shù)方案跟上述類(lèi)似。
場(chǎng)景二
場(chǎng)景二,對于用戶(hù)來(lái)說(shuō)操作略微復雜,因為它需要用戶(hù)在微信客戶(hù)端的網(wǎng)頁(yè)中完成登錄/注冊。所以,假如注冊過(guò)程太過(guò)復雜繁瑣,不建議使用。
流程:
上述綁定流程集成了注冊的過(guò)程,所以看起來(lái)比較復雜。實(shí)現起來(lái)也沒(méi)有太大的難度,我們重點(diǎn)關(guān)注一下安全性方面的問(wèn)題,因為綁定賬戶(hù)涉及到用戶(hù)的信息安全,考慮兩個(gè)問(wèn)題:
1、如何防止鏈接被偽造
登錄/注冊的鏈接需要確保是我們自己的服務(wù)器生成的,其他人無(wú)法偽造??梢詤⒖嘉⑿诺尿炞C服務(wù)器地址的有效性:
http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html。
所以一個(gè)比較安全的登錄鏈接可以是這樣的:
http://api.hello1010.com/wechat/login.html?openid=x1&signature=x2×tamp=x3&nonce=x4&echostr&=x5
校驗簽名的代碼:
private function checkSignature(){ $openid = $_GET["openid"]; $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce, $openid); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; }}
token值可以跟自己的微信公眾號后臺的一致,也可以換一個(gè),建議換一個(gè)安全點(diǎn)。
2、如何確保openid是可信的
考慮這種場(chǎng)景:A用戶(hù)進(jìn)入登錄頁(yè)面,復制登錄鏈接到瀏覽器,把openid替換為B用戶(hù)的openid,使用A用戶(hù)的賬號密碼登錄。這樣就把A用戶(hù)的userid和B用戶(hù)的openid綁定在一起了,顯然是不安全的。
解決方案有很多,比如可以給openid加密,在加密方法保密的情況下,用戶(hù)無(wú)法偽造加密后的openid。假如不想給openid加密,可以在生成鏈接時(shí),在服務(wù)器端建立openid與簽名signature的對應關(guān)系,假如用戶(hù)篡改了openid就無(wú)法通過(guò)校驗。
記住,永遠不要輕信客戶(hù)端傳過(guò)來(lái)的信息。
擴展應用
完成綁定后,我們可以做一些簡(jiǎn)單的應用。比如,公司需要舉辦一個(gè)線(xiàn)下路演活動(dòng),該活動(dòng)需要報名才能參加,并且需要簽到。
這是一個(gè)典型的可以用微信實(shí)現的O2O例子。流程如下:
其中,“綁定用戶(hù)子流程”就是場(chǎng)景二中的流程。報名的交互在這里不再累述,每個(gè)業(yè)務(wù)都不一樣。
對于一個(gè)已經(jīng)完成綁定的用戶(hù),他參加一個(gè)活動(dòng),需要做的就是通過(guò)微信報名,然后掃描二維碼簽到,體驗相當流暢。
如有任何問(wèn)題,歡迎跟我交流!
聯(lián)系客服