微信網頁開發之獲取使用者unionID的兩種方法--基於微信的多點登入使用者識別
假設網站A有以下功能需求:1,pc端微信掃碼登入;2,微信瀏覽器中的靜默登入功能需求,這兩種需求就需要用到使用者的unionID,這樣才能在多個登入點(終端)識別使用者。那麼這兩種需求下使用者的unionID該如何獲取呢?
1,先看pc端的解決方案
以snsapi_login為scope發起網頁授權,先拿網站應用的appid和secret用授權介面獲取“網頁授權access_token”,再利用“網頁授權access_token”通過“拉取使用者資訊的api介面”拉取使用者資訊從而獲得unionId。
此方法適合場景:在不使用微信公眾號(訂閱號、服務號)的情況下,通過微信開放平臺下的網站應用來實現pc端網站的微信掃碼登入功能。這個場景需求相對來說比較簡單,可參考按照微信開放平臺的技術文件“網站應用”--“微信登入功能”一節來實現編碼,下面只把使用者掃描二維碼授權微信登入(使用者掃描二維碼並在微信客戶端彈出的授權視窗點選確認登入後)後如何獲取unionID的方法和過程描述下。
使用者授權登入後重定向到網站A的登入頁,並帶回code和state引數。先拿code獲取網頁授權access_token:
1 $curl = new Curl(); 2 $wxresponse = $curl->get('https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid 3 . '&secret=' . $secret . '&code=' . $code . '&grant_type=authorization_code');4 $wxresult = json_decode($wxresponse);
請求引數說明:
1 引數 是否必須 說明 2 appid 是 應用唯一標識,在微信開放平臺提交應用稽核通過後獲得 3 secret 是 應用金鑰AppSecret,在微信開放平臺提交應用稽核通過後獲得 4 code 是 填寫第一步獲取的code引數 5 grant_type 是 填authorization_code
如果請求正確,返回值:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" } 引數 說明 access_token 介面呼叫憑證 expires_in access_token介面呼叫憑證超時時間,單位(秒) refresh_token 使用者重新整理access_token openid 授權使用者唯一標識 scope 使用者授權的作用域,使用逗號(,)分隔
可以看到除access_token外,還可以獲得openid。
然後用拿到的access_token和openid獲取unionID:
1 //獲取使用者個人資訊 2 $response = $curl->get('https://api.weixin.qq.com/sns/userinfo?access_token=' . $wxresult->access_token 3 . '&openid=' . $wxresult->openid);
返回值就不詳細寫了,其中就有使用者的unionID。
2,再看手機端微信瀏覽器的解決方案
方法一:以snsapi_userinfo為scope發起網頁授權,獲取unionID過程與pc端的相同,但要用到微信公眾號中的服務號appid和secret獲取網頁授權access_token。
1 // 使用者是從微信訪問此頁面,直接呼叫微信驗證 2 header('Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid 3 . '&redirect_uri=http%3A%2F%2Fwww.host.com%2Fsite%2Fcallback' 4 . '&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect'); 5 exit;
這種方法在微信瀏覽器中的體驗並不好,因為當用戶在微信瀏覽器中瀏覽網頁時點選了某個網頁觸發登入功能時會彈出授權視窗,而比較好的體驗應該是,使用者觸發登入功能時應該是無感知的,下面的方法二就可以實現這種需求。
方法二:以snsapi_base為scope發起網頁授權,先用公眾號的appid和secret獲取微信公眾號的全域性唯一憑證access_token,然後用拿到的access_token呼叫公眾號的“使用者管理介面”中的“獲取使用者資訊介面”獲得unionID。
發起授權請求,因為以snsapi_base為scope發起網頁授權請求,所以授權是靜默的,使用者是無感知的,微信公眾平臺開發文件網頁授權一節中有說明。
1 header('Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid 2 . '&redirect_uri=http%3A%2F%2Fwww.host.com%2Fsite%2Fcallback' 3 . '&response_type=code&scope=snsapi_base&state=state#wechat_redirect'); 4 exit;
獲取公眾號全域性唯一access_token
$curl = new Curl(); $curl->setOption(CURLOPT_SSL_VERIFYPEER, false); $tokenresult = $curl->get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $secret);
如果請求正確的話,返回值:
1 {"access_token":"ACCESS_TOKEN","expires_in":7200} 2 3 引數 說明 4 access_token 獲取到的憑證 5 expires_in 憑證有效時間,單位:秒
呼叫公眾號“獲取使用者資訊介面”:
1 $response = $curl->get('https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $token . '&openid=' . $wxresult->openid . '&lang=zh_CN');
如果正確的話,返回值示例:
1 { 2 "subscribe": 1, 3 "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 4 "nickname": "Band", 5 "sex": 1, 6 "language": "zh_CN", 7 "city": "廣州", 8 "province": "廣東", 9 "country": "中國", 10 11 "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4 12 13 eMsv84eavHiaiceqxibJxCfHe/0", 14 "subscribe_time": 1382694957, 15 "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" 16 "remark": "", 17 18 "groupid": 0, 19 20 "tagid_list":[128,2] 21 } 22 23 引數說明 24 引數 說明 25 subscribe 使用者是否訂閱該公眾號標識,值為0時,代表此使用者沒有關注該公眾號,拉取不到其餘資訊。 26 openid 使用者的標識,對當前公眾號唯一 27 nickname 使用者的暱稱 28 sex 使用者的性別,值為1時是男性,值為2時是女性,值為0時是未知 29 city 使用者所在城市 30 country 使用者所在國家 31 province 使用者所在省份 32 language 使用者的語言,簡體中文為zh_CN 33 headimgurl 使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空。若使用者更換頭像,原有頭像URL將失效。 34 subscribe_time 使用者關注時間,為時間戳。如果使用者曾多次關注,則取最後關注時間 35 unionid 只有在使用者將公眾號繫結到微信開放平臺帳號後,才會出現該欄位。 36 remark 公眾號運營者對粉絲的備註,公眾號運營者可在微信公眾平臺使用者管理介面對粉絲新增備註 37 groupid 使用者所在的分組ID(相容舊的使用者分組介面) 38 tagid_list 使用者被打上的標籤ID列表
3,總結
使用者無論從pc端登入網站還是從微信瀏覽器中訪問網站,我們都能獲取unionID,從而實現了多點登入的使用者識別。
完