微信和支付寶支付-看我的锈麸,用我的就夠了

一、前言

  • 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)一為枚舉,可參考微信


      支付寶支付返回狀態(tài)碼(截圖來自支付寶官方文檔)
    微信支付返回狀態(tài)碼(截圖來自微信官方文檔)
    • (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)目中
    只有兩個(gè)資源文件
    • (2)按照支付寶官方文檔颊咬,導(dǎo)入所需庫

      導(dǎo)入所需庫
    • (3)配置 Info.plist 中的 Url Types 添加支付寶跳轉(zhuǎn) Url Scheme

    添加Url Scheme
  • 2煎娇、微信支付集成(六個(gè)步驟)

    有四個(gè)文件
    • (2)按照微信官方文檔缓呛,導(dǎo)入所需庫

    文檔比較舊,截圖來自官方Demo

    ** 此時(shí)你運(yùn)行官方Demo杭隙,發(fā)現(xiàn)沒任何問題哟绊,但是自己項(xiàng)目中就可能出現(xiàn)下圖的情況,下一步解決*

    如果出現(xiàn)這種錯(cuò)誤痰憎,請(qǐng)看下一步
    • (3)還是再看看官方文檔票髓,雖然舊點(diǎn),你會(huì)發(fā)現(xiàn)铣耘,其實(shí)是少了一個(gè)libc++.tbd 庫洽沟,至于CFNetwork.framework 實(shí)測(cè)不添加也是沒問題的,官方Demo也沒添加蜗细,當(dāng)然最好也添加進(jìn)去

    少了一個(gè)libc++.tbd 庫

    ** *此時(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)該沒問題了
    添加-all_load
    • (5)配置 Info.plist 中的 Url Types 添加微信跳轉(zhuǎn) Url Scheme,此時(shí)就集成完畢了
    添加Url Scheme
    • (6)當(dāng)然此時(shí)運(yùn)行應(yīng)該還有問題白粉,提示少了類 Expected a type传泊,其實(shí)就是 WXApiObject.hWXApi.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、工具中添加了比較完善的斷言

    比較完善的斷言硕盹,避免不必要的錯(cuò)誤

七符匾、注意點(diǎn):

  • 1、Info.plist 配置 Url TypesIdentifier 必須 保證 和 工具中的對(duì)應(yīng)瘩例,默認(rèn)微信的 Identifierweixin 啊胶,支付寶的 Identifierzhifubao,可修改

    /**
     *  @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)干貨~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坊夫,一起剝皮案震驚了整個(gè)濱河市砖第,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌环凿,老刑警劉巖梧兼,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異智听,居然都是意外死亡羽杰,警方通過查閱死者的電腦和手機(jī)渡紫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來考赛,“玉大人腻惠,你說我怎么就攤上這事∮椋” “怎么了集灌?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長复哆。 經(jīng)常有香客問我欣喧,道長,這世上最難降的妖魔是什么梯找? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任唆阿,我火速辦了婚禮,結(jié)果婚禮上锈锤,老公的妹妹穿的比我還像新娘驯鳖。我一直安慰自己,他們只是感情好久免,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布浅辙。 她就那樣靜靜地躺著,像睡著了一般阎姥。 火紅的嫁衣襯著肌膚如雪记舆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天呼巴,我揣著相機(jī)與錄音泽腮,去河邊找鬼。 笑死衣赶,一個(gè)胖子當(dāng)著我的面吹牛诊赊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播府瞄,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼碧磅,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了摘能?” 一聲冷哼從身側(cè)響起续崖,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎团搞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體多艇,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逻恐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片复隆。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拨匆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挽拂,到底是詐尸還是另有隱情惭每,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布亏栈,位于F島的核電站台腥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绒北。R本人自食惡果不足惜黎侈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闷游。 院中可真熱鬧,春花似錦、人聲如沸拟枚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽业簿。三九已至蛛碌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辖源,已是汗流浹背蔚携。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留克饶,地道東北人酝蜒。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像矾湃,于是被迫代替她去往敵國和親亡脑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容