標簽(空格分隔): iOS
- 我的計劃
1.使用微信SDK實現微信第三方登錄
2.使用友盟實現第三方登錄
3.使用openShare實現第三方登錄
微信第三方登錄文檔
網址
- 這篇文章的最終目的是獲取access_token 和微信用戶信息
- 第三方發起微信授權登錄請求,微信用戶允許授權第三方應用后,微信會拉起應用或重定向到第三方網站,并且帶上授權臨時票據code參數;
- 通過code參數加上AppID和AppSecret等,通過API換取access_token;
- 通過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操作。
總結:code+AppID+AppSecret --->access_token
scope(授權域):
snsapi_message:幫助你通過該應用向好友發送消息
snsapi_userinfo:獲得你的公開信息(昵稱,頭像等)
snsapi_friend:尋找與你共同使用該應用的好友
snsapi_contact:獲得你的好友關系-
第一步:獲取 code 超時時間為10分鐘
-(void)sendAuthRequest { //構造SendAuthReq結構體 SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ]; req.scope = @"snsapi_userinfo" ; req.state = @"123" ; //第三方向微信終端發送一個SendAuthReq消息結構 [WXApi sendReq:req]; //或者用下面的方法 //[WXApi sendAuthReq:req viewController:self delegate:self]; }
*參數說明:* appid 必須 應用唯一標識,在微信開放平臺提交應用審核通過后獲得 scope 必須 應用授權作用域,如獲取用戶個人信息則填寫snsapi_userinfo state 非必須 用于保持請求和回調的狀態,授權請求后原樣帶回給第三方。該參數可用于防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上該參數,可設置為簡單的隨機數加session進行校驗 *返回參數:* ``` appid: wxd477edab60670232 scope: snsapi_userinfo state: wechat_sdk_demo ```
微信用戶授權授權登錄
用戶授權后,得到數據 ``` ErrCode ERR_OK = 0(用戶同意) ERR_AUTH_DENIED = -4(用戶拒絕授權) ERR_USER_CANCEL = -2(用戶取消) code 用戶換取access_token的code,僅在ErrCode為0時有效 state 第三方程序發送時用來標識其請求的唯一性的標志,由第三方程序調用sendReq時傳入,由微信終端回傳,state字符串長度不能超過1K lang 微信客戶端當前語言 country 微信用戶當前國家信息 ```
-
獲取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 當且僅當該移動應用已獲得該用戶的userinfo授權時,才會出現該字段 錯誤返回 {"errcode":40029,"errmsg":"invalid code"}
刷新access_token有效期
如果用戶量不是很大,就不用考慮access_token的有效期,每次都讓他們從頭登錄一次行,我的demo中就沒有考慮這種情況
access_token:2小時有效期
refresh_token:30天有效期
1. 若access_token已超時,那么進行refresh_token會獲取一個新的access_token,新的超時時間;
2. 若access_token未超時,那么進行refresh_token不會改變access_token,但超時時間會刷新,相當于續期access_token。開始刷新access_token有效期:
接口
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
參宿如下:
appid 是 應用唯一標識
grant_type 是 填refresh_token
refresh_token 是 填寫通過access_token獲取到的refresh_token參數返回說明:
{
"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 用戶授權的作用域,使用逗號(,)分隔
錯誤返回:{"errcode":40030,"errmsg":"invalid refresh_token"}
注意:
1、Appsecret 是應用接口使用密鑰,泄漏后將可能導致應用數據泄漏、應用的用戶數據泄漏等高風險后果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);
2、access_token 為用戶授權第三方應用發起接口調用的憑證(相當于用戶登錄態),存儲在客戶端,可能出現惡意獲取access_token 后導致的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行為;
3、refresh_token 為用戶授權第三方應用的長效憑證,僅用于刷新access_token,但泄漏后相當于access_token 泄漏,風險同上。
建議將Appsecret、用戶數據(如access_token)放在App云端服務器,由云端中轉接口調用請求。
-
.通過access_token調用接口
獲取access_token后,進行接口調用,有以下前提:- access_token有效且未超時;
- 微信用戶已授權給第三方應用帳號相應接口作用域(scope)
對于接口作用域(scope),能調用的接口有以下:
snsapi_base /sns/oauth2/access_token 通過code換取access_token、refresh_token和已授權scope /sns/oauth2/refresh_token 刷新或續期access_token使用 /sns/auth 檢查access_token有效性 snsapi_userinfo /sns/userinfo 獲取用戶個人信息
其中snsapi_base屬于基礎接口,若應用已擁有其它scope權限,則默認擁有snsapi_base的權限。使用snsapi_base可以讓移動端網頁授權繞過跳轉授權登錄頁請求用戶授權的動作,直接跳轉第三方網頁帶上授權臨時票據(code),但會使得用戶已授權作用域(scope)僅為snsapi_base,從而導致無法獲取到需要用戶授權才允許獲得的數據和基礎功能.
- .獲取用戶個人信息(UnionID機制)
接口
數據返回https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 參數 是否必須 說明 access_token 是 調用憑證 openid 是 普通用戶的標識,對當前開發者帳號唯一 lang 否 國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語,默認為zh-CN
{ "openid":"OPENID", "nickname":"NICKNAME", "sex":1, "province":"PROVINCE", "city":"CITY", "country":"COUNTRY", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", "privilege":[ "PRIVILEGE1", "PRIVILEGE2" ], "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" } 參數 說明 openid 普通用戶的標識,對當前開發者帳號唯一 nickname 普通用戶昵稱 sex 普通用戶性別,1為男性,2為女性 province 普通用戶個人資料填寫的省份 city 普通用戶個人資料填寫的城市 country 國家,如中國為CN headimgurl 用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空 privilege 用戶特權信息,json數組,如微信沃卡用戶為(chinaunicom) unionid 用戶統一標識。針對一個微信開放平臺帳號下的應用,同一用戶的unionid是唯一的。