一:介紹
項目中要用到支付功能,需要支付寶支付、支付寶網頁支付、微信支付、銀聯支付、Apple_pay,所以打算總結一下,方便以后的查閱,也方便大家, 用到的地方避免再次被坑。
今天我們就主要介紹一下銀聯控件支付,其他支付也寫了對應教程,并且給出了連接。
集成前首先要看看文檔,銀聯手機控件支付,里面包含需要的庫文件和詳細的文檔。鑒于小伙伴們不容易找到,好事做到底,送上截圖方便下載。
更多iOS干貨Demo源碼獲取方法
關注 【網羅開發】微信公眾號,選取需要的文章類別,根據序號便可領取。
網羅天下方法,方便你我開發,所有文檔會持續更新,歡迎關注一起成長!
二:支付流程介紹
通過支付控件進行交易的流程如下圖:
流程圖說明:
(1)用戶在客戶端中點擊購買商品,客戶端發起訂單生成請求到商戶后臺;
(2)商戶后臺收到訂單生成請求后,按照《手機控件支付產品接口規范》組織并推送訂單信息至銀聯后臺;
(3)銀聯后臺接收訂單信息并檢查通過后,生成對應交易流水號(即TN),并回復至商戶后臺(應答要素:交易流水號等);
(4)商戶后臺接收到交易流水號(TN),將交易流水號返回至客戶端;
(5)客戶端通過交易流水號(TN)調用支付控件;
(6)用戶在支付控件中輸入相關支付信息后,由支付控件向銀聯后臺發起支付請求;
(7)支付成功后,銀聯后臺將支付結果通知給商戶后臺;
(8)銀聯后臺同時也將支付結果通知支付控件;
(9)支付控件顯示支付結果并將支付結果返回至客戶端;
此處備注:我們是通過后臺獲取訂單,我們可以根據商品id等信息通過后臺接口獲取訂單信息,對訂單支付流程的簽名加密過程后臺完成。
三:下載銀聯SDK
下載之后,找到.h文件和庫文件,使用UPPaymentControl需要將paymentcontrol/inc目錄下UPPaymentControl.h文件和paymentcontrol/libs目錄下的libPaymentControl.a文件添加到商戶應用的工程中
四:工程配置
4.1 導入SDK庫
導入上面那個iOS頭文件和庫下載下載出來的SDK包的就行,然后需要鏈接上依賴庫,在Target —> BuildPhases —> Link Binary With Libraries— 點擊+號 -> 搜索你需要的系統庫。
- CFNetwork.framework
- SystemConfiguration.framework
- libz
- libPaymentControl.a
4.2 設置URL Scheme
在工程info.plist設置中添加一個URL Types回調協議(在UPPayDemo工程中使用“UPPayDemo”作為協議),用于在支付完成后返回商戶客戶端。
4.3 http請求設置
進行http請求時,需要在工程對應的plist文件中添加NSAppTransportSecurity Dictionary 并同時設置里面NSAllowsArbitraryLoads 屬性值為 YES
4.4 添加協議白名單
需要在工程對應的plist文件中,添加LSApplicationQueriesSchemes Array并加入uppaysdk、uppaywallet、uppayx1、uppayx2、uppayx3五個item,如下圖:
4.5 調用支付接口
在調用銀聯支付類里面,首先增加頭文件引用。
#import "UPPaymentControl.h"
在調起支付的方法中代碼如下:
//當獲得的tn不為空時,調用支付接口
if (tn != nil && tn.length > 0) {
[[UPPaymentControl defaultControl]startPay:tn
fromScheme:@"URL Scheme"
mode:tnModel
viewController:self];
}
方法需要的幾個參數文檔上都寫的有,tn是交易流水號,服務器端傳回來的,客戶端只有憑借這個參數才能調用支付控件 進行支付的。只需要調用一個方法就行啦!!!
4.6 支付結果回調
在支付成功之后,支付結果返回,需要獲取url,需要在Appdelegate中完成
在Appdelegate里面,首先增加頭文件引用。
#import "UPPaymentControl.h"
代碼如下:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"uppayresult"]){
//銀聯支付結果
[[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
//結果code為成功時,先校驗簽名,校驗成功后做后續處理
if([code isEqualToString:@"success"]) {
//交易成功
}else if([code isEqualToString:@"fail"]) {
//交易失敗
}else if([code isEqualToString:@"cancel"]) {
//交易取消
}
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"uppayresult"]){
//銀聯支付結果
[[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
//結果code為成功時,先校驗簽名,校驗成功后做后續處理
if([code isEqualToString:@"success"]) {
//交易成功
}else if([code isEqualToString:@"fail"]) {
//交易失敗
}else if([code isEqualToString:@"cancel"]) {
//交易取消
}
}];
}
return YES;
}
4.7 常見問題解決
1.由于支付控件使用到了C、C++和OC混編的情況,將涉及到引用UPPaymentControl.h的源文件的后綴名都改為.mm;
2.由于在UPPayDemo工程中添加了自定義的庫文件libPaymentControl.a,當編譯Demo工程時,應該檢查工程設置Search Paths里的Framework Search Paths、Header Search Paths、Library Search Paths的路徑設置,看設置路徑是否正確,另外還要注意里邊是否多余一些不確定的路徑。
3.控件界面無限加載,請參考控件使用指南iOS “添加SDK包“里“添加-ObjC宏”,特別注意大小寫不要弄混。(此步驟操作有問題時也可修改為 -force_load+空格+控件路徑,如:-force_load (PROJECT_DIR)/ libPaymentControl.a。
希望可以幫助大家
如果哪里有什么不對或者不足的地方,還望讀者多多提意見或建議