假設網站A有以下功能需求:1,pc端微信掃碼登錄;2,微信瀏覽器中的靜默登錄功能需求,這兩種需求就需要用到用戶的unionID,這樣才能在多個登錄點(終端)識別用戶。那麼這兩種需求下用戶的unionID該如何獲取呢? 1,先看pc端的解決方案 以snsapi_login為scope發起網頁授權,先拿 ...
假設網站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,從而實現了多點登錄的用戶識別。
完