一、前言
1牺蹄、之前寫了一篇支付寶支付——統(tǒng)一wap和支付寶錢包回調(diào),然后有需求說也弄一個(gè)微信支付的忘伞,block回調(diào),其實(shí)微信支付的API提供挺好的沙兰,只有一個(gè)代理方法處理支付結(jié)果氓奈,不像支付寶有兩種回調(diào),當(dāng)然鼎天,使用block回調(diào)簡單很多舀奶,所以我也單獨(dú)封裝了 微信支付,block回調(diào) 此處就不開篇講解了训措,大家需要的話可以去我的gitHub上clone
2伪节、還有提出要整合支付寶和微信,這個(gè)提議不錯(cuò)绩鸣,因?yàn)榧芍Ц豆δ艿腶pp一般都有支付寶和微信怀大,既然兩種都需要,那么統(tǒng)一管理豈不是很方便呀闻!所以本篇主要講解統(tǒng)一管理的工具封裝化借。
二、支付寶和微信API分析
-
作者在此對(duì)比了支付寶和微信的支付API捡多,分析一下它們接口的異同點(diǎn):支付寶官方文檔 微信官方文檔
(1)支付寶是不需要在
didFinishLaunchingWithOptions
中注冊(cè)蓖康,而微信則需要調(diào)用registerApp
注冊(cè)(2)支付寶有web回調(diào)铐炫,而微信沒有,當(dāng)然這個(gè)對(duì)整合沒影響(因?yàn)樽罱K都要統(tǒng)一成一個(gè)回調(diào))
(3)支付寶發(fā)起支付是傳入訂單信息(字符串類型)蒜焊,而微信則傳入一個(gè)
BaseReq
類或者其子類(支付的是PayReq
類)倒信,此時(shí)根據(jù)這點(diǎn)差異性可以通過傳入id 類型,然后內(nèi)部做判斷泳梆,進(jìn)行跳轉(zhuǎn)不同的支付方式鳖悠,來看看他們的接口
支付寶發(fā)起支付
/** * 支付接口 * * @param orderStr 訂單信息 * @param schemeStr 調(diào)用支付的app注冊(cè)在info.plist中的scheme * @param completionBlock 支付結(jié)果回調(diào)Block,用于wap支付結(jié)果回調(diào)(非跳轉(zhuǎn)錢包支付) */ - (void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
微信發(fā)起支付
/*! @brief 發(fā)送請(qǐng)求到微信优妙,等待微信返回onResp * * 函數(shù)調(diào)用后乘综,會(huì)切換到微信的界面。第三方應(yīng)用程序等待微信返回onResp套硼。 微信在異步處理完成后一定會(huì)調(diào)用onResp卡辰。支持以下類型 * SendAuthReq、SendMessageToWXReq邪意、PayReq等九妈。 * @param req 具體的發(fā)送請(qǐng)求,在調(diào)用函數(shù)后抄罕,請(qǐng)自己釋放允蚣。 * @return 成功返回YES于颖,失敗返回NO呆贿。 */ +(BOOL) sendReq:(BaseReq*)req;
(4)支付寶發(fā)起支付不單單傳入訂單信息,還需要傳入appSchemes(就是在Info - URL Types 中配置的 App Schemes)森渐,而微信 發(fā)起支付只需要傳入訂單信息做入,它的appSchemes 在
didFinishLaunchingWithOptions
注冊(cè)的時(shí)候已經(jīng)傳入了,因此可以考慮 我也在didFinishLaunchingWithOptions
中給支付寶綁定一個(gè) appSchemes 同衣,類似微信竟块,然后在發(fā)起支付的時(shí)候就不需要傳入,只需要在內(nèi)部獲取就行耐齐,當(dāng)然浪秘,由于Url Scheme 是存儲(chǔ)在Info.plist
文件中,因此可以用代碼獲取埠况,就不需要調(diào)用者傳入了耸携,只需要按照本工具的規(guī)定就搞定-
(5)支付寶的支付返回狀態(tài)不是以枚舉類型返回,是用過回調(diào)中返回的字典中的 resultStatus 字段辕翰,而微信是通過枚舉返回夺衍,此時(shí)可以統(tǒng)一為枚舉,可參考微信
- (6)支付寶每一個(gè)狀態(tài)碼都對(duì)應(yīng)一個(gè)狀態(tài)信息喜命,而微信則只有錯(cuò)誤的時(shí)候(errCode = -1)才有對(duì)應(yīng)狀態(tài)信息沟沙,可參考支付寶河劝,手動(dòng)給微信添加返回狀態(tài)信息
三、集成
-
1矛紫、支付寶支付集成 (三個(gè)步驟)
- (1)由于支付寶不支持Pod赎瞎,那么下載最新的SDK,拖到項(xiàng)目中
-
(2)按照支付寶官方文檔颊咬,導(dǎo)入所需庫
(3)配置
Info.plist
中的Url Types
添加支付寶跳轉(zhuǎn) Url Scheme
-
2煎娇、微信支付集成(六個(gè)步驟)
- (1)同樣微信也不支持Pod,下載最新的SDK贪染,拖到項(xiàng)目中
- (2)按照微信官方文檔缓呛,導(dǎo)入所需庫
** 此時(shí)你運(yùn)行官方Demo杭隙,發(fā)現(xiàn)沒任何問題哟绊,但是自己項(xiàng)目中就可能出現(xiàn)下圖的情況,下一步解決*- (3)還是再看看官方文檔票髓,雖然舊點(diǎn),你會(huì)發(fā)現(xiàn)铣耘,其實(shí)是少了一個(gè)libc++.tbd 庫洽沟,至于CFNetwork.framework 實(shí)測(cè)不添加也是沒問題的,官方Demo也沒添加蜗细,當(dāng)然最好也添加進(jìn)去
** *此時(shí)command + b 發(fā)現(xiàn)successfully 了裆操,但當(dāng)你高高興興地運(yùn)行的時(shí)候,你會(huì)發(fā)現(xiàn)炉媒,程序崩潰了踪区,提示如下,斷點(diǎn)調(diào)試的時(shí)候發(fā)現(xiàn)其實(shí)就是 調(diào)用微信的registerApp
方法出現(xiàn)的 **- (4)在
build settings
下面的Other Linker Flags
添加-ObjC
吊骤,如果依然不行缎岗,改為-all_load
此時(shí)應(yīng)該沒問題了
- (5)配置
Info.plist
中的Url Types
添加微信跳轉(zhuǎn) Url Scheme,此時(shí)就集成完畢了
- (6)當(dāng)然此時(shí)運(yùn)行應(yīng)該還有問題白粉,提示少了類
Expected a type
传泊,其實(shí)就是WXApiObject.h
和WXApi.h
少導(dǎo)入了UIKit
框架,因?yàn)槲⑿殴俜紻emo中用到了PCH 文件,文件中導(dǎo)入了UIKit
框架,手動(dòng)添加進(jìn)去就沒問題了
四鸭巴、封裝 API
1眷细、單例模式,項(xiàng)目中唯一奕扣,方便統(tǒng)一管理
/**
* @author gitKong
*
* 單例管理
*/
+ (instancetype)shareManager;
2薪鹦、處理回調(diào)url,需要在AppDelegate中實(shí)現(xiàn)
/**
* @author gitKong
*
* 處理跳轉(zhuǎn)url,回到應(yīng)用池磁,需要在delegate中實(shí)現(xiàn)
*/
- (BOOL)fl_handleUrl:(NSURL *)url;
3奔害、注冊(cè)app,需要在 didFinishLaunchingWithOptions 中調(diào)用地熄,綁定URL Scheme
/**
* @author gitKong
*
* 注冊(cè)App华临,需要在 didFinishLaunchingWithOptions 中調(diào)用
*/
- (void)fl_registerApp;
4、發(fā)起支付端考,傳入訂單參數(shù)類型是id雅潭,傳入如果是字符串,則對(duì)應(yīng)是跳轉(zhuǎn)支付寶支付却特;如果傳入PayReq 對(duì)象扶供,這跳轉(zhuǎn)微信支付,注意,不能傳入空字符串或者nil裂明,內(nèi)部有對(duì)應(yīng)斷言;統(tǒng)一了回調(diào)椿浓,不管是支付寶的wap 還是 app,或者是微信支付闽晦,都是通過這個(gè)block回調(diào)扳碍,回調(diào)狀態(tài)碼都有對(duì)應(yīng)的狀態(tài)信息
/**
* @author gitKong
*
* 發(fā)起支付
*
* @param orderMessage 傳入訂單信息,如果是字符串,則對(duì)應(yīng)是跳轉(zhuǎn)支付寶支付仙蛉;如果傳入PayReq 對(duì)象笋敞,這跳轉(zhuǎn)微信支付,注意,不能傳入空字符串或者nil
* @param callBack 回調(diào)荠瘪,有返回狀態(tài)信息
*/
- (void)fl_payWithOrderMessage:(id)orderMessage callBack:(FLCompleteCallBack)callBack;
五夯巷、用法(基于SDK集成后)
1、在
AppDelegate
處理回調(diào)巧还,一般只需要實(shí)現(xiàn)后面兩個(gè)方法即可鞭莽,為了避免不必要的麻煩坊秸,最好三個(gè)都寫上
/**
* @author gitKong
*
* 最老的版本麸祷,最好也寫上
*/
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [FLPAYMANAGER fl_handleUrl:url];
}
/**
* @author gitKong
*
* iOS 9.0 之前 會(huì)調(diào)用
*/
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [FLPAYMANAGER fl_handleUrl:url];
}
/**
* @author gitKong
*
* iOS 9.0 以上(包括iOS9.0)
*/
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options{
return [FLPAYMANAGER fl_handleUrl:url];
}
2、在
didFinishLaunchingWithOptions
中注冊(cè) app褒搔,內(nèi)部綁定根據(jù)Info中對(duì)應(yīng)的Url Types 綁定URL Scheme
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 注冊(cè)app
[FLPAYMANAGER fl_registerApp];
return YES;
}
3阶牍、發(fā)起支付
- 支付寶支付
NSString *orderMessage = @"Demo 中 有 可測(cè)試的 訂單信息";
[FLPAYMANAGER fl_payWithOrderMessage:orderMessage callBack:^(FLErrCode errCode, NSString *errStr) {
NSLog(@"errCode = %zd,errStr = %@",errCode,errStr);
}];
- 微信支付
//調(diào)起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = [dict objectForKey:@"partnerid"];
req.prepayId = [dict objectForKey:@"prepayid"];
req.nonceStr = [dict objectForKey:@"noncestr"];
req.timeStamp = stamp.intValue;
req.package = [dict objectForKey:@"package"];
req.sign = [dict objectForKey:@"sign"];
[FLPAYMANAGER fl_payWithOrderMessage:req callBack:^(FLErrCode errCode, NSString *errStr) {
NSLog(@"errCode = %zd,errStr = %@",errCode,errStr);
}];
六、此工具的優(yōu)點(diǎn)
1星瘾、隔離框架走孽,統(tǒng)一管理,維護(hù)方便
2琳状、針對(duì)支付功能來封裝一套API磕瓷,用法簡單,可讀性強(qiáng)
3、融合支付寶 和 微信 接口的優(yōu)點(diǎn)困食,例如完善微信返回狀態(tài)碼對(duì)應(yīng)的狀態(tài)信息
4边翁、對(duì)支付寶 和 微信的 回調(diào)處理都統(tǒng)一 成一個(gè) block回調(diào)
-
5、工具中添加了比較完善的斷言
七符匾、注意點(diǎn):
-
1、
Info.plist
配置Url Types
的Identifier
必須 保證 和 工具中的對(duì)應(yīng)瘩例,默認(rèn)微信的Identifier
是weixin
啊胶,支付寶的Identifier
是zhifubao
,可修改/** * @author gitKong * * 此處必須保證在Info.plist 中的 URL Types 的 Identifier 對(duì)應(yīng)一致 */ #define FLWECHATURLNAME @"weixin" #define FLALIPAYURLNAME @"zhifubao"
2垛贤、因?yàn)楣ぞ咧刑砑恿吮容^完善的斷言焰坪,配置不完整或者是傳參不正確,程序都會(huì)不可避免的崩潰
3聘惦、由于工具中都耦合可支付寶SDK 以及 微信SDK琳彩,如果項(xiàng)目中只需要用到單個(gè)支付,此時(shí)就不適用了部凑,當(dāng)然露乏,獨(dú)立的也有:
支付寶支付——統(tǒng)一wap和支付寶錢包回調(diào)
微信支付-block回調(diào)
八、總結(jié)
1涂邀、內(nèi)部實(shí)現(xiàn)代碼都比較簡單瘟仿,這里就不作詳細(xì)分析,Demo中都有相對(duì)于的注釋比勉,gitHub 地址 在此劳较,給個(gè) star 支持支持~
2、封裝的思路以及分析都已經(jīng)詳細(xì)說明了浩聋,如果大家有什么疑惑或者新的想法都可以留言給我,我都會(huì)一一回復(fù)观蜗!
3、歡迎大家關(guān)注我衣洁,喜歡就給個(gè)like墓捻,打賞也會(huì)厚臉無恥地收下,我會(huì)隨時(shí)更新原創(chuàng)干貨~