iOS 微信第三方登錄的簡(jiǎn)單實(shí)現(xiàn)

下載微信SDK

微信開放平臺(tái) https://open.weixin.qq.com

微信開放平臺(tái)

導(dǎo)入SDK

導(dǎo)入SDK瞳别,并添加依賴庫

配置URL scheme

在Xcode中,選擇你的工程設(shè)置項(xiàng)丈屹,選中TARGETS一欄,在info標(biāo)簽欄的URL type添加URL scheme為你所注冊(cè)的應(yīng)用程序id(如下圖所示)棕洋,此步為配置應(yīng)用間的跳轉(zhuǎn)椅挣。

配置Url Scheme

開始編寫代碼

  • Appdelegate.h中引用微信文件,聲明遵循代理寥院。
#import <UIKit/UIKit.h>  
#import "WXApi.h"  
  
@interface AppDelegate : UIResponder <UIApplicationDelegate,WXApiDelegate>  
  
@property (strong, nonatomic) UIWindow *window;  
  
@end  
  • 注冊(cè)SDK
    要使你的程序啟動(dòng)后微信終端能響應(yīng)你的程序劲赠,必須在代碼中向微信終端注冊(cè)你的id。(在 AppDelegatedidFinishLaunchingWithOptions 函數(shù)中向微信注冊(cè)id)秸谢。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after application launch.  
      
    [WXApi registerApp:@"這里填寫你的AppID"];  
      
    return YES;  
}  
  • 重寫AppDelegatehandleOpenURLopenURL方法
//和QQ,新浪并列回調(diào)句柄  
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  
{  
    return [WXApi handleOpenURL:url delegate:self];  
}  
  
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    return [WXApi handleOpenURL:url delegate:self];  
}  
  • 調(diào)用微信API凛澎,調(diào)用微信登錄
    scope : 應(yīng)用授權(quán)作用域,如獲取用戶個(gè)人信息則填寫snsapi_userinfo
    state : 用于保持請(qǐng)求和回調(diào)的狀態(tài)估蹄,授權(quán)請(qǐng)求后原樣帶回給第三方塑煎。該參數(shù)可用于防止csrf攻擊(跨站請(qǐng)求偽造攻擊),建議第三方帶上該參數(shù)臭蚁,可設(shè)置為簡(jiǎn)單的隨機(jī)數(shù)加session進(jìn)行校驗(yàn)(非必填)最铁。
- (void)wechatLoginButtonPressed  
{  
    NSLog(@"%s",__func__);  
      
    //構(gòu)造SendAuthReq結(jié)構(gòu)體  
    SendAuthReq* req =[[SendAuthReq alloc] init];  
    req.scope = @"snsapi_userinfo" ;  
    req.state = @"123" ;  
    //第三方向微信終端發(fā)送一個(gè)SendAuthReq消息結(jié)構(gòu)  
    [WXApi sendReq:req];  
}  
  • Appdelegate中實(shí)現(xiàn)微信的代理,獲取微信返回的code垮兑,這里我使用了通知的方法來調(diào)用登錄controller中的相應(yīng)才做冷尉,也可以使用代理、KVO等方式來實(shí)現(xiàn)系枪。
//授權(quán)后回調(diào) WXApiDelegate  
-(void)onResp:(BaseReq *)resp  
{  
    /* 
     ErrCode ERR_OK = 0(用戶同意) 
     ERR_AUTH_DENIED = -4(用戶拒絕授權(quán)) 
     ERR_USER_CANCEL = -2(用戶取消) 
     code    用戶換取access_token的code雀哨,僅在ErrCode為0時(shí)有效 
     state   第三方程序發(fā)送時(shí)用來標(biāo)識(shí)其請(qǐng)求的唯一性的標(biāo)志,由第三方程序調(diào)用sendReq時(shí)傳入私爷,由微信終端回傳雾棺,state字符串長(zhǎng)度不能超過1K 
     lang    微信客戶端當(dāng)前語言 
     country 微信用戶當(dāng)前國(guó)家信息 
     */  
  
    if ([resp isKindOfClass:[SendAuthResp class]]) //判斷是否為授權(quán)請(qǐng)求,否則與微信支付等功能發(fā)生沖突  
    {  
        SendAuthResp *aresp = (SendAuthResp *)resp;  
        if (aresp.errCode== 0)  
        {  
            NSLog(@"code %@",aresp.code);  
            [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];  
        }  
    }  
}  

相對(duì)應(yīng)注冊(cè)通知方法:

    //跳轉(zhuǎn)到主界面
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wechatDidLoginNotification:) name:@"wechatDidLoginNotification" object:nil];

記得在dealloc方法中移除通知当犯,避免發(fā)生沖突:

- (void)dealloc  
{  
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"wechatDidLoginNotification" object:nil];  
}  

微信登錄認(rèn)證后獲取用戶的個(gè)人信息比較麻煩垢村,需要三個(gè)步驟:

  • 獲取微信登錄code
  • 根據(jù)code獲取accessToken和openId
  • 根據(jù)accessToken和openId獲取用戶信息

具體步驟:
剛剛我們已經(jīng)在appdelegate中微信的代理中獲取到了code,下面直接來進(jìn)行第二步嚎卫,根據(jù)code獲取accessTokenopenId
參照微信開放平臺(tái)官方文檔:

- (void)getWechatAccessTokenWithCode:(NSString *)code  
{  
    NSString *url =[NSString stringWithFormat:  
      @"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",  
        WechatAppKey,WechatSecrectKey,code];  
      
    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];  
                  
                NSLog(@"%@",dic);  
                NSString *accessToken = dic[@"access_token"];  
                NSString *openId = dic[@"openid"];  
                  
                [self getWechatUserInfoWithAccessToken:accessToken openId:openId];  
            }  
        });  
    });  
}  

現(xiàn)在已經(jīng)獲取了微信的accessTokenopenId嘉栓,就可以請(qǐng)求相應(yīng)的微信接口了。
參照文檔拓诸,我們使用以下接口:

使用這個(gè)接口就可以獲取用戶信息了侵佃,然后調(diào)用自己的方法進(jìn)行登錄,這里可以使用openId當(dāng)做賬號(hào)奠支,他是每個(gè)微信用戶唯一對(duì)應(yīng)的id

- (void)getWechatUserInfoWithAccessToken:(NSString *)accessToken openId:(NSString *)openId  
{  
    NSString *url =[NSString stringWithFormat:  
                    @"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];  
      
    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];  
                  
                NSLog(@"%@",dic);  
                  
                NSString *openId = [dic objectForKey:@"openid"];  
                NSString *memNickName = [dic objectForKey:@"nickname"];  
                NSString *memSex = [dic objectForKey:@"sex"];  
                  
                [self loginWithOpenId:openId memNickName:memNickName memSex:memSex];  
            }  
        });  
          
    });  
}  

至此馋辈,就實(shí)現(xiàn)了簡(jiǎn)單的微信登錄

效果圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倍谜,隨后出現(xiàn)的幾起案子迈螟,更是在濱河造成了極大的恐慌叉抡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件答毫,死亡現(xiàn)場(chǎng)離奇詭異褥民,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洗搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門消返,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耘拇,你說我怎么就攤上這事撵颊。” “怎么了惫叛?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵倡勇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我挣棕,道長(zhǎng)译隘,這世上最難降的妖魔是什么亲桥? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任洛心,我火速辦了婚禮,結(jié)果婚禮上题篷,老公的妹妹穿的比我還像新娘词身。我一直安慰自己,他們只是感情好番枚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布法严。 她就那樣靜靜地躺著,像睡著了一般葫笼。 火紅的嫁衣襯著肌膚如雪深啤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天路星,我揣著相機(jī)與錄音溯街,去河邊找鬼。 笑死洋丐,一個(gè)胖子當(dāng)著我的面吹牛呈昔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播友绝,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了梁沧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤辞槐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后粘室,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催蝗,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年育特,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丙号。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缰冤,死狀恐怖犬缨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棉浸,我是刑警寧澤怀薛,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站迷郑,受9級(jí)特大地震影響枝恋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗡害,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一焚碌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霸妹,春花似錦十电、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罢绽,卻和暖如春畏线,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背良价。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工寝殴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚壁。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓杯矩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袖外。 傳聞我的和親對(duì)象是個(gè)殘疾皇子史隆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容