第三方微信登陸 | 靜默受權與網頁受權的實現

一:介紹

第三方登陸有QQ、微信、微博、支付寶等等,若是如今本身的項目中實現這些登陸,便可以使用友盟的sdk,也能夠一個一個接入,各有各的有點,這裏不作贅述。git

今天和你們分享的是,在項目中實現微信登陸,雖然微信官網給出了接入文檔,可是我在接入的過程當中,遇到一些問題,在此作出總結以便你們參考。主要講微信snsapi_base靜默受權與snsapi_userinfo網頁受權的實現。github

關注 【網羅開發】微信公衆號,網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!api

二:準備工做

移動應用微信登陸是基於OAuth2.0標準協議構建的微信OAuth2.0受權登陸系統。bash

在進行微信OAuth2.0受權登陸接入以前,須要完成一下工做才能夠開始介接入:服務器

  1. 在微信開放平臺註冊開發者賬號;
  2. 擁有一個已審覈經過的移動應用;
  3. 並得到相應的AppID和AppSecret;
  4. 申請微信登陸且經過審覈。

三:受權流程

微信OAuth2.0受權登陸目前支持authorization_code模式,適用於擁有server端的應用受權。該模式總體流程爲:微信

  1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
  2. 經過code參數加上AppID和AppSecret等,經過API換取access_token;
  3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。

獲取access_token時序圖:網絡

h.png

四:靜默受權與網頁受權的實現

1. 靜默受權與網頁受權的區別

網頁受權:app

req.scope = @"snsapi_userinfo";
複製代碼

靜默受權:post

req.scope = @"snsapi_base";
複製代碼

snsapi_base與snsapi_userinfo屬於微信網頁受權獲取用戶信息的兩種做用域:微信支付

snsapi_base只能獲取access_token和openID

snsapi_userinfo能夠獲取更詳細的用戶資料,好比頭像、暱稱、性別等

2. 獲取CODE

再登陸按鈕的點擊事件中寫入一下代碼:

//構造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傳遞到登陸頁面

3. 經過code獲取access_token

在登陸頁面經過通知,獲取到code以後,請求如下連接獲取access_token:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
複製代碼

參數說明:

  • 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受權時,纔會出現該字段

4. 注意:

  1. 建議將Appsecret、用戶數據(如access_token)放在App雲端服務器,由雲端中轉接口調用請求:
  • Appsecret 是應用接口使用密鑰,泄漏後將可能致使應用數據泄漏、應用的用戶數據泄漏等高風險後果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);

  • access_token 爲用戶受權第三方應用發起接口調用的憑證(至關於用戶登陸態),存儲在客戶端,可能出現惡意獲取access_token 後致使的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行爲;

  • refresh_token 爲用戶受權第三方應用的長效憑證,僅用於刷新access_token,但泄漏後至關於access_token 泄漏,風險同上。

  1. 要注意網絡受權網頁受權access_token 與 普通access_token的區別:
  • 網頁受權的access_token在每次獲取openID時一塊兒更新,在接口調用頻次限制中爲「無上限」;
  • 普通access_token通常限制爲2000次/日,須要本身保存起來並定時更新。

到這裏同時得到access_token和openid,靜默受權與網頁受權操做都是同樣的。根據官網文檔,網頁受權還能夠進一步操做,獲取用戶更多詳細信息。

5. 獲取用戶我的信息(UnionID機制)

此接口用於獲取用戶我的信息,開發者可經過OpenID來獲取用戶基本信息,接口以下:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
複製代碼

參數說明:

  • access_token:調用憑證
  • 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"
}
複製代碼

6. 靜默受權獲取到用戶詳細資料

在第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 
複製代碼

參數說明:

  • access_token:調用憑證
  • openid:普通用戶的標識,對當前開發者賬號惟一
  • lang:國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語,默認爲zh-CN

Json返回結果和snsapi_userinfo下獲取的用戶詳情同樣。

可是這個方法的前提是同一個公衆號內,用戶關注了,若是是其餘公衆號,仍是須要用戶點擊受權的。

但願能夠幫助你們,若有問題可加QQ技術交流羣: 668562416 若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議

如需轉載請聯繫我,通過受權方可轉載,謝謝

本篇已同步到我的博客:FBY展菲


歡迎關注個人公衆號:網羅開發

相關文章
相關標籤/搜索