準備工作
移動應用微信登錄是基於OAuth2.0協議標準 構建的微信OAuth2.0授權登錄系統。
在進行微信OAuth2.0授權登錄接入之前,在微信開放平臺註冊開發者帳號,並擁有一個已審覈通過的移動應用,並獲得相應的AppID和AppSecret,申請微信登錄且通過審覈後,可開始接入流程。
1、目前移動應用上微信登錄只提供原生的登錄方式,需要用戶安裝微信客戶端才能配合使用。
2、對於Android應用,建議總是顯示微信登錄按鈕,當用戶手機沒有安裝微信客戶端時,請引導用戶下載安裝微信客戶端。
3、對於iOS應用,考慮到iOS應用商店審覈指南中的相關規定,建議開發者接入微信登錄時,先檢測用戶手機是否已安裝微信客戶端(使用sdk中isWXAppInstalled函數 ),對未安裝的用戶隱藏微信登錄按鈕,只提供其他登錄方式(比如手機號註冊登錄、遊客登錄等)
授權流程說明
微信OAuth2.0授權登錄讓微信用戶使用微信身份安全登錄第三方應用或網站,在微信用戶授權登錄已接入微信OAuth2.0的第三方應用後,第三方可以獲取到用戶的接口調用憑證(access_token),通過access_token可以進行微信開放平臺授權關係接口調用,從而可實現獲取微信用戶基本開放信息和幫助用戶實現基礎開放功能等。
微信OAuth2.0授權登錄目前支持authorization_code模式,適用於擁有server端的應用授權。該模式整體流程爲:
1. 第三方發起微信授權登錄請求,微信用戶允許授權第三方應用後,微信會拉起應用或重定向到第三方網站,並且帶上授權臨時票據code參數;
2. 通過code參數加上AppID和AppSecret等,通過API換取access_token;
3. 通過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操作。
第一步.請求code
移動應用微信授權登錄
開發者需要配合使用微信開放平臺提供的SDK進行授權登錄請求接入。正確接入SDK後並擁有相關授權域(scope,什麼是授權域?)權限後,開發者移動應用會在終端本地拉起微信應用進行授權登錄,微信用戶確認後微信將拉起開發者移動應用,並帶上授權臨時票據(code)。
1、向微信開放平臺請求授權碼code,可拉起微信並打開授權登錄頁(前提是你安裝了微信應用並已登錄,未登錄的會引導你先登錄)
2、用戶點擊授權後,微信客戶端會被拉起,跳轉至授權界面,用戶在該界面點擊允許或取消
3、客戶端收到授權碼後,向自己的服務器發起登錄請求,並附帶收到的授權碼。
4、服務端收到登錄請求,向微信開放平臺請求獲取access_token,微信開放平臺返回Json字符串
參數說明:
appid 必填 應用唯一標識,在微信開放平臺提交應用審覈通過後獲得
scope 必傳 應用授權作用域,如獲取用戶個人信息則填寫snsapi_userinfo
state 非必傳 用於保持請求和回調的狀態,授權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗
返回示例:
ppid: wxd477edab60670232
scope: snsapi_userinfo
state: wechat_sdk_demo
返回說明
用戶點擊授權後,微信客戶端會被拉起,跳轉至授權界面,用戶在該界面點擊允許或取消,SDK通過SendAuth的Resp返回數據給調用方。
ErrCode ERR_OK = 0(用戶同意) ERR_AUTH_DENIED = -4(用戶拒絕授權) ERR_USER_CANCEL = -2(用戶取消)
code 用戶換取access_token的code,僅在ErrCode爲0時有效
state 第三方程序發送時用來標識其請求的唯一性的標誌,由第三方程序調用sendReq時傳入,由微信終端回傳,state字符串長度不能超過1K
lang 微信客戶端當前語言
country 微信用戶當前國家信息
第二步:通過code獲取access_token(在自己服務器端做)
獲取第一步的code後,請求以下鏈接獲取access_token:
參數:
appid 必傳 應用唯一標識,在微信開放平臺提交應用審覈通過後獲得
secret 必傳 應用密鑰AppSecret,在微信開放平臺提交應用審覈通過後獲得
code 必傳 填寫第一步獲取的code參數
grant_type 必傳 填authorization_code
響應:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
access_token 接口調用憑證
expires_in access_token 接口調用憑證超時時間,單位(秒)
refresh_token 用戶刷新access_token
openid 授權用戶唯一標識
scope 用戶授權的作用域,使用逗號(,)分隔
unionid 只有在用戶將公衆號綁定到微信開放平臺帳號後,纔會出現該字段。
第三步:通過access_token調用接口
通過第二步獲取到access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操作
參數:
1、access_token有效且未超時
2、微信用戶已授權給第三方應用帳號相應接口作用域(scope)
響應:
nickname 微信暱稱
openid=otzOK1N2RGS3gyb6Ka8o4D_K4gww
unionid=o1u0Gv_q9SDFaZrqarIpjnaPG9Hw
第四步.微信登錄及綁手機號
微信登錄判斷是否綁定手機號
如果未綁定接口返回is_bind爲false,進入幫手機號頁面,調綁定手機號接口
如果已綁定接口返回is_bind爲true,直接登錄成功,返回token
http://url/1.0/user/wechat/login
wechat_open_id=o1u0Gv_q9SDFaZrqarIpjnaPG9Hw
{"code":0,"msg":"成功","data":{"token":"","is_bind":false}}
綁定手機號
http://url/1.0/user/wechat/bind
captcha=123456&mobile=18221124104&wechat_avatar=&wechat_name=新仁類測試微信號???@¥&wechat_open_id=o1u0Gv_q9SDFaZrqarIpjnaPG9Hw
第五步:微信重複登錄
假設用戶已經獲得授權,則下次登錄時只需要驗證access_token是否有效,無效則重新獲取授權,有效則無需重新獲得授權。
1.用戶向自己的服務器請求登錄,登錄方式爲微信登錄,附帶上次登錄返回的的access_token
2.服務器收到用戶的登錄請求,向微信開放平臺發送access_token是否有效的驗證請求如下:
3.服務端獲取到新的access_token等信息,並返回給客戶端,客戶端成功登錄或者重新獲取授權。
第六步:測試用例
1、手機號登錄,授權、綁定微信成功,用戶微信信息檢測
2、手機登錄,已綁定微信,再次綁定此微信檢測
3、手機登錄,已綁定微信,再次綁定其它微信(未綁定手機號的)檢測
4、B用戶手機號登錄,微信A已被A用戶手機號綁定,B用戶綁定微信A檢測
5、微信登錄,授權、強制綁定手機號成功,用戶微信信息檢測
6、微信登錄,已綁定手機號,再次綁定此手機號檢測
7、微信登錄,已綁定手機號,再次綁定其他手機號(未綁定微信的)檢測
8、B用戶微信登錄,微信A已被A用戶手機號綁定,B用戶綁定A手機號檢測
9、賬號登錄,綁定微信檢測
10、微信登錄綁定手機號成功、手機號登錄綁定微信成功,數據庫更新wechat_name、wechat_avatar、wechat_open_id、is_bind_avatar
11、微信登錄綁定手機號成功、手機號登錄綁定微信成功,微信登錄、手機號登錄檢測
12、微信授權登錄成功,進入強制綁定手機號頁面
13、未安裝微信,進入登錄頁面,未顯示微信檢測
14、進入登錄頁面、進入app綁定微信頁面,刪除微信,點微信登錄、綁定微信檢測
15、微信登錄成功,進入綁定手機號頁面,刪除微信,綁定手機號檢測
16、未登錄微信、已登錄微信,微信登錄進入微信登錄頁面,再返回、綁定微信進入微信登錄頁,再返回檢測
17、弱網、斷網,微信登錄、綁定手機號、綁定微信檢測
18、微信授權、登錄失敗;綁定微信、綁定手機號失敗檢測