1. 程式人生 > >基於第三方微信授權登入的iOS程式碼分析

基於第三方微信授權登入的iOS程式碼分析

基於第三方的微信授權登入是之前筆者博文《QQ和新浪微博授權登入》的姊妹篇,微信已經深入到每一個APP的縫隙,最常用的莫過分享和登入了,接下來就以程式碼的形式來展開微信登入的相關說明,至於原理級別的oauth2.0認證體系請參考微信開放平臺的相關說明和圖示 https://open.weixin.qq.com/

三,微信登入授權開發:

1,到微信開發平臺註冊相關APP,現在是等待稽核成功後才能獲取到對應的key和secret;獲取成功後需要單獨申請開通登入和支付介面,如圖


2,和QQ類似,需要填寫Url Schemes,如demo中的wxd930ea5d5a258f4f ,然後引入相應framework;

3,在AppDelegate中註冊和實現授權後的回撥函式,程式碼如下:

  //向微信註冊
    [WXApi registerApp:kWXAPP_ID withDescription:@"weixin"];
//授權後回撥 <span style="font-family: Arial;">WXApiDelegate</span>
-(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	微信使用者當前國家資訊
    */    
    SendAuthResp *aresp = (SendAuthResp *)resp;
    if (aresp.errCode== 0) {
        NSString *code = aresp.code;
        NSDictionary *dic = @{@"code":code};
    }
}

//和QQ,新浪並列回撥控制代碼
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [TencentOAuth HandleOpenURL:url] ||
    [WeiboSDK handleOpenURL:url delegate:self] ||
    [WXApi handleOpenURL:url delegate:self];;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [TencentOAuth HandleOpenURL:url] ||
    [WeiboSDK handleOpenURL:url delegate:self] ||
    [WXApi handleOpenURL:url delegate:self];;
}

4,微信登入授權比較複雜,相比QQ,新浪多了幾步,簡單說就是需要三步,第一步,獲取code,這個用來獲取token,第二步,就是帶上code獲取token,第三步,根據第二步獲取的token和openid來獲取使用者的相關資訊;

下面用程式碼來實現:

第一步:code

- (IBAction)weixinLogin:(id)sender
{
    [self sendAuthRequest];
}

-(void)sendAuthRequest
{
    SendAuthReq* req =[[SendAuthReq alloc ] init];
    req.scope = @"snsapi_userinfo,snsapi_base";
    req.state = @"0744" ;
    [WXApi sendReq:req];
}
這裡獲取後會呼叫之前在AppDelegate裡面的對應oauthResp回撥,獲得得到的code。

第二步:token和openid

-(void)getAccess_token
{
    //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",kWXAPP_ID,kWXAPP_SECRET,self.wxCode.text];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
              /*
               {
               "access_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWiusJMZwzQU8kXcnT1hNs_ykAFDfDEuNp6waj-bDdepEzooL_k1vb7EQzhP8plTbD0AgR8zCRi1It3eNS7yRyd5A";
               "expires_in" = 7200;
               openid = oyAaTjsDx7pl4Q42O3sDzDtA7gZs;
               "refresh_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWi2ZzH_XfVVxZbmha9oSFnKAhFsS0iyARkXCa7zPu4MqVRdwyb8J16V8cWw7oNIff0l-5F-4-GJwD8MopmjHXKiA";
               scope = "snsapi_userinfo,snsapi_base";
               }
               */
                
                self.access_token.text = [dic objectForKey:@"access_token"];
                self.openid.text = [dic objectForKey:@"openid"];
              
            }
        });
    });
}

利用GCD來獲取對應的token和openID.

第三步:userinfo

-(void)getUserInfo
{
   // https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
    
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",self.access_token.text,self.openid.text];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                /*
                 {
                 city = Haidian;
                 country = CN;
                 headimgurl = "http://wx.qlogo.cn/mmopen/FrdAUicrPIibcpGzxuD0kjfnvc2klwzQ62a1brlWq1sjNfWREia6W8Cf8kNCbErowsSUcGSIltXTqrhQgPEibYakpl5EokGMibMPU/0";
                 language = "zh_CN";
                 nickname = "xxx";
                 openid = oyAaTjsDx7pl4xxxxxxx;
                 privilege =     (
                 );
                 province = Beijing;
                 sex = 1;
                 unionid = oyAaTjsxxxxxxQ42O3xxxxxxs;
                 }
                 */
                
                self.nickname.text = [dic objectForKey:@"nickname"];
                self.wxHeadImg.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dic objectForKey:@"headimgurl"]]]];

            }
        });

    });
}
執行到這一步就算完成了整個授權登入的功能,能把暱稱和頭像顯示出來,剩下的就是及時重新整理你的token,詳情可參考開發文件。

下面是登入成功後的QQ,新浪微博,微信的真機執行成功截圖:



評價:微信的開發文件相比容易理解和除錯,雖然沒有demo,但是文件比較詳細,所以可以在一定程度上減輕了開發的困難,但是相比之下微信的授權步驟比較麻煩,需要三步才能徹底獲取使用者資訊,這點沒有QQ和新浪微博簡潔,需要有一定的閱讀和程式碼功底,希望能給大家帶來幫助。

後記:微信授權登入是對QQ和新浪微博登入的姊妹篇,前兩者登入程式碼分析請參考上一篇博文,如需三種登入方式的demo原始碼,該demo只需換掉預設巨集定義和Url Schemes中預設的key即可正式使用,詳情請發Email:[email protected] ,特別注意demo不免費提供,需要支付一定金額,謝謝合作!

強烈推薦:

程式設計師面試必備軟體:IT面試寶典

相關推薦

基於第三方授權登入iOS程式碼分析

基於第三方的微信授權登入是之前筆者博文《QQ和新浪微博授權登入》的姊妹篇,微信已經深入到每一個APP的縫隙,最常用的莫過分享和登入了,接下來就以程式碼的形式來展開微信登入的相關說明,至於原理級別的oauth2.0認證體系請參考微信開放平臺的相關說明和圖示 https://o

授權登入_程式碼可以直接使用

微信網頁授權登陸,官方文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 直接上程式碼,相關注意事項在程式碼中已用TODO標記 Controller層 package com.co

IOS實現授權登入

微信是一個在開發中經常會使用到的平臺,比如微信登入、授權、支付、分享。今天我們來看看如何在自己的應用裡面整合微信授權。 1、微信授權的定義 微信OAuth2.0授權登入讓微信使用者使用微信身份安全登入第三方應用或網站,在微信使用者授權登入已接入微信OAuth2.0的第三方應用後,第三方可以獲取到使用者的介面

vue+vue-cookie 授權登入

      基本實現思路是: 無論使用哪個url進入網站都會先觸發router.beforeEach鉤子 在router.beforeEach鉤子中判斷使用者當前登入狀態 若沒有登入則儲存使用者進入的url並跳轉到login授權頁面

授權登入及儲存使用者資訊(fastadmin開發專案)

最近做了一個微信投票系統,這是第一次開發微信專案,所以特此記錄一下 微信投票系統,最優先想到的就是授權登入,以及獲取使用者資訊 1.首先需要申請微信公眾號(此次使用的是服務號) 2.在微信公眾平臺基本配

公眾平臺開發——授權登入(OAuth2.0)

1、OAuth2.0簡介   OAuth(開放授權)是一個開放標準,允許使用者讓第三方應用訪問該使用者在某一網站上儲存的私密的資源(如照片,視訊,聯絡人列表),而無需將使用者名稱和密碼提供給第三方應用。   允許使用者提供一個令牌,而不是使用者名稱和密碼來訪問他們存放在特

開發之網站授權登入-C#

一、前言 網站微信授權登入的準備工作:官方介面文件  ,微信服務號(怎麼註冊我就不提了),準備工作做好了過後,梳理流程,切勿愣頭青,先把流程梳理好,才好帶入業務 注意:如果沒有認證的服務號,可以用測試賬號,測試賬號預設支援100個關注的微訊號。 官方文案:  網

授權登入後,把獲取的資訊儲存!

微信授權登入後,把獲取的資訊儲存到本地資料庫中 <?php namespace Home\Controller; use Think\Controller; class YiMuDiController extends Controller { /** * 構造方法

授權登入-前後端分離

簡介 在前後端分離情況下實現微信服務號和訂閱號授權登入,專案使用springboot+Vue前後端分離的開發模式。 備註:目前只提供後端程式碼實現以及業務邏輯 流程圖 服務號 開發邏輯 進入活動頁面根據code和state引數判斷,如

小程式 - 授權登入 & 授權繫結手機號

使用者在使用小程式時,經常需要授權登入,授權登入的作用是獲取使用者的基本資訊,如頭像、暱稱以及openid等,openid可用於微信授權手機號、微信支付。 微信授權登入 .xhtml如下,wxLogin為自定義方法 <button open-type="getUserInfo" b

騰訊MSDK手Q授權登入

其實MSDK WIKI講的很詳細,這裡就只挑重點了 名詞解釋 名稱 名詞概述 平臺 微信,手Q統稱平臺 openId 使用者授權後平臺返回的唯一標識 accessToken 使用者授權票據, 獲取此票據以後可以認為使用者已經授權, 分享/支付等功能需要

APP呼叫授權登入之服務端開發

一直在做微信支付 微信授權登入這塊的APP介面 現在提供一個寫好的微信授權service類給大家參考 import com.pojo.wechat.UserInfoData; import com.utils.ConfigUtil; import com.uti

JAVA實現授權登入

1.先寫一個工具類 AuthUtil.java 來存放APPID等資訊 public class AuthUtil { public static final String APPID = "換成自己的APPID "; public static final Strin

java 授權登入

可以自行查詢文件-微信開放平臺https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&

VUE開發SPA之較舒服的授權登入

SPA單頁應用中微信授權登入的一點思路 單頁應用應該如何解決微信授權登入的尷尬跳轉?後退無法返回? 主要遇到的問題就是 先進入單頁應用,一邊渲染頁面一邊判斷使用者有沒有登入,當判斷到沒有登入時非同步資料請求已經發送出去了,然後要跳轉到微信授權頁面,這樣就浪

Vue授權登入前後端分離較為優雅的解決方案

微信授權登入是一個非常常見的場景,利用微信授權登入,我們可以很容易獲取使用者的一些資訊,通過使用者對公眾號的唯一openid從而建立資料庫繫結使用者身份. 微信授權登入的機制這裡不做詳述,微信官方文件已有詳述,簡述就是通過跳轉微信授權的頁面,使用者點選確認後

網站獲取授權登入功能

首先需要弄明白的是你是在微信服務號裡面開發的網站還是獨立的網站應用,獨立的網站獲取微信登入功能需要滿足以下條件: 1.申請微信開發者賬號 2.在微信開發者平臺管理中心申請網站應用,如下圖所示(注意正確填寫授權回撥域): 3.申請通過後會獲得該網站對應的appid以及app

Android:授權登入分享全解析

前言 在移動網際網路浪潮中,聯網APP已經把單機拍死在沙灘上,很多公司都希望自家應用能夠有一套帳號系統,可是許多使用者卻並不一定買賬:我憑啥註冊你家應用的帳號?微博,微信,QQ幾乎成了每個人手機中的必裝應用,於是微信,微博,QQ說了:來來來,你們都可以用我家的

(一)java授權登入

最近工作中,接觸到微信開發(公眾號服務號開發)。由於第一次接觸微信開發,所以第一步先去看微信開發文件。接下來,我們要使用微信來進行授權登入。微信授權的話,獲取使用者資訊有兩種:1.靜默獲取使用者資訊、2.彈出授權介面,使用者確認之後獲取使用者資訊(這種方法能夠獲取到更多資訊)

第三方接入登入流程整理

準備工作 2.在“管理中心”中建立一個移動應用,需“應用名稱、簡介、及28*28和108*108的PNG圖片各一張,且大小不超過300k”,點選下一步,需“應用官網地址,應用簽名及包名”等資訊,然後即可提交稽核。  說明:  應用簽名:可在微信開發平臺的資源中心》》資