目前手頭的項(xiàng)目終于算是收尾了鹰椒,在項(xiàng)目進(jìn)行的過程中遇到的問題在接下來的時(shí)間里锡移,我會(huì)抽空整理出來,免得以后踩坑漆际,也是為了便于以后的開發(fā)工作淆珊。
這次就主要說一下微信三方登錄、分享和支付的集成工作
1.微信三方庫的集成
集成三方庫就不用多說了奸汇,主要就是手動(dòng)集成和使用pod導(dǎo)入施符。詳情可看微信開發(fā)者平臺官方文檔介紹
2.微信三方登錄的實(shí)現(xiàn)
微信三方庫成功加入到當(dāng)前項(xiàng)目中之后钞支,恭喜你已經(jīng)完成了一半的工作了。接下來我們來看微信三方登錄的實(shí)現(xiàn)操刀。先來一張微信官方的時(shí)序圖:
從圖中我們可以看出烁挟,實(shí)現(xiàn)微信登錄主要分為三大步驟(簡稱三步走),即:
- 第三方應(yīng)用(即自己的應(yīng)用)發(fā)起微信授權(quán)登錄請求骨坑,用戶允許授權(quán)后撼嗓,微信會(huì)重定向到自己的應(yīng)用,并且返回授權(quán)臨時(shí)票據(jù)code參數(shù)欢唾;
- 第三方應(yīng)用利用授權(quán)臨時(shí)票據(jù)code且警、AppID、AppSecret等來換取access_token(這個(gè)token是微信用戶三方授權(quán)登錄的token礁遣,別跟自己應(yīng)用的token搞混淆);
- 通過access_token調(diào)用接口斑芜,獲取用戶基本數(shù)據(jù)資源。
只要搞懂把握好這三步走戰(zhàn)略祟霍,勝利之門始終為你敞開杏头。
接下來詳細(xì)說說三步走戰(zhàn)略的具體內(nèi)容:
a. 請求code
要想得到授權(quán)臨時(shí)票據(jù),就需要自己的應(yīng)用想微信終端發(fā)送請求并拉起微信應(yīng)用進(jìn)行授權(quán)登錄沸呐,用戶確認(rèn)后醇王,微信將會(huì)重定向返回到自己的應(yīng)用,并返回code崭添。
iOS平臺授權(quán)登錄代碼示例:
-(void)sendAuthRequest {
//構(gòu)造SendAuthReq結(jié)構(gòu)體
SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ];
req.scope = @"snsapi_userinfo" ;
req.state = @"123" ;
//第三方向微信終端發(fā)送一個(gè)SendAuthReq消息結(jié)構(gòu)
[WXApi sendReq:req];
}
b. 獲取access_token
獲取到code之后寓娩,就開始三步走戰(zhàn)略的第二步了,獲取access_token:
通過請求微信提供的url來請求獲取到access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
很明顯的呼渣,這就是個(gè)GET請求棘伴,從url中?
之后的就是請求所需要的參數(shù),分別是appid屁置、secret焊夸、code和grant_type,只需要替換=
后面的即可缰犁。
至此淳地,我們的第二步戰(zhàn)略已經(jīng)結(jié)束
c. 獲取用戶基本信息
通過上面的第二步走方針,我們獲取到了access_token帅容,通過access_token可以換取用戶基本信息(用戶昵稱颇象、性別、省并徘、市遣钳、國家、頭像等信息)麦乞,跟第二步走很類似蕴茴,也是要請求 微信給出的一個(gè)url來請求獲取到數(shù)據(jù)劝评。
同樣還是GET請求
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
到這里微信的授權(quán)登錄三步走流程已經(jīng)結(jié)束,通過三步走倦淀,我們也獲取到了access_token蒋畜、openid、unionid和其他基本信息撞叽,后續(xù)的登錄流程就要根據(jù)實(shí)際需求來了姻成。
--------我是后續(xù)補(bǔ)充的--------
在使用微信三方登錄的時(shí)候,往往要先判斷一下本機(jī)是否安裝了微信APP客戶端愿棋,在WXApi中也封裝了檢測是否安裝微信客戶端的方法(是個(gè)類方法)科展。
/*! @brief 檢查微信是否已被用戶安裝
*
* @return 微信已安裝返回YES,未安裝返回NO糠雨。
*/
+(BOOL) isWXAppInstalled;
直接使用[WXApi isWXAppInstalled]
就可以判斷是否已經(jīng)安裝了微信客戶端
但是才睹,但是,但是:前提是你要把微信添加到白名單中甘邀,不然即便你的手機(jī)上安裝了微信客戶端琅攘,也同樣的返回的是NO
,怎么添加白名單,簡單地說鹃答,就是在plist
文件中添加如下代碼:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
3.微信分享的實(shí)現(xiàn)
微信分享及收藏是指第三方App通過接入該功能乎澄,讓用戶可以從App分享文字、圖片测摔、音樂、視頻解恰、網(wǎng)頁至微信好友會(huì)話锋八、朋友圈或添加到微信收藏。
微信分享的最主要流程就是根據(jù)實(shí)際需求护盈,把要分享的DD封裝成特定類型的數(shù)據(jù)挟纱,然后發(fā)送調(diào)起微信分享即可。
分享或收藏的目標(biāo)場景腐宋,通過修改scene場景值實(shí)現(xiàn)紊服。
發(fā)送到聊天界面——WXSceneSession
發(fā)送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite
4.微信支付的實(shí)現(xiàn)
支付的最主要流程一般都是放在后臺服務(wù)器進(jìn)行的,在客戶端主要負(fù)責(zé)的任務(wù)就是在后臺統(tǒng)一下單后胸竞,根據(jù)返回的參數(shù)調(diào)起微信應(yīng)用進(jìn)行付款操作欺嗤,然后再通過后臺查詢實(shí)際支付結(jié)果(微信回調(diào)也有支付結(jié)果,不過最好是以后臺查詢?yōu)闇?zhǔn))卫枝。
字段名 | 變量名 | 類型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
應(yīng)用ID | appid | String(32) | 是 | wx8888888888888888 | 微信開放平臺審核通過的應(yīng)用APPID |
商戶號 | partnerid | String(32) | 是 | 1900000109 | 微信支付分配的商戶號 |
預(yù)支付交易會(huì)話ID | prepayid | String(32) | 是 | WX1217752501201407033233368018 | 微信返回的支付交易會(huì)話ID |
擴(kuò)展字段 | package | String(128) | 是 | Sign=WXPay | 暫填寫固定值Sign=WXPay |
隨機(jī)字符串 | noncestr | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機(jī)字符串煎饼,不長于32位。推薦隨機(jī)數(shù)生成算法 |
時(shí)間戳 | timestamp | String(10) | 是 | 1412000000 | 時(shí)間戳校赤,請見接口規(guī)則-參數(shù)規(guī)定 |
簽名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 簽名吆玖,詳見簽名生成算法 |
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯(cuò)誤 | 可能的原因:簽名錯(cuò)誤筒溃、未注冊APPID、項(xiàng)目設(shè)置APPID不正確沾乘、注冊的APPID與設(shè)置的不匹配怜奖、其他異常等。 |
-2 | 用戶取消 | 無需處理翅阵。發(fā)生場景:用戶不支付了烦周,點(diǎn)擊取消,返回APP怎顾。 |
返回結(jié)果
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯(cuò)誤 | 可能的原因:簽名錯(cuò)誤读慎、未注冊APPID、項(xiàng)目設(shè)置APPID不正確槐雾、注冊的APPID與設(shè)置的不匹配夭委、其他異常等。 |
-2 | 用戶取消 | 無需處理募强。發(fā)生場景:用戶不支付了株灸,點(diǎn)擊取消,返回APP擎值。 |
總結(jié)
與微信相關(guān)的三方登錄授權(quán)慌烧、微信支付、微信分享已經(jīng)全部說完鸠儿,但是還有一個(gè)很大的問題屹蚊,假設(shè)一個(gè)應(yīng)用中有很多地方都需要微信分享或者支付,很多頁面都將會(huì)寫入很多重復(fù)性的代碼进每,不利于后期維護(hù)和管理汹粤,并且微信SDK的回調(diào)是在appdelegate中,這樣就要使用通知等手段來及時(shí)的獲取到支付或分享結(jié)果田晚,如果這樣嘱兼,弊端很多。你們可以下載微信官方的demo,看看官方demo是怎么處理這些邏輯的贤徒,自己也可以參照(最簡單的方法就是把微信官方demo中的那個(gè)單例類拉到自己項(xiàng)目中用)demo用更好的方法來處理芹壕。
官方demo中的處理方法可以用下圖來簡單說明: