原文網址:http://hello1010.com/bind-wechat/
二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規律在平面上(按一定規律在平面上(二維方向上)分佈的黑白相間的圖形記錄資料符號資訊的;在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數值訊息,透過圖象輸入設備或光電掃描設備自動識讀以實現訊息自動處理
近年來,二維碼的應用特別廣泛。微信對二維碼的推廣及應用可以說是如魚得水,微信二維碼支付,微信二維碼登錄,微信二維碼名片等等。可以說,二維碼已經成為 O2O中連接線上線下的重要連結。小馬哥也稱"二維碼是線上線下的一個關鍵入口"。
現在很多網站都已經建立起來自己的一套完整用戶帳號體系,在全民微信的時代,勢必要考慮開發和運營微信公眾號,不是為趕潮流,只為方便用戶,因為微信提供了O2O很好的解決方案,更重要的是,微信具有一個良性的並且不斷完善的生態鏈。
當用戶關注微信公眾號後,會有一些交互,交互過程中可能需要獲取到用戶的身份信息(對應到網站的帳戶信息),例如在公眾號中下單,查詢訂單等操作。那麼現在問題來了:對於同一個用戶,我們如何建立微信公眾號用戶(openid)與網站用戶(userid)之間的對應關係。這個過程我們稱之為綁定。
為了簡化討論,我總結了這樣兩個場景:
為了簡化討論,我總結了這樣兩個場景:
號碼; 二、用戶未註冊,但已關注我們的微信公眾號。
對於以上兩種情況,以下分別討論。
場景一
用戶已註冊成為我們的網站用戶,但還未關注我們的微信公眾號。在這裡,需要用戶在網站上先登錄,然後在合適的地方給出一個綁定入口,例如在個人設定中。綁定流程如下:
這裡需要用到微信的二維碼產生功能:產生參數的二維碼
:目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過期時間,最大為1800秒,但能夠產生較多數量,後者無過期時間,數量較少(目前參數只支援1--100000)。兩種二維碼分別適用於帳號綁定、使用者來源統計等場景。
顯然,我們使用臨時二維碼比較合適。每當使用者刷新頁面時,都可以產生一次。 由於二維碼裡可以帶有場景值(scene_id),當用戶掃描帶有場景值的二維碼後,微信伺服器會把場景值推送給我們自己的伺服器,我們拿到場景值後,就可以做驗證和綁定邏輯。
注意:產生二維碼需要認證後的服務號碼。
一次完整的綁定流程應該是這樣的:
①用戶登錄網頁,點擊「綁定微信帳戶」;
②後台使用微信介面,產生二維碼連結給,並建立場景值A與用戶的對應關係;
③用戶掃描二維碼,並點擊關注微信公眾號(假如已關注,直接跳到④);
④後台接收微信伺服器推送的場景值A;
⑤後台根據場景值A,查詢對應的使用者ID(依賴②中建立的對應關係); ⑥建立使用者userid與微信使用者openid的對應關係; ⑦給予使用者的微信客戶端推送「綁定成功」的提示;
🎜其中,②中,“建立場景值A與用戶之間的對應關係”,因為用戶已經登錄,所以用戶點擊“綁定微信帳戶”時,我們可以在後台分配一個臨時場景值A與用戶ID之間的對於關係。對於使用者量不大的網站,可以直接使用php中的apc來緩存,並設定一個過期時間(與臨時二維碼過期時間設定成一樣即可)。 🎜🎜
⑧中,因為http沒有推送機制,所以最簡單的方法就是輪詢查詢,是否已經完成綁定,完成綁定後再刷新頁面。
完成綁定後,用戶再跟我們的微信公眾號互動時,根據openid可以找到對應的userid,即完成識別。對於之前提到的下單,查詢訂單,都是可以實現的。
整個綁定過程並不複雜,實現起來也沒有太大的技術難度,最關鍵的是思路。
場景二
場景二,對於使用者來說操作略微複雜,因為它需要使用者在微信客戶端的網頁中完成登入/註冊。所以,如果註冊過程太過複雜繁瑣,不建議使用。
流程:
上述綁定流程整合了註冊的流程,所以看起來比較複雜。實現起來也沒有太大的難度,我們重點關註一下安全性方面的問題,因為綁定帳戶涉及到用戶的資訊安全,考慮兩個問題:
1、如何防止連結被偽造
登入/註冊的連結需要確保是我們自己的伺服器產生的,其他人無法偽造。可以參考微信的驗證伺服器位址的有效性。所以一個比較安全的登入連結可以是這樣的:
http://api.hello1010.com/wechat/login.html?openid=x1&signature=x2×tamp=x3&nonce=x4&echostr&=x5的代碼:
<code><span>private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } </span></code>token值可以跟自己的微信公眾號後台的一致,也可以換一個,建議換一個安全點。
2、如何確保openid是可信的
考慮這種場景:A用戶進入登入頁面,複製登入連結到瀏覽器,把openid替換為B用戶的openid,使用A用戶的帳號密碼登入.這樣就把A用戶的userid和B用戶的openid綁在一起了,顯然是不安全的。
解決方案很多,例如可以將openid加密,在加密方法保密的情況下,使用者無法偽造加密後的openid。假如不想給openid加密,可以在產生連結時,在伺服器端建立openid與簽章signature的對應關係,如果使用者竄改了openid就無法通過校驗。
記住,永遠不要輕信客戶端傳過來的訊息。
擴充應用
完成綁定後,我們可以做一些簡單的應用。例如,公司需要舉辦一個線下路演活動,該活動需要報名才能參加,並且需要簽到。
這是一個典型的可以用微信實現的O2O例子。流程如下:
其中,「綁定使用者子流程」就是場景二中的流程。報名的交互在這裡不再累述,每個業務都不一樣。
對於一個已經完成綁定的用戶,他參加一個活動,需要做的就是透過微信報名,然後掃描二維碼簽到,體驗相當流暢。
如有任何問題,歡迎跟我交流!
以上就介紹了微信帳戶綁定,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。