一、概述銀聯手機支付控制項(以下簡稱支付控制項),主要為合作商戶的手機客戶端或手機Web網站提供安全、便捷的支付服務。目前支付控制項支持Android和iOS兩個平臺,用戶通過在支付控制項中輸入銀行卡卡號、手機號、密碼(借記卡和預付卡)或者CVN2、有效期(信用卡)、驗證碼等要素完成支付。二、支付流程介紹通...
一、概述
銀聯手機支付控制項(以下簡稱支付控制項),主要為合作商戶的手機客戶端或手機Web網站提供安全、便捷的支付服務。目前支付控制項支持Android和iOS兩個平臺,用戶通過在支付控制項中輸入銀行卡卡號、手機號、密碼(借記卡和預付卡)或者CVN2、有效期(信用卡)、驗證碼等要素完成支付。
二、支付流程介紹
通過支付控制項進行交易的流程如下圖:
流程圖說明:
(1)用戶在客戶端中點擊購買商品,客戶端發起訂單生成請求到商戶後臺;
(2)商戶後臺收到訂單生成請求後,按照《UPMP商戶接入介面規範》組織並推送訂單信息至銀聯後臺;
(3)銀聯後臺接收訂單信息並檢查通過後,生成對應交易流水號(即TN),並回覆交易流水號至商戶後臺(應答要素:交易流水號等);
(4)商戶後臺接收到交易流水號,將交易流水號返回給客戶端;
(5)客戶端通過交易流水號(TN)調用支付控制項;
(6)用戶在支付控制項中輸入相關支付信息後,由支付控制項向銀聯後臺發起支付請求;
(7)支付成功後,銀聯後臺將支付結果通知給商戶後臺;
(8)銀聯將支付結果通知支付控制項;
(9)支付控制項顯示支付結果並將支付結果返回給客戶端;
註: 本文檔主要關註上述流程中(5)、(9)部分的實現
目前各個平臺支持的設備情況如下:
Android平臺SDK主要適用於Android 2.1及以上版本的終端設備;
iOS版本支付控制項適用iOS 5.1及以上版本終端設備。
二、測試帳號
- 提供測試使用卡號、手機號信息(此類信息僅供測試,不會發生正式交易)
招商銀行預付費卡:
卡號:6226 4401 2345 6785
密碼:111101
三、iOS客戶端
本小節提供給那些具有一定iOS編程經驗和瞭解面向對象概念的讀者使用。
SDK文件所在目錄:upmp_iphone/sdk,以下部分所說文件,均在該目錄中查找。
- SDK說明
SDK分為以下兩個版本:
- 支持純無卡交易靜態庫,以下簡稱UPPayPlugin,包含文件:
UPPayPlugin.h
UPPayPluginDelegate.h
libUPPayPlugin.a
- 支持純無卡交易和VIPOS音頻口支付靜態庫,以下簡稱UPPayPluginPro,包含文件:
UPPayPluginPro.h
UPPayPluginDelegate.h
libUPPayPluginPro.a
- 介面說明
各個參數的介紹如表3-1:
表3-1 介面參數說明
- 添加SDK包
- 根據商戶選擇的SDK版本,將sdk/inc目錄和sdk/libs目錄下對應版本的三個文件添加到UPPayDemo工程中;
- 如果你選擇的是UPPayPlugin版本,添加QuartzCore.framework、Security.framework到工程中;
- 如果你選擇的是UPPayPluginPro版本,添加QuartzCore.framework、AudioToolbox.framework, CoreAudio.framework、 MediaPlayer.framework, AVFoundation.framework和Security.framework到工程中;
- 在工程的Build Settings中找到Other Linker Flags中添加-ObjC巨集;
- 調用插件
- 在需要調用支付控制項的源文件內引用頭文件UPPayPlugin.h或UPPayPluginPro.h(註意:如果工程的compile source as 選項的值不是Objective–C++,則引用此頭文件的文件類型都要改為.mm)
- 通過調用
+ (BOOL)startPay:(NSString*)tn
mode:(NSString*)mode
viewController:(UIViewController*)viewController
delegate:(id<UPPayPluginDelegate>)delegate;
實現控制項的調用
- 處理支付結果
銀聯手機支付控制項有三個支付狀態返回值:success、fail、cancel,分別代表:支付成功、支付失敗、用戶取消支付。這三個返回狀態值以字元串的形式作為回調函數參數(NSString*)result返回。通過在工程中添加頭文件“UPPayPluginDelegate.h”,在處理交易結果的界面,實現UPPayPluginDelegate介面,根據該頭文件中的回調函數:-(void)UPPayPluginResult:(NSString*)result來實現回調方法,從而可以根據支付結果的不同進行相關的處理。
四、Android客戶端
本小節提供給那些具有一定Android編程經驗和瞭解面向對象概念的讀者使用。
- SDK包說明
SDK分為以下兩個版本:
- 支持純無卡交易版本,該版本主要位於upmp_android/sdknocard目錄下:
apk目錄下包括了通過apk方式接入的UPPayPluginEx.apk
jar目錄下包括了靜態庫集成方式所需要的jar包、so文件(支持arm,armv7,x86和mips平臺)和資源文件。
註意:
data.bin文件為圖片資源文件,必須存放在工程的res/drawable目錄下;
UPPayPluginEx.jar為jar包形式的控制項,必須存放在工程的libs目錄下;
libentryex.so為動態庫文件,請根據需要存放於工程的libs/xxx/目錄下,其中xxx為armeabi,armeabi-v7a,mips,x86之一。
- 支持純無卡交易和有卡交易的版本,有卡交易支持銀聯的迷你IC卡產品、智能SD卡產品、VIPOS產品等,該版本主要位於upmp_android/sdkPro目錄下:
apk目錄下包括了通過apk方式接入的UPPayPluginExPro.apk
jar目錄下包括了靜態庫集成方式所需要的jar包、so文件(支持arm,armv7,x86和mips平臺)和資源文件。
註意:
data.bin文件為圖片資源文件,必須存放在工程的res/drawable目錄下;
UPPayPluginExPro.jar為jar包形式的控制項,必須存放在工程的libs目錄下;
libentryexpro.so為動態庫文件,請根據需要存放於工程的libs/xxx/目錄下,其中xxx為armeabi,armeabi-v7a,mips,x86之一。
- 介面說明
upmp_android/UPPayAssistEx.jar包中定義了啟動支付控制項的介面,介面定義如下:
其它輔助介面:
- 添加SDK包
拷貝upmp_android\sdknocard\UPPayAssistEx.jar(或upmp_android\sdkPro\UPPayAssistEx.jar)到工程的libs\目錄下;
同時也可將upmp_android\sdknocard\apk\UPPayPluginEx.apk (或upmp_android\sdkPro\apk\UPPayPluginExPro.apk)複製到客戶端工程的assets目錄下,效果如下圖:
接著請右鍵單擊工程,選擇Build Path中的 Configure Build Path …,選中Libraries這個tab,並通過Add Jars…導入工程libs目錄下的UPPayAssistEx.jar包。如下圖:
- 調用支付控制項
- 在調用支付控制項的代碼文件中引入UPPayAssistEx類如:
- 接著可以通過以下方式調用支付控制項:
支付完成後,獲取支付控制項支付結果,並添加相應處理邏輯,只需實現調用Activity中的onActivityResult()方法即可,實例代碼如下:
五、手機Web站點
- 支持瀏覽器
- UC瀏覽器Android版本(通過方式一接入,對方式二能支持,但不檢測)
- UC瀏覽器iOS版本(通過方式二接入)
- QQ瀏覽器Android版本 3.6及以上(通過方式二接入)
- 360瀏覽器Android版本2.7及以上(通過方式二接入)
- Opera瀏覽器Android HD版本1.3及以上(通過方式二接入)
- 系統原生瀏覽器Android版本和iOS版本(僅支持通過方式二接入)
具體信息參考附錄一
- 方式一
調用支付控制項的Web頁面需要嵌入代碼
其中<embed>為銀聯手機支付UC插件標簽項,在UC瀏覽器中顯示為銀聯手機支付按鈕, 。其中前幾個參數,不要進行修改:
type="application/x-unionpayplugin" uc_plugin_id="unionpay" height="53" width="178"
其中,訂單信息部分構成參考Web訂單生成。
支付控制項頁面嵌入代碼範例(消費交易)
- 方式二
調用銀聯手機支付控制項頁面需要嵌入代碼
其中,<a>為銀聯手機支付非UC瀏覽器接入控制項採用標簽項,在非UC瀏覽器中顯示為銀聯手機支付按鈕, 。銀聯手機支付圖標部分指明該圖標的路徑。
支付控制項頁面嵌入代碼範例
- Web訂單生成
展示在Web頁面上的訂單信息生成方式如下:
- 將表5-1中訂單信息中的resultURL的值採用URLEncode方式進行編碼,按表5-1的格式與其他欄位拼接出訂單信息。
- 將步驟a)中產生的結果採用base64進行編碼。
- 將步驟b)中產生的結果採用URLEncode方式進行編碼得到最終展示的數據。
即:
paydata = urlEncode(base64(“tn=” + tn + ”, resultURL=” + urlEncode(resultURL) + ”, usetestmode=” + usetestmode))
Web站點訂單中的每個參數對由參數值組成,參數間“,”隔開。參數間不要有空格,格式如下:
表5-1 web訂單構成
表5-2 訂單信息域說明
- 接入瀏覽器方案推薦
- 針對UC、QQ、360瀏覽器(瀏覽器伺服器上版本為最新的)直接頁面顯示對應tag就可以
- 針對Opera(雖然對接了,但是其伺服器上尚未提供較新版本插件下載),頁面提示支持的控制項版本,並告知用戶查看控制項版本的方式和升級的地址
- 針對未對接的瀏覽器(主要包括原生瀏覽器),按照方式2處理
- 控制項下載地址
Android
http://mobile.unionpay.com/getclient?platform=android&type=securepayplugin
iOS
http://mobile.unionpay.com/getclient?platform=ios&type=securepayplugin
六、開發者註意事項
- 通過瀏覽器方式接入支付控制項時,傳入的resultURL應該可以接受參數,並且需要採用URLEncode方式進行編碼,編碼之前的url形式如:
https://example.com/example?argName=
七、常見問題總結
- iOS平臺常見問題
- 編譯錯誤解決
UPPayDemo工程在編譯的過程中可能會出現Undefined symbols for architecture armv6/armv7/i386的編譯錯誤。如果出現這樣的錯誤,有以下幾種解決辦法:
1)由於支付控制項使用到了C、C++和OC混編的情況,所以商戶工程引入UPPayPlugin.h頭文件以後可能會出現鏈接錯誤。這個時候可以通過兩種方式解決:
① 將涉及到引用UPPayPlugin.h的源文件的尾碼名都改為.mm;
② 如果商戶不想修改源文件的尾碼名,可以在工程中添加一個空的繼承自NSObject的類,並將文件.m尾碼名該改為.mm即可。方法為new file->Objective-C class->類名自取->保存->修改尾碼名為.mm。
③ 將工程的compile source as 選項的值不是Objective–C++;
2)由於在UPPayDemo工程中添加了自定義的庫文件libUPPayPlugin.a,當編譯Demo工程時,應該檢查工程設置Search Paths里的Framework Search Paths、Header Search Paths、Library Search Paths的路徑設置,看設置路徑是否正確,另外還要註意裡邊是否多餘一些不確定的路徑