iOS 整合Ping++支付,繞過一些坑

weixin_34185560發表於2016-08-31

前言

這一段時間比較忙,主要公司的產品需要重構與加多一個貨幣支付系統。說到移動端的支付,自然會牽扯到支付這一塊。支付這一塊主流的目前就微信、支付寶、銀聯。做過這些SDK整合的開發者都知道,整合相對複雜,而且要花大量的時間去閱讀他們提供的開發文件,不過還好現在有很多開發者都分享了他們的整合心得,使這件事越發簡單,比如:iOS支付[支付寶、銀聯、微信]10分鐘搞定支付寶和微信支付 的 各種填坑等等,但是呢,其實還有更加簡單的,Ping++

Ping++能幹嘛?

Ping++ 是為移動端應用以及 PC 網頁量身打造的下一代支付系統,通過一個 SDK 便可以同時支援移動端以及 PC 端網頁的多種主流支付渠道,你只需要一次接入即可完成多個渠道的接入。 Ping++ SDK 包括 Client SDK 和 Server SDK 兩部分,支援主流的七種後端開發語言,適配了 Android,iOS 和 HTML5 三種移動端平臺以及 PC 端網頁。ps:官方原話。

說說我的理解:
我覺得最方便的是,不需要移動端填寫各種appkey,各種祕鑰,像支付寶支付有祕鑰特別麻煩,這一些繁瑣的事情Ping++都幫你做了,你只要把這些申請下來的key儲存在Ping++的配置資訊系統就可以了。還要申請開通一些許可權,不過這些操作都是我老大弄的,不過很方便就是了。
還有就是一行程式碼就可以調起各種支付這個對做過各種原生支付SDK的我,感覺很清爽,貼下程式碼,感受下:

 [Pingpp createPayment:charge
                   viewController:weakSelf
                     appURLScheme:kUrlScheme
                   withCompletion:^(NSString *result, PingppError *error) {
                     NSLog(@"completion block: %@", result);
                     if (error == nil) {
                       NSLog(@"PingppError is nil");
                     } else {
                       NSLog(@"PingppError: code=%lu msg=%@",
                             (unsigned long)error.code, [error getMsg]);
                     }
                     [weakSelf showAlertMessage:result];
                   }];

使用方法:

1、使用 CocoaPods
在 Podfile 新增:

pod 'Pingpp', '~> 2.2.6'

2、手動引入
下載 iOS SDK 到本地,裡面包含 lib 和 example 兩個目錄。example 目錄下的是示例專案,你需要將 lib 目錄下的檔案新增到你的專案。
具體可以看Ping++的iOS SDK 接入指南

說說我遇到的坑:

首先說下微信支付的SDK再Ping++的Channels是顯示Mmdpay的,剛開始害我找半天...有點誇張哈

313852-a801cd7812dfe81c.png

我這裡由於暫時只用到這兩種支付,所以我把其它的都刪除掉了,現在app都提倡瘦身嘛。

還有一點:
為了能正確獲得結果回撥請在工程 AppDelegate 檔案中呼叫[Pingpp handleOpenURL:url withCompletion:nil]
如果該方法的第二個引數傳 nil,請在在 createPayment 方法的 Completion 中處理回撥結果。否則,在這裡處理結果。
如果你使用了微信分享、登入等一些看起來在這裡“衝突”的模組,你可以先判斷 url 的 host 來決定呼叫哪一方的方法。
也可以先呼叫 Ping++ 的方法,如果 return 的值為 false,表示這個 url 不是支付相關的,你再呼叫模組的方法。
貼上我解決這個問題的程式碼:

// iOS 8 及以下請用這個
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    BOOL isPay = [Pingpp handleOpenURL:url withCompletion:nil];
    if(isPay){
        return isPay;
    }else{
        return  [UMSocialSnsService handleOpenURL:url wxApiDelegate:nil];
    } 
}

這裡值得注意一下,每次呼叫[Pingpp handleOpenURL:url withCompletion:nil]就會執行一次[Pingpp createPayment:(NSObject *) appURLScheme:<#(NSString *)#> withCompletion:<#^(NSString *result, PingppError *error)completion#>]方法裡的回撥。
大概就是這一些了,後續可能還會繼續新增更多的支付功能,如果遇到坑,我還會繼續更新此文章。

參考文章

iOS SDK 接入指南
iOS應用之 "Ping++" 支付整合
Ping++ SDK,引入iOS配置說明

相關文章