最近需求接入微信登录。因为项目里面已经接入了友盟,包含了微信SDK,不再需要接入SDK,直接读官方文档,开始接入。
有三个必须的文件:libWeChatSDK.a,WXApi.h,WXApiObject.h。
image
- 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
- 通过code参数加上AppID和AppSecret等,通过API换取access_token;
- 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
时序图如下
image

image
*当控制器中点击微信图标时,调起微信客户端,若是第一次调起,到微信登录授权页。非首次直接微信登录。
新建WXApiManager单例类,将控制器和代理传入。
[[WXApiManager sharedManager] sendAuthRequestWithController:self
delegate:self];
#pragma mark - Public Methods
- (void)sendAuthRequestWithController:(UIViewController*)viewController
delegate:(id<WXAuthDelegate>)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<WXApiDelegate>) 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,在微信开放平台提交应用审核通过后获得)传入后台进行登录。
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<UIApplicationOpenURLOptionsKey, id> *)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;
}

