現在很多網站都已經建立了一套完整的多用户賬號體系,基於這套體系,再做其他應用的多用户擴充套件就非常方便。例如,有了微軟的 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 微信報名,然後掃描二維碼簽到,體驗相當流暢。