微信SDK实现第三方登录

标签(空格分隔): iOS


  • 微信SDK接入过程
    • 接入前原理知识准备:iOS 微信第三方登录文档说明
    • 官方文档:iOS接入指南

  • 1.工程配置
    引入系统库:
    SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework。

Build Setting,在"Other Linker Flags"中加入"-Objc -all_load",在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h


  • 2.代码
    AppDelegate.m  
    #import"WXApi.h"
    引入协议:

    didFinishLaunchingWithOption 方法中
    向微信注册自己的App
    [WXApi registerApp:@"wx3d40739db8ea9f4f" withDescription:@"第三方登录"];
  还有下面两个方法
        - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
            return [WXApi handleOpenURL:url delegate:[ViewController new]];
        }
        - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
            return [WXApi handleOpenURL:url delegate:[ViewController new]];
        }


    在触发第三方登录的控制器中;
    点击微信登录;
    
        -(void)weChatLogin {
    
        //    方法一:只有手机安装了微信才能使用
        //    if ([WXApi isWXAppInstalled]) {
        //        SendAuthReq *req = [[SendAuthReq alloc] init];
        //        //这里是按照官方文档的说明来的此处我要获取的是个人信息内容
        //        req.scope = @"snsapi_userinfo";
        //        req.state = @"";
        //        //向微信终端发起SendAuthReq消息
        //        [WXApi sendReq:req];
        //    } else { 
        //        NSLog(@"安装微信客户端");
        //    }
            
        //    方法二:手机没有安装微信也可以使用,推荐使用这个
            SendAuthReq *req = [[SendAuthReq alloc] init];
            req.scope = @"snsapi_userinfo";
            req.state = @"";
            [WXApi sendAuthReq:req viewController:self delegate:self];
        }
    

    代理方法
        #pragma mark - WXApiDelegate
        -(void)onResp:(BaseResp *)resp{
            //判断是否是微信认证的处理结果
            if ([resp isKindOfClass:[SendAuthResp class]]) {
                SendAuthResp *temp = (SendAuthResp *)resp;
                //如果你点击了取消,这里的temp.code 就是空值
                if (temp.code != NULL) {
                    //此处判断下返回来的code值是否为错误码
                    /*此处接口地址为微信官方提供,我们只需要将返回来的code值传入再配合appId和appSecret即可获取到accessToken,openId和refreshToken */
                    //https://api.weixin.qq.com/sns  /oauth2/access_token
                    NSString *accessUrlStr = [NSString stringWithFormat:@"%@/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", WX_BASE_URL, WX_App_ID, WX_App_Secret, temp.code];
                    
                   AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
                    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
                    
                    [manager GET:accessUrlStr parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
                        
                    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                        
                        [self p_successedWeiChatLogin:responseObject];
                        NSLog(@"%@",responseObject);
                        
                    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                        
                        [self p_failureWeiChatLogin:error];
                    }];
                }
            }
        }

         /**
         网络请求成功

         @param dic 网络请求数据
         */
        - (void)p_successedWeiChatLogin:(NSDictionary *)dic{
            NSDictionary *returnObject = [NSDictionary dictionary];
            returnObject = dic;
            //成功返回
            //                {
            //                    "access_token" = "fdpTn5awAnJ7g-RAjLjMT7DAFInXhbIjmLZzmrLea8jQtJm2VyEEIB3NKdvnV6gHXPo76ki0z4kiQ1CXA62SnneKZI";  接口调用凭证
            //                    "expires_in" = 7200;//接口调用凭证超时时间,单位(秒)
            //                    openid = ovMVmwh0TzOnVQX62R5zXg;//授权用户唯一标识
            //                    "refresh_token" = "4GjXOOIAOBYuxO7wfjimyB1d_H6xLeCeUeng8bKDCzv5-N3yZSueJnz6UTkh9_j6l0tuS4Dlcs6c3ZC1xTmCUe0M0";//用户刷新access_token
            //                    scope = "snsapi_userinfo";//用户授权的作用域,使用逗号(,)分隔
            //                    unionid = oTlu3wJzgi6iVVb8txvU;//当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
            //                }
        }
    ```
    

错误
提示:This app is not allowed to query for scheme xxxx
解决:在infor.plist中添加LSApplicationQueriesSchemes(数组),数组中元素添加weixin

你可能感兴趣的:(微信SDK实现第三方登录)