微信SDK实现第三方登录
程序员文章站
2022-06-12 20:18:35
...
标签(空格分隔): 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"
引入协议:<WXApiDelegate>
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<UIApplicationOpenURLOptionsKey,id> *)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