銀聯支付,支付
一、概述
銀聯手機支付控制項(以下簡稱支付控制項),主要為合作商戶的手機用戶端或手機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的路徑設定,看設定路徑是否正確,另外還要注意裡邊是否多餘一些不確定的路徑