iOS接入微信登录

最近需求接入微信登录。因为项目里面已经接入了友盟,包含了微信SDK,不再需要接入SDK,直接读官方文档,开始接入。

有三个必须的文件:libWeChatSDK.a,WXApi.h,WXApiObject.h。


iOS接入微信登录_第1张图片
image
  • 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  • 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  • 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

时序图如下
iOS接入微信登录_第2张图片
image

*当控制器中点击微信图标时,调起微信客户端,若是第一次调起,到微信登录授权页。非首次直接微信登录。

新建WXApiManager单例类,将控制器和代理传入。
    [[WXApiManager sharedManager] sendAuthRequestWithController:self
                                                        delegate:self];
#pragma mark - Public Methods
- (void)sendAuthRequestWithController:(UIViewController*)viewController
                             delegate:(id)delegate {
    SendAuthReq* req = [[SendAuthReq alloc] init];
    req.scope = @"snsapi_userinfo";
    self.authState = req.state = [NSString randomKey];
    self.delegate = delegate;
    [WXApi sendAuthReq:req viewController:viewController delegate:self];
}

/*! @brief 发送Auth请求到微信,支持用户没安装微信,等待微信返回onResp
 *
 * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。
 * @param req 具体的发送请求,在调用函数后,请自己释放。
 * @param viewController 当前界面对象。
 * @param delegate  WXApiDelegate对象,用来接收微信触发的消息。
 * @return 成功返回YES,失败返回NO。
 */
+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id) delegate;

*调起客户端之后返回wxcode,例如081yEA8U0uEDDX1RqXbU0A7b8U0yEA8E。

-(void)onResp:(BaseResp*)resp {    
    if([resp isKindOfClass:[SendAuthResp class]]) {
        SendAuthResp* authResp = (SendAuthResp*)resp;
        /* Prevent Cross Site Request Forgery */
        if (![authResp.state isEqualToString:self.authState]) {
            if (self.delegate && [self.delegate respondsToSelector:@selector(wxAuthDenied)])
                [self.delegate wxAuthDenied];
            return;
        }
        
        switch (resp.errCode) {
            case WXSuccess:
                NSLog(@"RESP:code:%@,state:%@\n", authResp.code, authResp.state);
                if (self.delegate && [self.delegate respondsToSelector:@selector(wxAuthSucceed:)])
                    [self.delegate wxAuthSucceed:authResp.code];
                break;
            case WXErrCodeAuthDeny:
                if (self.delegate && [self.delegate respondsToSelector:@selector(wxAuthDenied)])
                    [self.delegate wxAuthDenied];
                break;
            case WXErrCodeUserCancel:
                if (self.delegate && [self.delegate respondsToSelector:@selector(wxAuthCancel)])
                    [self.delegate wxAuthCancel];
            default:
                break;
        }
    }
}
  • 将返回的wxcode,appid(应用唯一标识,在微信开放平台提交应用审核通过后获得)和secret(应用密钥AppSecret,在微信开放平台提交应用审核通过后获得)传入后台进行登录。


    iOS接入微信登录_第3张图片
    image
  • 在delegate中一定要加上回调处理,否则会无法进入onResq方法中收不到wxcode。若含有友盟分享,则可通过url判断识别出微信登录。
不含分享功能
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
含有分享功能
// 支持所有iOS系统
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [self handleApplicationOpenURL:url];
}
//注:以上为建议使用的系统openURL回调,且新浪平台仅支持以上回调。还有以下两种回调方式,如果开发者选取以下回调,也请补充相应的函数调用。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
    return [self handleApplicationOpenURL:url];
}
//2.支持目前所有iOS系统
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [self handleApplicationOpenURL:url];
}
//2.支持目前所有iOS系统
- (BOOL)handleApplicationOpenURL:(NSURL *)url{
    
    //针对iOS9.0以上系统,标识此时有支付宝和微信支付的回调,区别于如果是点击系统左上角返回按钮返回APP还是点击取消和完成返回APP。
    //微信登录
    if([url.scheme isEqualToString:[AppKey sharedInstance].wechatKey]){
        return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
    }
    
    BOOL result = [ShareAgent handleOpenURL:url];
    if (!result) {
        return YES;
    }
    return result;
}

Demo地址。

你可能感兴趣的:(iOS接入微信登录)