移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。
在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。
1、集成微信SDK
CocoaPods配置:
pod 'WechatOpenSDK'
2、添加URL Schemes
3、针对iOS9增加白名单
4、iOS9中新增App Transport Security(简称ATS)特性
5、集成代码:
在AppDelegate.m中
#import "AppDelegate.h"
//导入主头文件
#import <WXApi.h>
@interface AppDelegate ()<WXApiDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//向微信注册应用
[WXApi registerApp:APPID];
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
[WXApi handleOpenURL:url delegate:self];
return YES;
}
//收到一个来自微信的处理结果,调用一次sendReq后会收到onResp
- (void)onResp:(BaseResp *)resp
{
NSLog(@"errCode = %d",resp.errCode);
/*
enum WXErrCode {
WXSuccess = 0, 成功
WXErrCodeCommon = -1, 普通错误类型
WXErrCodeUserCancel = -2, 用户点击取消并返回
WXErrCodeSentFail = -3, 发送失败
WXErrCodeAuthDeny = -4, 授权失败
WXErrCodeUnsupport = -5, 微信不支持
};
*/
if ([resp isKindOfClass:[SendAuthResp class]]) { //授权登录的类
SendAuthResp *sendResp = (SendAuthResp *)resp;
if (resp.errCode == 0) { //成功
//可获取 accessToken
NSString* urlStr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",
@"wxb9e8f5aa1fe010ce",@"ffec13c05f48b8976b8b998a39b2b923",sendResp.code];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];//申明返回的结果是JSON类型
[manager GET:urlStr parameters:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//成功的返回结果
NSLog(@"responseObject = %@",responseObject);
//通过成功返回的 access_token 和 openid 获取微信用户信息
[self getWechatUserInfoWithAccessToken:responseObject[@"access_token"] openId:responseObject[@"openid"]];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error = %@",error);
}];
}else{ //失败
}
}
}
/**
获取微信用户信息
@param accessToken 成功返回的access_token
@param openId 成功返回的openid
*/
- (void)getWechatUserInfoWithAccessToken:(NSString *)accessToken openId:(NSString *)openId
{
NSString* urlStr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];//申明返回的结果是JSON类型
[manager GET:urlStr parameters:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//成功的返回结果
NSLog(@"微信用户信息:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error = %@",error);
}];
}
@end
在你微信登录的类中
#pragma mark - 微信登录事件
- (IBAction)weChatLogin:(UIButton *)sender {
if ([WXApi isWXAppInstalled]) { //判断设备已经安装了微信
//构造SendAuthReq结构体
SendAuthReq *req = [[SendAuthReq alloc]init];
req.scope = @"snsapi_userinfo";
req.state = @"123";
//第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
}else{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"您的设备未装有微信,请先进行安装" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *sure = [UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:sure];
[self presentViewController:alertController animated:YES completion:nil];
}
}