在進(jìn)行微信OAuth2.0授權(quán)登錄接入之前,在微信開(kāi)放平臺(tái)注冊(cè)開(kāi)發(fā)者帳號(hào),并擁有一個(gè)已審核通過(guò)的移動(dòng)應(yīng)用,并獲得相應(yīng)的AppID和AppSecret数尿,申請(qǐng)微信登錄且通過(guò)審核后,可開(kāi)始接入流程惶楼。我是從產(chǎn)品那里得到的右蹦,所以就不寫這個(gè)步驟了诊杆。。何陆。
1晨汹、下載SDK
2、將SDK放入工程
我選擇的無(wú)模擬器版
甲献,即“WeChatSDK_1.5_OnlyIphone”,這大約可以省一半的體積(OnlyPhone體積2.2M宰缤,兼容模擬器的體積4.2M)
3颂翼、觀察微信API
通過(guò)我的觀察晃洒,微信API大概可以分為兩部分,一部分是第三方APP發(fā)送信息(文本朦乏,圖片球及,音頻,鏈接等等)到微信的會(huì)話呻疹、朋友圈或者收藏
吃引,還有就是微信授權(quán)登錄
(API中多以Resp,response作結(jié)尾)刽锤,這是我常用的镊尺;另一部分是微信發(fā)送信息給第三方APP,這一部分沒(méi)嘗試過(guò)(API中多以Req,request作結(jié)尾)并思。
4庐氮、補(bǔ)充一些框架
我在使用SDK時(shí)需要添加libc++.dylib
,否則編譯報(bào)錯(cuò),可是官方文檔并沒(méi)有提示宋彼,不知為何弄砍。
5、添加URL scheme
Identifier
中填寫自定義的文本输涕。
6音婶、向微信終端程序注冊(cè)第三方應(yīng)用,并在第三方應(yīng)用實(shí)現(xiàn)從微信返回
在AppDelegate.m中引入"WXApi.h"
頭文件莱坎,然后
7、請(qǐng)求CODE
在要微信授權(quán)登錄的controller中引入"WXApi.h"
頭文件檐什,編寫請(qǐng)求code的代碼瞳收,如下圖:
執(zhí)行該方法后,如果客戶端安裝了微信厢汹,那么就會(huì)向微信請(qǐng)求相應(yīng)的授權(quán)螟深,如圖:
當(dāng)然,實(shí)際使用中烫葬,還要結(jié)合需求做一些變化界弧。因?yàn)槭跈?quán)后凡蜻,諸如token之類的字段,是有有效期的垢箕,在有效期范圍內(nèi)划栓,我們是沒(méi)必要讓用戶再次授權(quán)的,所以条获,很可能你的實(shí)現(xiàn)忠荞,會(huì)如我下面所寫的:
相關(guān)情況,參見(jiàn)刷新或續(xù)期access_token使用
讓AppDelegate遵守<WXApiDelegate>
協(xié)議帅掘,并實(shí)現(xiàn)協(xié)議方法onResp:
委煤,我們?cè)谠摲椒ㄖ薪邮照?qǐng)求回來(lái)的數(shù)據(jù),如下圖:
參數(shù)說(shuō)明:
參數(shù) | 是否必須 | 說(shuō)明 |
---|---|---|
appid | 是 | 應(yīng)用唯一標(biāo)識(shí)碧绞,在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得 |
scope | 是 | 應(yīng)用授權(quán)作用域,如獲取用戶個(gè)人信息則填寫snsapi_userinfo(什么是授權(quán)域) |
state | 否 | 用于保持請(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) |
返回說(shuō)明:
用戶點(diǎn)擊授權(quán)后兴使,微信客戶端會(huì)被拉起,跳轉(zhuǎn)至授權(quán)界面照激,用戶在該界面點(diǎn)擊允許或取消发魄,SDK通過(guò)SendAuth的Resp返回?cái)?shù)據(jù)給調(diào)用方。
返回值 | 說(shuō)明 |
---|---|
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ó)家信息 |
8赏淌、通過(guò)code獲取access_token
獲取第一步的code后,請(qǐng)求以下鏈接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
相關(guān)代碼參見(jiàn)圖片實(shí)現(xiàn)onResp:方法啄清,接收返回的響應(yīng)
圖六水。
參數(shù)說(shuō)明:
參數(shù) | 是否必須 | 說(shuō)明 |
---|---|---|
appid | 是 | 應(yīng)用唯一標(biāo)識(shí),在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得 |
secret | 是 | 應(yīng)用密鑰AppSecret辣卒,在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得 |
code | 是 | 填寫第一步獲取的code參數(shù) |
grant_type | 是 | 填authorization_code |
返回說(shuō)明:
正確的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
參數(shù) | 說(shuō)明 |
---|---|
access_token | 接口調(diào)用憑證 |
expires_in | access_token接口調(diào)用憑證超時(shí)時(shí)間掷贾,單位(秒) |
refresh_token | 用戶刷新access_token |
openid | 授權(quán)用戶唯一標(biāo)識(shí) |
scope | 用戶授權(quán)的作用域,使用逗號(hào)(,)分隔 |
unionid | 只有在用戶將公眾號(hào)綁定到微信開(kāi)放平臺(tái)帳號(hào)后荣茫,才會(huì)出現(xiàn)該字段 |
錯(cuò)誤返回樣例:
{"errcode":40029,"errmsg":"invalid code"}
9想帅、獲取用戶個(gè)人信息(UnionID機(jī)制)
10、最后
最后啡莉,你應(yīng)該還會(huì)有上傳用戶響應(yīng)標(biāo)識(shí)到公司后臺(tái)的需求港准,這具體的實(shí)現(xiàn)就要靠自己的實(shí)現(xiàn)了旨剥。
有的同學(xué)可能已經(jīng)發(fā)現(xiàn),一個(gè)微信授權(quán)需要涉及兩個(gè)大類浅缸,一個(gè)登錄的controller轨帜,一個(gè)是AppDelegate,這兩個(gè)類之間通信,需要代理或者其他設(shè)計(jì)模式來(lái)支持.
大致流程就是這樣衩椒,如有錯(cuò)誤或不足蚌父,歡迎斧正。