iOS开发技术之银联支付
p.p1 { margin: 0; font: 24px "PingFang SC"; color: rgba(51, 51, 51, 1) }
p.p2 { margin: 0; font: 14px "PingFang SC"; color: rgba(0, 0, 0, 1) }
p.p3 { margin: 0 0 10px; font: 16px "Helvetica Neue"; color: rgba(47, 47, 47, 1) }
p.p4 { margin: 0; font: 14px "PingFang SC"; color: rgba(0, 0, 0, 1); min-height: 20px }
p.p5 { margin: 0; font: 14px "Microsoft YaHei"; color: rgba(0, 0, 0, 1) }
p.p6 { margin: 0; font: 14px "PingFang SC"; color: rgba(0, 0, 0, 1) }
p.p7 { margin: 0; font: 16px "Helvetica Neue"; color: rgba(0, 0, 0, 1); min-height: 18px }
p.p8 { margin: 0; font: 14px "Microsoft YaHei"; color: rgba(0, 0, 0, 1) }
p.p9 { margin: 0; font: 14px "PingFang SC"; color: rgba(0, 0, 0, 1); min-height: 20px }
p.p10 { margin: 0; font: 14px "PingFang SC"; color: rgba(0, 0, 0, 1) }
p.p11 { margin: 0; font: 14px "PingFang SC"; color: rgba(0, 0, 0, 1); min-height: 20px }
span.s1 { font-kerning: none }
span.s2 { font: 16px "Helvetica Neue"; font-kerning: none; color: rgba(47, 47, 47, 1) }
span.s3 { font: 14px "PingFang SC"; font-kerning: none }
span.s4 { font: 14px "Microsoft YaHei"; font-kerning: none }
span.s5 { font: 14px "PingFang SC"; font-kerning: none; color: rgba(0, 0, 0, 1) }
一、集成銀聯SDK步驟:
1、查看開發文檔
https://open.unionpay.com/ajweb/index
2、下載SDK
https://open.unionpay.com/ajweb/help/file/techFile?productId=3
3、支付流程說明:
(1)用戶在客戶端中點擊購買商品,客戶端發起訂單生成請求到商戶后臺;
(2)商戶后臺收到訂單生成請求后,按照《手機控件支付產品接口規范》組織并推送訂單信息至銀聯后臺;
(3)銀聯后臺接收訂單信息并檢查通過后,生成對應交易流水號(即TN),并回復至商戶后臺(應答要素:交易流水號等);
(4)商戶后臺接收到交易流水號(TN),將交易流水號返回至客戶端;
(5)客戶端通過交易流水號(TN)調用支付控件;
(6)用戶在支付控件中輸入相關支付信息后,由支付控件向銀聯后臺發起支付請求;
(7)支付成功后,銀聯后臺將支付結果通知給商戶后臺;
(8)銀聯后臺同時也將支付結果通知支付控件;
(9)支付控件顯示支付結果并將支付結果返回至客戶端;
此處備注:我們是通過后臺獲取訂單,我們可以根據商品id等信息通過后臺接口獲取訂單信息,對訂單支付流程的簽名加密過程后臺完成。
4、添加SDK包
使用UPPaymentControl需要將paymentcontrol/inc目錄下UPPaymentControl.h文件和paymentcontrol/libs目錄下的libPaymentControl.a文件添加到商戶應用的工程中
5、添加系統庫和工程配置
a.http請求設置
在Xcode的版本中進行http請求時,需要在工程對應的plist文件中添加NSAppTransportSecurity Dictionary 并同時設置里面NSAllowsArbitraryLoads 屬性值為YES
b.使用UPPaymentControl需要添加
CFNetwork.framework、SystemConfiguration.framework 、libz、libPaymentControl.a到工程中.
c.在工程info.plist設置中添加一個URL Types回調協議(在UPPayDemo工程中使用“UPPayDemo”作為協議),用于在支付完成后返回商戶客戶端。
d.添加協議白名單
在Xcode7.0之后的版本中進行開發,需要在工程對應的plist文件中,添加LSApplicationQueriesSchemes Array并加入uppaysdk、uppaywallet、uppayx1、uppayx2、uppayx3五個item
6、加-ObjC宏
選擇工程targets——》build settings ->Linking->other linker flags
7、調用插件
在需要調用支付控件接口的代碼文件內引用頭文件UPPaymentControl.h。
(注意:如果工程的compile source as 選項的值不是Objective–C++,則引用此頭文件的文件類型都要改為.mm)
商戶App從商戶服務器獲取tn(注:先通過調用后臺接口獲取訂單信息)
* @param tn 訂單信息
* @param schemeStr 調用支付的app注冊在info.plist中的scheme
* @param mode 支付環境"00"代表接入生產環境(正式版本需要);"01"代表接入開發測試環境
* @param viewController 啟動支付控件的viewController
* @return 返回成功失敗
//當獲得的tn不為空時,調用支付接口 if (tn != nil && tn.length > 0) {
[[UPPaymentControl defaultControl] startPay:tn fromScheme:@"UPPay" mode:self.tnMode viewController:self];
}
if([[UPPaymentControl defaultControl] isPaymentAppInstalled])
{
//當判斷用戶手機上已安裝銀聯App,商戶客戶端可以做相應個性化處理
}
8、返回結果接口調用
支付控件結果處理函數handlePaymentResult: completeBlock:需要在工程AppDelegate文件的application: openURL: sourceApplication: annotation: 方法中進行調用。
支付控件結果處理函數handlePaymentResult: completeBlock:包含兩個參數,參數1url為支付結果串,由handlePaymentResult: completeBlock:方法解析url內容;參數2completionBlock為商戶APP定義的結果處理方法,包含兩個傳入參數code和data,其中code表示支付結果,取值為suceess,fail,cancel分別表示支付成功、支付失敗和支付取消,data表示結果簽名數據,商戶使用銀聯公鑰驗證結果真實性。
completeBlock中的NSDictionary *data結構如下:
sign —— 簽名后做Base64的數據
data —— 用于簽名的原始數據,結構如下:
pay_result —— 支付結果success,fail,cancel
tn —— 訂單號
Data轉換為String后的示例如下:
"{"sign":"ZnZY4nqFGu/ugcXNIhniJh6UDVriWANlHtIDRzV9w120E6tUgpL9Z7jIFzWrSV73hmrkk8BZMXMc/9b8u3Ex1ugnZn0OZtWfMZk2I979dxp2MmOB+1N+Zxf8iHr7KNhf9xb+VZdEydn3Wc/xX/B4jncg0AwDJO/0pezhSZqdhSivTEoxq7KQTq2KaHJmNotPzBatWI5Ta7Ka2l/fKUv8zr6DGu3/5UaPqHhnUq1IwgxEWOYxGWQgtyTMo/tDIRx0OlXOm4iOEcnA9DWGT5hXTT3nONkRFuOSyqS5Rzc26gQE6boD+wkdUZTy55ns8cDCdaPajMrnuEByZCs70yvSgA==","data":"pay_result=success&tn=201512151321481233778"}"
對于新增的簽名信息需注意以下幾點:
1. 前臺返回的支付結果中包含銀聯簽名,要在商戶后臺對簽名進行校驗后才能展示結果。
2. 前臺簽名使用的密鑰和算法與后臺結果中的簽名一致。
3. 如果商戶APP在客戶端內進行簽名驗證,要自行實現簽名密鑰更新的機制,否則更換密鑰后會導致驗簽失敗。(不推薦)
4. 商戶訂單是否成功支付應該以商戶后臺收到全渠道返回的支付結果為準,此處支付控件返回的結果僅作為參考。
二、注意事項:
1、編譯時提示Undefined for architecture XXX 錯誤
1)由于支付控件使用到了C、C++和OC混編的情況,所以商戶工程引入UPPaymentControl.h頭文件以后可能會出現鏈接錯誤,這個時候可以通過以下三種方式解決:
① 將涉及到引用UPPaymentControl.h的源文件的后綴名都改為.mm;
② 如果商戶不想修改源文件的后綴名,可以在工程中添加一個空的繼承自NSObject的類,并將文件.m后綴名該改為.mm即可方法為new file->Objective-Cclass->類名自取->保存->修改后綴名為.mm;
③ 將工程的compile source as 選項的值設置為Objective–C++;
2)由于在UPPayDemo工程中添加了自定義的庫文件libPaymentControl.a
,當編譯Demo工程時,應該檢查工程設置Search Paths里的Framework Search Paths、Header Search Paths、Library Search Paths的路徑設置,看設置路徑是否正確,另外還要注意里邊是否多余一些不確定的路徑。
3) 將xcode工程中Build Setting -> Apple LLVM compiler Language 標簽下的C++ Language Dialect 和 C++ Standard Library 屬性值修改為 Compiler Default如實在無法解決,嘗試添加-ObjC宏的地方修改為 -force_load+空格+控件路徑,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a,如果還報錯,上下文應該會有libPaymentControl.a文件找不到異常,比如ld: file not found: /Users/apple/Desktop/Communication 2/ libPaymentControl.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)
請確定libPaymentControl.a文件確實存在于此路徑,可能為上下文路徑配錯。
2、控件閃退異常'NSInvalidArgumentException', reason: '-[__NSCFConstantString newSizeWithFont:詳略]'
出現以上問題是由于添加-ObjC宏的地方沒有配置正確,如果配-ObjC實在解決不了的話,可嘗試去掉-ObjC,改為-force_load+空格+控件路徑,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a。
3、orientation異常
詳細現象為控件崩潰,報錯信息:Terminating app due to uncaught exception ‘UIApplicationInvalidInterfaceOrientation’, reason: ‘Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES’ 請勿修改橫豎屏配置,iphone控件只能豎屏,ipad控件才支持橫豎屏。如果app本身為橫屏,請代碼控制橫豎屏,勿修改配置。
4、其他第三方靜態庫(如支付寶、微信等)的文件產生沖突duplicate symbols for architecture XXX
請嘗試將添加-ObjC宏的地方修改為 -force_load+空格+控件路徑,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a,這樣做不會影響支付寶等其他支付渠道功能。
5、控件界面無限加載
1. 調用控件的邏輯應當在主線程中執行,子線程中盡量不要進行UI操作,無限加載等待實際是子線程死鎖所致。2. 請參考控件使用指南ios“添加SDK包“里“添加-ObjC宏”,特別注意大小寫不要弄混。(此步驟操作有問題時也可修改為 -force_load+空格+控件路徑,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a)。3. Build Setting -> Apple LLVM compiler Language-C++
總結
以上是生活随笔為你收集整理的iOS开发技术之银联支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux定时备份mysql数据库文件脚
- 下一篇: linux区分个系统脚本