微信登录
- 首先需要确保你的App应用在微信开发平台上注册创建并获得对应的接口,对应登录、支付等功能,在微信开放平台申请获得appid,以及appkey
- 获得appkey后,可以使用第三方平台比如友盟或者shareSDK。
shareSDK微信分享,登录
shareSDK第三方平台获取它们对应的key,pods集成文档可以看这集成所需模块
#define ShareSDKAppKey @"###########" //ShareSDK Appkey
#define WeChat_AppID @"###########" //微信平台appid
#define WeChat_Secret @"###########" //微信平台Secret
- 首先在Appdelegate.h文件里面didfinishload函数里面进行初始化
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setupShareSDK];
}
#pragma mark -- 设置ShareSDK(pods集成时只集成了微信平台)
+ (void)setupShareSDK{
[ShareSDK registerActivePlatforms:@[
@(SSDKPlatformTypeWechat)
]
onImport:^(SSDKPlatformType platformType)
{
switch (platformType)
{
case SSDKPlatformTypeWechat:
[ShareSDKConnector connectWeChat:[WXApi class]];
break;
default:
break;
}
}
onConfiguration:^(SSDKPlatformType platformType, NSMutableDictionary *appInfo)
{
switch (platformType)
{
case SSDKPlatformTypeSinaWeibo:
case SSDKPlatformTypeWechat:
[appInfo SSDKSetupWeChatByAppId:WeChat_AppID
appSecret:WeChat_Secret];
break;
default:
break;
}
}];
}
- 微信回调走的是
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
return [self handleAllUrl:app url:url];
}
- (BOOL)handleAllUrl:(UIApplication*)app url:(NSURL*)url
{
// if ([url.host isEqualToString:@"oauth"]){
// NSLog(@"微信登录返回的东西 ");
// return [WXApi handleOpenURL:url delegate:self];
// }
}
#pragma mark WXApiDelegate
-(void)onResp:(BaseResp *)resp{
MDLog(@"========%d%@",resp.errCode,resp.errStr);
if ([resp isKindOfClass:[SendAuthResp class]])//授权登录
{
SendAuthResp *rep = (SendAuthResp *)resp;
if (rep.errCode == 0)//成功
{
[[NSNotificationCenter defaultCenter]postNotificationName:@"WXAuthorizationSuccess" object:@{@"code":rep.code}];
}
}
}
*登录界面 点击第三方登录图片的触发事件
//微信
#import “WXApi.h”
#import <TencentOpenAPI/TencentOAuth.h>
//登录
#define WX_ACCESS_TOKEN @“access_token”
#define WX_OPEN_ID @“openid”
#define WX_REFRESH_TOKEN @“refresh_token”
- (void)viewDidLoad {
[super viewDidLoad];
[self initView];
//监听登录回调
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(WXloginapp:) name:@"WXAuthorizationSuccess" object:nil];
}
*微信按钮点击事件
//第三方微信登录
-(void)WXapploginstate{
f (![WXApi isWXAppInstalled])
{
NSLog(@"微信未安装");
}
else
{
[self loginByWechat];
}
}
-(void)loginByWechat
{
SendAuthReq *req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_userinfo";
req.state = @"App";
[WXApi sendReq:req];
}
- 监听登录回调事件
-(void)WXloginapp:(NSNotification *)notification{
__weak AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 15;
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSString *urlstr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=%@",WeChat_AppID,WeChat_AppSecret,notification.object[@"code"],@"authorization_code"];
NSLog(@"urlstr=%@",urlstr);
[manager GET:urlstr parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * accessDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
NSLog(@"accessDIXRespoc=%@",accessDict);
NSString *accessToken = [accessDict objectForKey:WX_ACCESS_TOKEN];
NSString *openID = [accessDict objectForKey:WX_OPEN_ID];
NSString *refreshToken = [accessDict objectForKey:WX_REFRESH_TOKEN];
// 本地持久化,以便access_token的使用、刷新或者持续
if (accessToken && ![accessToken isEqualToString:@""] && openID && ![openID isEqualToString:@""]) {
[[NSUserDefaults standardUserDefaults] setObject:accessToken forKey:WX_ACCESS_TOKEN];
[[NSUserDefaults standardUserDefaults] setObject:openID forKey:WX_OPEN_ID];
[[NSUserDefaults standardUserDefaults] setObject:refreshToken forKey:WX_REFRESH_TOKEN];
[[NSUserDefaults standardUserDefaults] synchronize]; // 命令直接同步到文件里,来避免数据的丢失
}
[self wechatLoginByRequestForUserInfo];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
}
- 获取授权登录后 获取用户个人信息(UnionID机制)
- (void)wechatLoginByRequestForUserInfo {
NSString *accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:WX_ACCESS_TOKEN];
NSString *openID = [[NSUserDefaults standardUserDefaults] objectForKey:WX_OPEN_ID];
//链接格式参考微信开放文档
NSString *userUrlStr = [NSString stringWithFormat:@"%@/userinfo?access_token=%@&openid=%@", @"https://api.weixin.qq.com/sns", accessToken, openID];
// 请求用户数据
__weak AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 15;
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:userUrlStr parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * accessDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
NSLog(@"请求用户信息的response = %@", accessDict);
// NSMutableDictionary *userDict = [NSMutableDictionary dictionaryWithDictionary:responseObject];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
}
-
得到的数据格式
-
最后就是把获得的授权token值 传给公司后台,再根据公司需求进行下一步操作了
友盟登录
- // SDK key
#define kUMAnalyticsAppKey @"**********" //友盟统计Appkey(从友盟第三方平台申请)
-
pod ‘UMCShare/Social/WeChat’
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 配置第三方sdk
[self configureOhter:launchOptions];
}
#pragma mark 配置第三方sdk
- (void)configureOhter:(NSDictionary *)launchOptions
{
/* 设置友盟appkey */
[[UMSocialManager defaultManager] setUmSocialAppkey:UmengKey];
/* 设置微信的appKey和appSecret */
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession
appKey:WeixinAppId
appSecret:WeixinSecret
redirectURL:@"http://mobile.umeng.com/social"];
}
- 登录
if (![WXApi isWXAppInstalled])
{
[FanweMessage alertTWMessage:@"微信未安装"];
}
else
{
[self loginByWechat];
}
pragma mark 微信登录
- (void)loginByWechat
{
[self getUserInfoForPlatform:UMSocialPlatformType_WechatSession];
/*
// 构造SendAuthReq结构体
SendAuthReq* req =[[SendAuthReq alloc ] init ];
req.scope = @"snsapi_userinfo" ;
req.state = @"123" ;
// 第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
*/
}
- #pragma mark 根据对应类型进行登录操作
- (void)getUserInfoForPlatform:(UMSocialPlatformType)platformType{
[[UMSocialManager defaultManager] getUserInfoWithPlatform:platformType currentViewController:self completion:^(id result, NSError *error) {
UMSocialUserInfoResponse *resp = result;
// // 授权信息
// NSLog(@"Wechat uid: %@", resp.uid);
// NSLog(@"Wechat openid: %@", resp.openid);
// NSLog(@"Wechat unionid: %@", resp.unionId);
// NSLog(@"Wechat accessToken: %@", resp.accessToken);
// NSLog(@"Wechat refreshToken: %@", resp.refreshToken);
// NSLog(@"Wechat expiration: %@", resp.expiration);
//
// // 用户信息
// NSLog(@"Wechat name: %@", resp.name);
// NSLog(@"Wechat iconurl: %@", resp.iconurl);
// NSLog(@"Wechat gender: %@", resp.unionGender);
//
// // 第三方平台SDK源数据
// NSLog(@"Wechat originalResponse: %@", resp.originalResponse);
if (resp)
{
if (platformType == UMSocialPlatformType_WechatSession)
{
[parmDict setObject:@"wx_login" forKey:@"act"];
[parmDict setObject:resp.openid forKey:@"openid"];
[parmDict setObject:resp.accessToken forKey:@"access_token"];
}
[self login];//调登录方法把得到的token传给后台服务器
}