关闭

iOS 第三方登录之 微信登录

标签: iOS微信登录
702人阅读 评论(0) 收藏 举报
分类:

一.首先需要下载微信开发工具包(SDK)

网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&token=71da5ba03964f8ae2039ae1d2b7e3a84f4af050b&lang=zh_CN

需要下载的是“使用微信分享、登录、收藏、支付等功能需要的库以及文件。点击下载iOS开发工具包64位  "    

将下载的SDK加入工程。

二.下面就来实现微信第三方登录

参考文档见:微信登录参考文档

文档中介绍:

微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

下面咱们就来实现。

1.在appDelegate.m中添加微信代理

//微信

-(void) onResp:(BaseResp*)resp

{

#if DEBUG

    NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];

    MyNSLog(@"微信返回res.errCode=%@",strMsg);

#endif

    NSString *strTitle;

    if ([resp isKindOfClass:[SendAuthResp class]]) {

        strTitle = [NSString stringWithFormat:@"登录授权"];

        SendAuthResp *aResp = (SendAuthResp *)resp;

        NSString *code = aResp.code;

        if (aResp.errCode == 0) {

            MyNSLog(@"微信登录 errcode=0");      

            NSDictionary* para = [NSDictionary dictionaryWithObjectsAndKeys:code,@"para"nil];

            //发通知将返回的code传出到下面WXLoginClass.m中的处理函数

            [[NSNotificationCenter defaultCenterpostNotificationName:NOTIFICATION_WX_LOGIN object:nil userInfo:para];

      

        } else {

            MyNSLog(@"errcode = %d",aResp.errCode);

        }

    }

    MyNSLog(@"title:%@",strTitle);

}

2.添加WXLoginClass.h文件,内容为:

//

//  WXLoginClass.h

//


#import <Foundation/Foundation.h>


@classWXLoginClass;


@protocol WXLoginDelegate <NSObject>


@required

-(void) WXLogin:(WXLoginClass*) WXLoginClass  Result:(NSDictionary*) resultDic;

@end


@interface WXLoginClass :NSObject


@property (assign)id <WXLoginDelegate> delegate;

@property (nonatomic,strong)UIViewController * currentVC;


- (instancetype)initWithViewController:(UIViewController*) vc;

-(void) startAuthorize;

@end

添加WXLoginClass.m文件,内容为:

//

//  WXLoginClass.m

//


#import "WXLoginClass.h"


@interface WXLoginClass () <WXApiDelegate>


@end


@implementation WXLoginClass


- (instancetype)initWithViewController:(UIViewController*) vc

{

    self = [superinit];

    if (self) {

        self.currentVC = vc;

        [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(getWXLoginNoti:)name:NOTIFICATION_WX_LOGINobject:nil];

    }

    return self;

}

-(void) dealloc{

    [[NSNotificationCenterdefaultCenter] removeObserver:self];

}

#pragma mark ------- 1. 微信登录 调起授权 ------

-(void) startAuthorize

{

    MyNSLog(@"开始认证");

    [self.currentVCshowHudInView:self.currentVC.viewhint:NSLocalizedString(@"loadData",@"Load data...")];

    SendAuthReq *req = [[SendAuthReqalloc] init];

    req.scope =@"snsapi_userinfo";

    req.state = @"iteenker";

    [WXApisendAuthReq:req viewController:self.currentVCdelegate:self];

}

上面方法调用后,返回的结果会回调AppDelegate中的onResp。

#pragma mark ------- 2. 微信登录 获取accessToken ------

-(void) getWXLoginNoti:(NSNotification*) noti//收到通知,进行下一步,获取accessToken

{

    [self.currentVChideHud];

    [[NSNotificationCenterdefaultCenter] removeObserver:self];

    NSString* code = [[noti userInfo] objectForKey:@"para"];

    MyNSLog(@"微信登录code:%@",code);

    if (!NO_VALUE(code)) {

        [selfaccessTokenRequest:code];

    }else{

        [self.currentVCshowHint:ALERT_WX_LOGIN_ERROR];

    }

}


-(void)accessTokenRequest:(NSString*) code

{

    //第一步,创建URL

    dispatch_async(dispatch_get_main_queue(), ^{

        NSString *access_url = [NSStringstringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",gWXid, gWXsecret, code];

#pragma warning -------------

        NSError *err = nil;

        NSMutableDictionary* dicData = [NSMutableDictionarydictionary];

        err = [requestSyncServer requestSyncServerWithUrl:access_url withReceiveDic:dicData];

        if (err != nil) {

#if DEBUG

            NSString* errString = [[NSStringalloc] initWithFormat:@"解析数据失败"];

            MyNSLog(@"%@",errString);

#endif

            [self.currentVCshowHint:ALERT_WX_LOGIN_ERROR];

        }else{

            NSString* access_token = [dicData objectForKey:@"access_token"];

            NSString* openid = [dicData objectForKey:@"openid"];

            if (!NO_VALUE(access_token) && !NO_VALUE(openid)) {

                NSString* userinfo_url = [[NSStringalloc] initWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@", access_token, openid];

                [self getWXUserInfo:userinfo_url];//调用获取用户的微信个人信息方法

            }else{

                [self.currentVCshowHint:ALERT_WX_LOGIN_ERROR];

            }

        }

    });

}

#pragma mark ----------3. 获取用户的微信个人信息 ----

-(void)getWXUserInfo:(NSString*)userinfo_url

{

    dispatch_async(dispatch_get_main_queue(), ^{

#pragma warning -------------

        NSError *err = nil;

        NSMutableDictionary* dicData = [NSMutableDictionarydictionary];

        err = [requestSyncServer requestSyncServerWithUrl:userinfo_url withReceiveDic:dicData];

        

        if (err != nil) {

#if DEBUG

            NSString* errString = [[NSStringalloc] initWithFormat:@"解析数据失败"];

            MyNSLog(@"%@",errString);

#endif

            [self.currentVCshowHint:ALERT_WX_LOGIN_ERROR];

        }else{

            NSString* openid = [dicData objectForKey:@"openid"];

            NSString* nickname = [dicData objectForKey:@"nickname"];

            MyNSLog(@"==============微信登陆名:%@",nickname);

            NSString* avatar = [dicData objectForKey:@"headimgurl"];

            if (!NO_VALUE(openid) && !NO_VALUE(nickname) && !NO_VALUE(avatar)) {

                 NSDictionary * resultDic = [NSDictionarydictionaryWithObjectsAndKeys:openid,@"openid",avatar,@"avatar",nickname,@"nickname",nil];               

                [self.delegateWXLogin:selfResult:resultDic];//调用代理将得到的信息传出

            }

        }

    });

}

@end

3.用微信登录,一般都是点击微信登录按钮,调用一个函数。

在.m文件中包含头文件

#import "WXApi.h"

#import "WXLoginClass.h"

@property (nonatomic,strongWXLoginClass * wxloginclass;

#pragma mark ---------- 点击微信登录 ----------


- (IBAction)touchWeChatButton:(id)sender {

    self.wxloginclass = [[WXLoginClassalloc] initWithViewController:self];

    self.wxloginclass.delegate =self;//设置代理

    [self.wxloginclassstartAuthorize];

}


#pragma mark

#pragma mark - WXlogindelegate

-(void) WXLogin:(WXLoginClass *)WXLoginClass Result:(NSDictionary *)resultDic

{

    [self.openID setString:[resultDic objectForKey:@"openid"]];

    [self.figureurl_qq_2 setString:[resultDic objectForKey:@"avatar"]];

    [self.nickname setString:[resultDic objectForKey:@"nickname"]];

    [self login:self.openID andNickname:self.nickname andAvatar:self.figureurl_qq_2];//自己的登录方法

}







0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:286173次
    • 积分:4646
    • 等级:
    • 排名:第6305名
    • 原创:165篇
    • 转载:90篇
    • 译文:3篇
    • 评论:28条
    最新评论