現在很多網站都已經建立了一套完整的多使用者賬號體系,基於這套體系,再做其他應用的多使用者擴充套件就非常方便。例如,有了微軟的 outlook 賬戶,就可以登入 win8,可以登入微軟的郵箱,還可以登入 skype 。同樣地,一個 WordPress APPle ID 可以享受蘋果的所有服務。正所謂,一個賬號,處處使用。   對於企業,可能會有產品線通常有網站,WordPress APP,WordPress 微信公眾號等。統一各產品線的賬號體系,實現一個賬號處處使用的目標是非常有必要的。網站和 WordPress APP 使用同一個賬號,不需要做任何多餘的工作,客戶只要有多使用者名稱稱密碼即可登入。對於 WordPress 微信公眾號,由於它是基於 WordPress 微信公眾平臺的一個應用,需要遵守平臺的規則,所以需要做一些額外的工作才能達到賬號互通的目標。   接下來我們就來討論一下,如何做到 WordPress 微信公眾號多使用者與網站多使用者的賬號體系無縫對接。   當多使用者關注 WordPress 微信公眾號後,會有一些互動,互動過程中可能需要獲取到多使用者的身份資訊(對應到網站的賬戶資訊),例如在公眾號中下單,查詢訂單等操作。那麼現在問題來了:對於同一個多使用者,我們如何建立 WordPress 微信公眾號多使用者(openid)與網站多使用者(userid)之間的對應關係。這個過程我們稱之為繫結。   WordPress 微信賬號繫結   為了簡化討論,我總結了這樣兩個場景:   一、多使用者已註冊成為我們的網站多使用者,但還未關注我們的 WordPress 微信公眾號;   二、多使用者未註冊,但已關注我們的 WordPress 微信公眾號。   對於以上兩種情況,下面分別討論。   場景一   多使用者已註冊成為我們的網站多使用者,但還未關注我們的 WordPress 微信公眾號。如何方便多使用者關注公眾號,同時又能把多使用者和 WordPress 微信公眾號繫結在一起呢?很自然地就可以想到二維碼這個入口。   近幾年,二維碼的應用特別廣泛。 WordPress 微信對二維碼的推廣及應用可以說是如魚得水,WordPress 微信二維碼支付,WordPress 微信二維碼登入,WordPress 微信二維碼名片等等。可以說,二維碼已經成為 WooCommerce O2O 中連線線上線下的重要紐帶。小馬哥也稱” 二維碼是線上線下的一個關鍵入口” 。   在這裡,需要多使用者在網站上先登入,然後在合適的地方給出一個繫結入口,比如在個人設定裡。繫結流程如下:   WordPress 微信賬號繫結流程   這裡需要用到 WordPress 微信的二維碼生成功能:http://mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html   關於 WordPress 微信二維碼,官方檔案中這樣說:   目前有 2 種型別的二維碼,分別是臨時二維碼和永久二維碼,前者有過期時間,有效期 30 天(2592000 秒),但能夠生成較多數量,後者無過期時間,數量較少(目前引數只支援 1–100000,即 10 萬個)。兩種二維碼分別適用於帳號繫結、多使用者來源統計等場景。   顯然,我們使用臨時二維碼比較合適。每當多使用者重新整理頁面時,都可以生成一次。   由於二維碼裡可以帶有場景值(scene_id),當多使用者掃描帶有場景值的二維碼後,WordPress 微信伺服器會把場景值推送給我們自己的伺服器,我們拿到場景值後,就可以做驗證和繫結邏輯。注意:生成二維碼需要認證後的服務號。   一次完整的繫結流程應該是這樣的:   ①多使用者登入網頁,點選 “繫結 WordPress 微信賬戶”;   ②後臺使用 WordPress 微信介面,生成二維碼連結返回給前端顯示,並建立場景值 A 與多使用者的對應關係;   ③多使用者掃描二維碼,並點選關注 WordPress 微信公眾號(假如已關注,直接跳到④);   ④後臺接收 WordPress 微信伺服器推送的場景值 A;   ⑤後臺根據場景值 A,查詢到對應的多使用者 ID(依賴於②中建立的對應關係);   ⑥建立多使用者 userid 與 WordPress 微信多使用者 openid 的對應關係;   ⑦給多使用者的 WordPress 微信客戶端推送 “繫結成功” 的提示;   ⑧通知前臺頁面,繫結已完成,重新整理頁面,並返回一些 WordPress 微信賬戶資訊。完成繫結。   其中,②中,“建立場景值 A 與多使用者之間的對應關係”,因為多使用者已經登入,所以多使用者點選 “繫結 WordPress 微信賬戶” 時,我們可以在後臺分配一個臨時場景值 A 與多使用者 ID 之間的對於關係。對於多使用者量不大的網站,可以直接使用 php 中的 apc 來快取,並設定一個過期時間(與臨時二維碼過期時間設定成一樣即可)。不要使用 session 來儲存這種對應關係,因為④中是 WordPress 微信的推送事件,是不帶 session 資訊的,可以使用 redis 這類快取或 DB 來儲存。另,這裡要使用臨時二維碼,數量上沒有限制,只有時間限制,前臺定時重新整理即可。   ⑧中,因為 http 沒有推送機制,所以簡單的方法就是輪詢去查詢,是否已經完成繫結,完成繫結後再重新整理頁面。   完成繫結後,多使用者再跟我們的 WordPress 微信公眾號互動時,根據 openid 可以找到對應的 userid,即完成身份識別。對於之前提到的下單,查詢訂單,都是可以實現的。   整個繫結過程並不複雜,實現起來也沒有太大的技術難度,關鍵的是思路。   上述流程是多使用者已經在網頁端登入了,也就是說已經註冊多使用者。對於沒有登入的情況,我們也可以做,在登入頁面生成一個二維碼,讓多使用者用 WordPress 微信掃一掃。假如多使用者已經註冊,則可以自動登入,並完成網站賬號和 WordPress 微信賬號的繫結;假如多使用者沒有註冊,則網頁跳轉到繫結賬號頁面,只要多使用者輸入郵箱密碼快速註冊,同時也完成了網站賬號和 WordPress 微信多使用者的繫結。實現技術方案跟上述類似。   場景二   場景二,對於多使用者來說操作略微複雜,因為它需要多使用者在 WordPress 微信客戶端的網頁中完成登入/註冊。所以,假如註冊過程太過複雜繁瑣,不建議使用。   流程:   多使用者繫結賬戶流程   上述繫結流程整合了註冊的過程,所以看起來比較複雜。實現起來也沒有太大的難度,我們重點關注一下安全性方面的問題,因為繫結賬戶涉及到多使用者的資訊保安,考慮兩個問題:   1 、如何防止連結被偽造   登入/註冊的連結需要確保是我們自己的伺服器生成的,其他人無法偽造。可以參考 WordPress 微信的驗證伺服器地址的有效性:   http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 。   所以一個比較安全的登入連結可以是這樣的:   http://api.hello1010.com/wechat/login.html?openid=x1&signature=x2×tamp=x3&nonce=x4&echostr&=x5   校驗簽名的程式碼:   token 值可以跟自己的 WordPress 微信公眾號後臺的一致,也可以換一個,建議換一個安全點。   2 、如何確保 openid 是可信的   考慮這種場景:A 多使用者進入登入頁面,複製登入連結到瀏覽器,把 openid 替換為 B 多使用者的 openid,使用 A 多使用者的賬號密碼登入。這樣就把 A 多使用者的 userid 和 B 多使用者的 openid 繫結在一起了,顯然是不安全的。   解決方案有很多,比如可以給 openid 加密,在加密方法保密的情況下,多使用者無法偽造加密後的 openid 。假如不想給 openid 加密,可以在生成連結時,在伺服器端建立 openid 與簽名 signature 的對應關係,假如多使用者篡改了 openid 就無法透過校驗。   記住,永遠不要輕信客戶端傳過來的資訊。   擴充套件應用   完成繫結後,我們可以做一些簡單的應用。比如,公司需要舉辦一個線下路演活動,該活動需要報名才能參加,並且需要簽到。   這是一個典型的可以用 WordPress 微信實現的 WooCommerce O2O 例子。流程如下:   線下路演簽到流程   其中,“繫結多使用者子流程” 就是場景二中的流程。報名的互動在這裡不再累述,每個業務都不一樣。   對於一個已經完成繫結的多使用者,他參加一個活動,需要做的就是透過 WordPress 微信報名,然後掃描二維碼簽到,體驗相當流暢。