第三方登陸有QQ、微信、微博、支付寶等等,若是如今本身的項目中實現這些登陸,便可以使用友盟的sdk,也能夠一個一個接入,各有各的有點,這裏不作贅述。git
今天和你們分享的是,在項目中實現微信登陸,雖然微信官網給出了接入文檔,可是我在接入的過程當中,遇到一些問題,在此作出總結以便你們參考。主要講微信snsapi_base靜默受權與snsapi_userinfo網頁受權的實現。github
關注 【網羅開發】微信公衆號,網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!api
移動應用微信登陸是基於OAuth2.0標準協議構建的微信OAuth2.0受權登陸系統。bash
在進行微信OAuth2.0受權登陸接入以前,須要完成一下工做才能夠開始介接入:服務器
微信OAuth2.0受權登陸目前支持authorization_code模式,適用於擁有server端的應用受權。該模式總體流程爲:微信
獲取access_token時序圖:網絡
網頁受權:app
req.scope = @"snsapi_userinfo";
複製代碼
靜默受權:post
req.scope = @"snsapi_base";
複製代碼
snsapi_base與snsapi_userinfo屬於微信網頁受權獲取用戶信息的兩種做用域:微信支付
snsapi_base只能獲取access_token和openID
snsapi_userinfo能夠獲取更詳細的用戶資料,好比頭像、暱稱、性別等
再登陸按鈕的點擊事件中寫入一下代碼:
//構造SendAuthReq結構體
SendAuthReq* req =[[[SendAuthReq alloc]init]autorelease];
req.scope = @"snsapi_userinfo";
req.state = @"123";
//第三方向微信終端發送一個SendAuthReq消息結構
[WXApi sendReq:req];
複製代碼
在AppDelegate的didFinishLaunchingWithOptions方法中註冊:
[WXApi registerApp:@"wx1234567890"];
複製代碼
"wx1234567890"爲appid,請更換爲本身項目的appid
拉起微信打開受權登陸頁以下圖:
點擊確認登錄,受權後回調 WXApiDelegate
-(void)onResp:(BaseReq *)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 微信用戶當前國家信息
*/
if ([resp isKindOfClass:[SendAuthResp class]]) //判斷是否爲受權請求,不然與微信支付等功能發生衝突
{
SendAuthResp *aresp = (SendAuthResp *)resp;
if (aresp.errCode== 0)
{
NSLog(@"code %@",aresp.code);
[[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];
}
}
}
複製代碼
使用通知,將aresp.code傳遞到登陸頁面
在登陸頁面經過通知,獲取到code以後,請求如下連接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&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"
}
複製代碼
參數說明:
Appsecret 是應用接口使用密鑰,泄漏後將可能致使應用數據泄漏、應用的用戶數據泄漏等高風險後果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);
access_token 爲用戶受權第三方應用發起接口調用的憑證(至關於用戶登陸態),存儲在客戶端,可能出現惡意獲取access_token 後致使的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行爲;
refresh_token 爲用戶受權第三方應用的長效憑證,僅用於刷新access_token,但泄漏後至關於access_token 泄漏,風險同上。
到這裏同時得到access_token和openid,靜默受權與網頁受權操做都是同樣的。根據官網文檔,網頁受權還能夠進一步操做,獲取用戶更多詳細信息。
此接口用於獲取用戶我的信息,開發者可經過OpenID來獲取用戶基本信息,接口以下:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
複製代碼
參數說明:
正確的Json返回結果:
{
"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"
}
複製代碼
在第3步經過snsapi_base,同時得到access_token和openid,
把這裏的access_token和openid用於下面接口中:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
複製代碼
參數說明:
Json返回結果和snsapi_userinfo下獲取的用戶詳情同樣。
可是這個方法的前提是同一個公衆號內,用戶關注了,若是是其餘公衆號,仍是須要用戶點擊受權的。
但願能夠幫助你們,若有問題可加QQ技術交流羣: 668562416 若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,通過受權方可轉載,謝謝
本篇已同步到我的博客:FBY展菲
歡迎關注個人公衆號:網羅開發