一、微信授权
1.微信授权比较简单,只需要向微信终端发送一个SendAuthReq
消息结构 即可拉取授权。
/**
发起微信授权
@param success 成功
@param failed 失败
*/
- (void)startWeChatAuthSuccess:(AuthSuccessBlock)success faild:(AuthFailedBlock)failed {
self.isAuth = YES;
self.authSuccessBlock = success;
self.authfailedBlock = failed;
if (!_hasRegisteWeChat) {
_hasRegisteWeChat = [WXApi registerApp:WX_APP_ID];
}
if (![WXApi isWXAppInstalled]) {
_authfailedBlock?_authfailedBlock(@"您尚未安装微信,请选择其它支付方式"):nil;
return;
}
//开始授权啦
SendAuthReq *req = [[SendAuthReq alloc] init];
//应用授权作用域,如获取用户个人信息则填写snsapi_userinfo
req.scope = @"snsapi_userinfo";
//用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
req.state = @"wechatAuth";
//第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
}
2.处理微信回调,对拿到回调的类型做判断,然后根据code码进行会判断处理,如果有微信支付,当然也要判断state
信息是否为 wechatAuth (发送授权信息传入的字符串)
//微信结果回调的方法 收到微信的回应
-(void) onResp:(BaseResp*)resp {
//授权类型的消息
/*
ErrCode ERR_OK = 0(用户同意)
ERR_AUTH_DENIED = -4(用户拒绝授权)
ERR_USER_CANCEL = -2(用户取消)
code 用户换取access_token的code,仅在ErrCode为0时有效
state 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
lang 微信客户端当前语言
country 微信用户当前国家信息
*/
if ([resp isKindOfClass:[SendAuthResp class]]) {
SendAuthResp *authResp = (SendAuthResp *)resp;
switch (resp.errCode) {
case 0:
{
//用户换取access_token的code,仅在ErrCode为0时有效
if ([authResp.state isEqualToString:@"wechatAuth"]) {
[self loginWeixinSuccessWithBaseResp:authResp];
}
}
break;
case -4:
{
if (_authfailedBlock) {
_authfailedBlock(@"用户拒绝授权");
}
}
break;
case -2:
{
if (_authfailedBlock) {
_authfailedBlock(@"用户取消授权");
}
}
break;
default:
break;
}
}
}
3.通过拿到的授权code来获取用户基本信息
APPID: 应用唯一标识,在微信开放平台提交应用审核通过后获得
SECRET:应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
CODE:拉取授权后得到的授权码
http请求方式: GET
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
4.通过上面的接口可以拿到access_token
、refresh_token
、openid
,官方文档说access_token
2个小时后会过期,为了避免不让这个过期,我们在拿到这三个参数时可以做一些判断刷新token,不让他过期。
5.刷新token,获取用户信息
- 判断access_token是否过期
http请求方式: GET
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID- 如果过期了拿
refresh_token
获取一个新的
http请求方式: GET
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN- 根据拿到的
access_token
和openid
放心的去获取用户信息吧
http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
以上方法都是通过HTTP请求获取