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