一、微信授權(quán)
1.微信授權(quán)比較簡(jiǎn)單料身,只需要向微信終端發(fā)送一個(gè)SendAuthReq
消息結(jié)構(gòu) 即可拉取授權(quán)汤纸。
/**
發(fā)起微信授權(quán)
@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(@"您尚未安裝微信,請(qǐng)選擇其它支付方式"):nil;
return;
}
//開始授權(quán)啦
SendAuthReq *req = [[SendAuthReq alloc] init];
//應(yīng)用授權(quán)作用域芹血,如獲取用戶個(gè)人信息則填寫snsapi_userinfo
req.scope = @"snsapi_userinfo";
//用于保持請(qǐng)求和回調(diào)的狀態(tài)贮泞,授權(quán)請(qǐng)求后原樣帶回給第三方楞慈。該參數(shù)可用于防止csrf攻擊(跨站請(qǐng)求偽造攻擊),建議第三方帶上該參數(shù)隙畜,可設(shè)置為簡(jiǎn)單的隨機(jī)數(shù)加session進(jìn)行校驗(yàn)
req.state = @"wechatAuth";
//第三方向微信終端發(fā)送一個(gè)SendAuthReq消息結(jié)構(gòu)
[WXApi sendReq:req];
}
2.處理微信回調(diào)抖部,對(duì)拿到回調(diào)的類型做判斷,然后根據(jù)code碼進(jìn)行會(huì)判斷處理议惰,如果有微信支付,當(dāng)然也要判斷state
信息是否為 wechatAuth (發(fā)送授權(quán)信息傳入的字符串)
//微信結(jié)果回調(diào)的方法 收到微信的回應(yīng)
-(void) onResp:(BaseResp*)resp {
//授權(quán)類型的消息
/*
ErrCode ERR_OK = 0(用戶同意)
ERR_AUTH_DENIED = -4(用戶拒絕授權(quán))
ERR_USER_CANCEL = -2(用戶取消)
code 用戶換取access_token的code乡恕,僅在ErrCode為0時(shí)有效
state 第三方程序發(fā)送時(shí)用來(lái)標(biāo)識(shí)其請(qǐng)求的唯一性的標(biāo)志言询,由第三方程序調(diào)用sendReq時(shí)傳入,由微信終端回傳傲宜,state字符串長(zhǎng)度不能超過(guò)1K
lang 微信客戶端當(dāng)前語(yǔ)言
country 微信用戶當(dāng)前國(guó)家信息
*/
if ([resp isKindOfClass:[SendAuthResp class]]) {
SendAuthResp *authResp = (SendAuthResp *)resp;
switch (resp.errCode) {
case 0:
{
//用戶換取access_token的code,僅在ErrCode為0時(shí)有效
if ([authResp.state isEqualToString:@"wechatAuth"]) {
[self loginWeixinSuccessWithBaseResp:authResp];
}
}
break;
case -4:
{
if (_authfailedBlock) {
_authfailedBlock(@"用戶拒絕授權(quán)");
}
}
break;
case -2:
{
if (_authfailedBlock) {
_authfailedBlock(@"用戶取消授權(quán)");
}
}
break;
default:
break;
}
}
}
3.通過(guò)拿到的授權(quán)code來(lái)獲取用戶基本信息
APPID: 應(yīng)用唯一標(biāo)識(shí),在微信開放平臺(tái)提交應(yīng)用審核通過(guò)后獲得
SECRET:應(yīng)用密鑰AppSecret遮晚,在微信開放平臺(tái)提交應(yīng)用審核通過(guò)后獲得
CODE:拉取授權(quán)后得到的授權(quán)碼
http請(qǐng)求方式: GET
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
4.通過(guò)上面的接口可以拿到access_token
钉稍、refresh_token
、openid
报嵌,官方文檔說(shuō)access_token
2個(gè)小時(shí)后會(huì)過(guò)期虱咧,為了避免不讓這個(gè)過(guò)期,我們?cè)谀玫竭@三個(gè)參數(shù)時(shí)可以做一些判斷刷新token,不讓他過(guò)期锚国。
5.刷新token腕巡,獲取用戶信息
- 判斷access_token是否過(guò)期
http請(qǐng)求方式: GET
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID- 如果過(guò)期了拿
refresh_token
獲取一個(gè)新的
http請(qǐng)求方式: GET
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN- 根據(jù)拿到的
access_token
和openid
放心的去獲取用戶信息吧
http請(qǐng)求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
以上方法都是通過(guò)HTTP請(qǐng)求獲取