iOS銀聯(lián)支付相關(guān)

開發(fā)前的準(zhǔn)備工作

1. 打開 https://open.unionpay.com/ 气笙,后續(xù)說的文檔下載赐劣、FAQ查詢等都在這個(gè)平臺(tái)操作别垮。
2. 下載規(guī)范和開發(fā)包墩蔓。幫助中心-下載-產(chǎn)品接口規(guī)范-手機(jī)控件支付產(chǎn)品接口規(guī)范,幫助中心-下載-產(chǎn)品接口規(guī)范-手機(jī)控件支付產(chǎn)品技術(shù)開發(fā)包同欠。
3. 開發(fā)人員都請(qǐng)先看下6.2的消費(fèi)的交易流程虎囚。
4. 相關(guān)測(cè)試參數(shù):
如果已簽約,有自己的測(cè)試商戶五慈,則直接用自己的商戶號(hào)測(cè)試纳寂,測(cè)試證書開發(fā)包里都有。* 盡量用真實(shí)商戶號(hào)測(cè)試泻拦,防止有時(shí)候參數(shù)配錯(cuò)能盡早發(fā)現(xiàn)毙芜。
如果沒有簽約,或者商戶號(hào)尚未分配争拐,請(qǐng)?jiān)谄脚_(tái)里自行獲取商戶并且開交易權(quán)限腋粥,方法為:
a) 左上角注冊(cè);
b) 登陸后右上角我的測(cè)試-測(cè)試參數(shù)
c) 我的測(cè)試-產(chǎn)品-選下自己集成的架曹。

測(cè)試卡號(hào)信息:
借記卡:6226090000000048
手機(jī)號(hào):18100000000
密碼:111101
短信驗(yàn)證碼:123456
(短信驗(yàn)證碼記得點(diǎn)下獲取驗(yàn)證碼之后再輸入)

貸記卡:6226388000000095隘冲;
手機(jī)號(hào):18100000000;
cvn2:248绑雄;
有效期:1219展辞;
短信驗(yàn)證碼:123456
(短信驗(yàn)證碼記得點(diǎn)下獲取驗(yàn)證碼之后再輸入)

SDK說明

商戶開發(fā)者在獲取到銀聯(lián)提供的開發(fā)包后請(qǐng)檢查SDK文件所在目錄upmp_iphone/paymentcontrol,以下部分提及的文件均在該目錄中万牺。銀聯(lián)支付控件靜態(tài)庫罗珍,以下簡(jiǎn)稱UPPaymentControl,包含以下兩個(gè)文件:
UPPaymentControl.h
libPaymentControl.a

接口說明

  • 1脚粟、支付接口

     - (BOOL)startPay:(NSString*)tn fromScheme:(NSString*)schemeStr mode:(NSString*)mode viewController:(UIViewController*)viewController
    

各個(gè)參數(shù)定義如下表:

支付接口
  • 2覆旱、檢查是否安裝銀聯(lián)App的接口

    - (BOOL)isPaymentAppInstalled
    

    此函數(shù)無傳入?yún)?shù),主要功能檢測(cè)用戶手機(jī)上是否安裝銀聯(lián)支付的APP核无,當(dāng)用戶手機(jī)上安裝了銀聯(lián)支付APP時(shí)候返回YES通殃。

檢查是否安裝銀聯(lián)App接口
  • 3、返回結(jié)果接口
    - (void)handlePaymentResult:(NSURL*)url completeBlock:(UPPaymentResultBlock)completionBlock;

各參數(shù)定義如下表:

返回結(jié)果接口

添加SDK包

使用UPPaymentControl需要將paymentcontrol/inc目錄下UPPaymentControl.h文件和paymentcontrol/libs目錄下的libPaymentControl.a文件添加到商戶應(yīng)用的工程中厕宗,添加后如圖:

工程配置

1画舌、使用UPPaymentControl需要添加CFNetwork.framework、SystemConfiguration.framework 已慢、libz曲聂、libPaymentControl.a到工程中

2、在工程info.plist設(shè)置中添加一個(gè)URL Types回調(diào)協(xié)議(在UPPayDemo工程中使用“UPPayDemo”作為協(xié)議)佑惠,用于在支付完成后返回商戶客戶端朋腋。

3齐疙、http請(qǐng)求設(shè)置
在Xcode7.0之后的版本中進(jìn)行http請(qǐng)求時(shí),需要在工程對(duì)應(yīng)的plist文件中添加NSAppTransportSecurity Dictionary 并同時(shí)設(shè)置里面NSAllowsArbitraryLoads 屬性值為 YES

4旭咽、添加協(xié)議白名單
在Xcode7.0之后的版本中進(jìn)行開發(fā)贞奋,需要在工程對(duì)應(yīng)的plist文件中,添加LSApplicationQueriesSchemes Array并加入uppaysdk穷绵、uppaywallet轿塔、uppayx1、uppayx2仲墨、uppayx3五個(gè)item勾缭,具體設(shè)置可參考以下截圖:

或者直接添加如下代碼到plist文件中:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>uppaysdk</string>
<string>uppaywallet</string>
<string>uppayx1</string>
<string>uppayx2</string>
<string>uppayx3</string>
</array>

調(diào)用插件

在需要調(diào)用支付控件接口的代碼文件內(nèi)引用頭文件UPPaymentControl.h。
(注意:如果工程的compile source as 選項(xiàng)的值不是Objective–C++目养,則引用此頭文件的文件類型都要改為.mm)

  • 1俩由、支付接口調(diào)用
    商戶App從商戶服務(wù)器獲取tn,當(dāng)tn不為空時(shí)癌蚁,調(diào)用支付接口幻梯。

    //當(dāng)獲得的tn不為空時(shí),調(diào)用支付接口
    if (tn != nil && tn.length > 0)
    {
      [[UPPaymentControl defaultControl]startPay:tn  fromScheme:@"UPPayDemo"  mode:self.tnMode  viewController:self]; 
    }
    
  • 2努释、檢測(cè)是否已安裝銀聯(lián)App接口調(diào)用

 if([[UPPaymentControl defaultControl] isPaymentAppInstalled])   
 {
    //當(dāng)判斷用戶手機(jī)上已安裝銀聯(lián)App礼旅,商戶客戶端可以做相應(yīng)個(gè)性化處理
 }
  • 3、返回結(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為商戶APP定義的結(jié)果處理方法,包含兩個(gè)傳入?yún)?shù)code和data龄坪,其中code表示支付結(jié)果昭雌,取值為suceess,fail,cancel分別表示支付成功、支付失敗和支付取消健田,data表示結(jié)果簽名數(shù)據(jù)烛卧,商戶使用銀聯(lián)公鑰驗(yàn)證結(jié)果真實(shí)性。
    對(duì)于新增的簽名信息需注意以下幾點(diǎn):
  1. 前臺(tái)返回的支付結(jié)果中包含銀聯(lián)簽名妓局,要在商戶后臺(tái)對(duì)簽名進(jìn)行校驗(yàn)后才能展示結(jié)果总放。
  2. 前臺(tái)簽名使用的密鑰和算法與后臺(tái)結(jié)果中的簽名一致。
  3. 如果商戶APP在客戶端內(nèi)進(jìn)行簽名驗(yàn)證好爬,要自行實(shí)現(xiàn)簽名密鑰更新的機(jī)制局雄,否則更換密鑰后會(huì)導(dǎo)致驗(yàn)簽失敗。(不推薦)
  4. 商戶訂單是否成功支付應(yīng)該以商戶后臺(tái)收到全渠道返回的支付結(jié)果為準(zhǔn)存炮,此處支付控件返回的結(jié)果僅作為參考炬搭。
    調(diào)用支付接口后蜈漓,結(jié)果處理方法示例代碼:
  - (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
     
    [[UPPaymentControl defaultControl] handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
    
       //結(jié)果code為成功時(shí),先校驗(yàn)簽名宫盔,校驗(yàn)成功后做后續(xù)處理
        if([code isEqualToString:@"success"]) {
        
            //數(shù)據(jù)從NSDictionary轉(zhuǎn)換為NSString
            NSDictionary *data;
            NSData *signData = [NSJSONSerialization dataWithJSONObject:data options:0 error:nil];
            NSString *sign = [[NSString alloc] initWithData:signData encoding:NSUTF8StringEncoding];
        
            //判斷簽名數(shù)據(jù)是否存在
            if(data == nil) {
                //如果沒有簽名數(shù)據(jù)融虽,建議商戶app后臺(tái)查詢交易結(jié)果
                return;
            }    
          
            //驗(yàn)簽證書同后臺(tái)驗(yàn)簽證書
            //此處的verify,商戶需送去商戶后臺(tái)做驗(yàn)簽
            if([self verify:sign]) {
                //支付成功且驗(yàn)簽成功灼芭,展示支付成功提示
            }else {
                //驗(yàn)簽失敗有额,交易結(jié)果數(shù)據(jù)被篡改,商戶app后臺(tái)查詢交易結(jié)果
            }

        }else if([code isEqualToString:@"fail"]) {
            //交易失敗
        }else if([code isEqualToString:@"cancel"]) {
           //交易取消
        }
    }];

    return YES;

  }

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"}"


老版控件用戶修改說明



添加SDK包
使用老版本銀聯(lián)支付控件的商戶請(qǐng)先將老版本銀聯(lián)支付控件從工程中刪除苛预,再將新paymentcontrol/inc目錄下UPPaymentControl.h文件和paymentcontrol/libs目錄下libPaymentControl.a文件添加到商戶應(yīng)用的工程中句狼;添加后如圖:

工程配置
1、使用老版本銀聯(lián)支付控件的商戶請(qǐng)先將工程配置中老版支付控件對(duì)應(yīng)的三方庫刪除热某,再添加CFNetwork.framework腻菇、SystemConfiguration.framework 、libPaymentControl.a昔馋、libz到工程中筹吐;添加后如下圖:

2、在工程info.plist設(shè)置中添加一個(gè)URL Types回調(diào)協(xié)議(在UPPayDemo工程中使用“UPPayDemo”作為協(xié)議)秘遏,用于在支付控件完成支付后返回到商戶客戶端丘薛。

3、添加協(xié)議白名單
在工程對(duì)應(yīng)的plist文件中邦危,添加LSApplicationQueriesSchemes Array并加入uppaysdk洋侨、uppaywallet、uppayx1倦蚪、uppayx2希坚、uppayx3五個(gè)item,具體設(shè)置可參考以下截圖:

或者直接添加以下代碼到plist文件中:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>uppaysdk</string>
<string>uppaywallet</string>
<string>uppayx1</string>
<string>uppayx2</string>
<string>uppayx3</string>
</array>

接口說明和調(diào)用插件
請(qǐng)參考4.2接口說明和4.4調(diào)用插件說明陵且。

常見問題總結(jié)
更多請(qǐng)參見https://open.unionpay.com幫助中心-FAQ
怎樣加-ObjC宏
選擇工程targets——》build settings ->Linking->other linker flags

編譯時(shí)提示Undefined for architecture XXX 錯(cuò)誤
如:

1)由于支付控件使用到了C裁僧、C++和OC混編的情況,所以商戶工程引入U(xiǎn)PPaymentControl.h頭文件以后可能會(huì)出現(xiàn)鏈接錯(cuò)誤慕购,這個(gè)時(shí)候可以通過以下三種方式解決:
① 將涉及到引用UPPaymentControl.h的源文件的后綴名都改為.mm聊疲;
② 如果商戶不想修改源文件的后綴名,可以在工程中添加一個(gè)空的繼承自NSObject的類沪悲,并將文件.m后綴名該改為.mm即可方法為new file->Objective-C class->類名自取->保存->修改后綴名為.mm售睹;
③ 將工程的compile source as 選項(xiàng)的值設(shè)置為Objective–C++;

2)由于在UPPayDemo工程中添加了自定義的庫文件libPaymentControl.a
可训,當(dāng)編譯Demo工程時(shí)昌妹,應(yīng)該檢查工程設(shè)置Search Paths里的Framework Search Paths捶枢、Header Search Paths、Library Search Paths的路徑設(shè)置飞崖,看設(shè)置路徑是否正確烂叔,另外還要注意里邊是否多余一些不確定的路徑。

  1. 將xcode工程中Build Setting -> Apple LLVM compiler Language 標(biāo)簽下的C++ Language Dialect 和 C++ Standard Library 屬性值修改為 Compiler Default如實(shí)在無法解決固歪,嘗試添加-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ò)蒲讯。
    控件閃退異常'NSInvalidArgumentException', reason: '-[__NSCFConstantString newSizeWithFont:詳略]'
    'NSInvalidArgumentException', reason: '-[__NSCFConstantString newSizeWithFont:以下略]: unrecognized selector sent to instance 0x[隨機(jī)數(shù)]'

出現(xiàn)以上問題是由于添加-ObjC宏的地方?jīng)]有配置正確忘朝,如果配-ObjC實(shí)在解決不了的話,可嘗試去掉-ObjC判帮,改為-force_load+空格+控件路徑局嘁,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a。
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)代碼控制橫豎屏,勿修改配置抗楔。
其他第三方靜態(tài)庫(如支付寶棋凳、微信等)的文件產(chǎn)生沖突duplicate symbols for architecture XXX
如:

請(qǐng)嘗試將添加-ObjC宏的地方修改為 -force_load+空格+控件路徑,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a谓谦,這樣做不會(huì)影響支付寶等其他支付渠道功能。
控件界面無限加載

  1. 調(diào)用控件的邏輯應(yīng)當(dāng)在主線程中執(zhí)行贪婉,子線程中盡量不要進(jìn)行UI操作反粥,無限加載等待實(shí)際是子線程死鎖所致。
  2. 請(qǐng)參考控件使用指南iOS “添加SDK包“里“添加-ObjC宏”疲迂,特別注意大小寫不要弄混才顿。(此步驟操作有問題時(shí)也可修改為 -force_load+空格+控件路徑,如:-force_load $(PROJECT_DIR)/ libPaymentControl.a)尤蒿。
  3. Build Setting -> Apple LLVM compiler Language-C++:
    Attempt to present XX on XX while a presentation is in progress!
    Warning: Attempt to present <UPNavController: 0x8bc24d0> on <tttViewController: 0x8b9a390> while a presentation is in progress!animation完成的時(shí)候再調(diào)用我們的插件郑气,兩個(gè)present同時(shí)起會(huì)出警告。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腰池,一起剝皮案震驚了整個(gè)濱河市尾组,隨后出現(xiàn)的幾起案子忙芒,更是在濱河造成了極大的恐慌,老刑警劉巖讳侨,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵萨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡跨跨,警方通過查閱死者的電腦和手機(jī)潮峦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇婴,“玉大人忱嘹,你說我怎么就攤上這事「剩” “怎么了拘悦?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萨螺。 經(jīng)常有香客問我窄做,道長(zhǎng),這世上最難降的妖魔是什么慰技? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任椭盏,我火速辦了婚禮,結(jié)果婚禮上吻商,老公的妹妹穿的比我還像新娘掏颊。我一直安慰自己,他們只是感情好艾帐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布乌叶。 她就那樣靜靜地躺著,像睡著了一般柒爸。 火紅的嫁衣襯著肌膚如雪准浴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天捎稚,我揣著相機(jī)與錄音乐横,去河邊找鬼。 笑死今野,一個(gè)胖子當(dāng)著我的面吹牛葡公,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播条霜,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼催什,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了宰睡?” 一聲冷哼從身側(cè)響起蒲凶,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤气筋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后豹爹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裆悄,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年臂聋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了光稼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孩等,死狀恐怖艾君,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肄方,我是刑警寧澤冰垄,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站权她,受9級(jí)特大地震影響虹茶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隅要,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一蝴罪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧步清,春花似錦要门、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谴轮,卻和暖如春炒瘟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背第步。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工疮装, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雌续。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓斩个,卻偏偏與公主長(zhǎng)得像胯杭,于是被迫代替她去往敵國和親驯杜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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