IOS微信登录封装类

AppDelegate+WXLogin.h

 #import "AppDelegate.h"

#import  " WXApi.h "

@interface AppDelegate (WXLogin)<WXApiDelegate>
- ( void)WXLogin;
@end

AppDelegate+WXLogin.m

 #import "AppDelegate+WXLogin.h"

#import  " WXLogin.h "

@implementation AppDelegate (WXLogin)
/* *
 *  微信登录的调用方法,获取code
 
*/
- ( void)WXLogin
{
    [[WXLogin sharedInstance] sendAuthRequest];
}

/* *
 *  授权回调时用
 
*/
- ( void)onResp:(BaseResp *)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;
        [[WXLogin sharedInstance] getAccess_TokenWithCode:code withResult:^(WXLoginInfo *loginInfo) {
            self.wxloginCompleteBlock(loginInfo);
        }];
    }
}

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

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:( id)annotation
{
     return [WXApi handleOpenURL:url  delegate:self];
}

@end

 

WXLogin.h

 #import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>

@interface WXLoginInfo : NSObject
@property NSString *nickName;
@property NSString *headUrl;
@property NSString *openId;
@end

typedef  void (^Result)(WXLoginInfo *loginInfo);

@interface WXLogin : NSObject
/* *
 *  设置单例模式
 
*/
+ (instancetype)sharedInstance;
/* *
 *  向微信发送结构体消息
 
*/
- ( void)sendAuthRequest;
/* *
 *  通过code换取access_token
 
*/
- ( void)getAccess_TokenWithCode:(NSString *)code withResult:(Result)result;

@end

WXLogin.m 

 #define WXAppID @""

#define WXAppSecret @""

#import  " WXLogin.h "
#import  " WXApi.h "
#import  " AppDelegate+WXLogin.h "

@interface WXLogin()
@property (copy) Result result;
@property WXLoginInfo *loginInfo;
@end

@implementation WXLogin
/* *
 *  设计单例模式,只创建一次token
 
*/
+ (instancetype)sharedInstance
{
     static  id instance;
     static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [self  new];
    });
     return  instance;
}

- ( id)init
{
    self = [super init];
     if (self) {
        [WXApi registerApp:WXAppID];
    }
     return self;
}

- ( void)sendAuthRequest
{
    SendAuthReq *req = [[SendAuthReq alloc] init];
    req.scope =  @" snsapi_userinfo,snsapi_base "// 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
    req.state =  @" 0789 ";   // 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
    
    
// 第三方向微信终端发送一个SendAuthReq消息结构
    [WXApi sendReq:req];
}

/* *
 *  通过code来获取用户的access_token
 
*/
- ( void)getAccess_TokenWithCode:(NSString *)code withResult:(Result)result
{
    _result = result;
    NSString *url = [NSString stringWithFormat: @" https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code ",WXAppID, WXAppSecret, 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 *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                 JLLog( @" access_token: %@ ",[dict objectForKey: @" access_token "]);
                 if (!self.loginInfo) {
                    self.loginInfo = [[WXLoginInfo alloc] init];
                }
                self.loginInfo.openId = [dict objectForKey: @" openid "];
                [self getUserInfoWithToken:[dict objectForKey: @" access_token "] OpenID: @" openid "];
            }
        });
    });
}

/* *
 *  通过token来获取用户的个人信息
 
*/
- ( void)getUserInfoWithToken:(NSString *)token OpenID:(NSString *)openid
{
    NSString *url = [NSString stringWithFormat: @" https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@ ",token, 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 *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                self.loginInfo.nickName = [dict objectForKey: @" nickname "];
                self.loginInfo.headUrl = [dict objectForKey: @" headimagurl "];
                _result(self.loginInfo);
            }
        });
    });
}

@end
@implementation WXLoginInfo
@end


UIViewController 

 /**

 *  微信登录
 
*/
- ( void)wxLogin
{
    AppDelegate * delegate = (AppDelegate *)[UIApplication sharedApplication]. delegate;
     delegate.wxloginCompleteBlock = ^(WXLoginInfo *loginInfo){
        JLLog( @" nickname: %@ ",loginInfo.nickName);

    };
    [ delegate WXLogin];
}

 

以上为IOS第三方微信登录的封装

 

转载于:https://www.cnblogs.com/yuanjunliang/articles/4619030.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值