android移動(dòng)支付——銀聯(lián)支付

      網(wǎng)友投稿 1341 2025-03-31

      前言


      這里開篇講解一系列的Android相關(guān)的移動(dòng)支付。移動(dòng)支付也稱為手機(jī)支付,用戶使用移動(dòng)的設(shè)備,完成對(duì)所購(gòu)買商品或者服務(wù)的支付功能。包括遠(yuǎn)程支付(網(wǎng)上支付、短信支付),近場(chǎng)支付(刷卡、滴卡、pos機(jī))。

      國(guó)內(nèi)的移動(dòng)支付方式:

      支付寶,微信,銀聯(lián),百度錢包,QQ錢包,財(cái)付通,京東支付

      易寶支付,快錢支付,還有一些第三方的支付什么連連支付之類的

      境外的移動(dòng)支付方式(這里直說一個(gè)) :paypal

      流程

      我們這里主要是來學(xué)習(xí)一下支付寶,微信支付,銀聯(lián)支付和paypal支付

      現(xiàn)實(shí)生活中的支付就是:去商店瀏覽商品->把商品加入購(gòu)物車->把購(gòu)物車中的商品拿到收銀臺(tái)付款

      上面的支付流程細(xì)化下來就是:

      1.瀏覽商品

      2.把要買的商品加入購(gòu)物車

      3.把商品拿到收銀臺(tái),收銀人員處理商品信息

      4.告訴收銀員支付方式

      5.選擇支付方式進(jìn)行支付

      6.處理支付結(jié)果(成功、失敗、取消)

      程序中的支付流程中:

      1.瀏覽商品

      2.把要買的商品加入購(gòu)物車

      3.把購(gòu)物車中的商品信息和用戶信息和支付方式等信息發(fā)送到自己服務(wù)器,服務(wù)器處理商品信息生成訂單,并返回”支付串”給客戶端

      4.客戶端拿著“支付串”,調(diào)用第三方服務(wù)(支付寶、微信、銀聯(lián)、paypal等)完成支付

      5.處理支付結(jié)果(成功、失敗、取消)

      l??同步返回:支付后通知我們的客戶端

      l??異步通知:支付后通知我們的服務(wù)端

      以上就是一般的移動(dòng)支付的基本流程了,下面看這幾個(gè)支付平臺(tái)的詳細(xì)介紹

      android移動(dòng)支付——支付寶支付

      android移動(dòng)支付——微信支付

      android移動(dòng)支付——銀聯(lián)支付

      android移動(dòng)支付——PayPal支付

      銀聯(lián)支付

      1.概述

      銀聯(lián)支付有很多種類型,我們這里主要說的是手機(jī)控件支付

      銀聯(lián)手機(jī)支付控件主要應(yīng)用于各類手機(jī)電子商務(wù)平臺(tái)的支付應(yīng)用。銀聯(lián)控件合作商戶的手機(jī)客戶端(或網(wǎng)站)內(nèi)集成(或調(diào)用)銀聯(lián)支付控件后,持卡人在合作商戶上即可使用銀聯(lián)手機(jī)支付安全控件進(jìn)行安全的、便捷的即時(shí)支付,同時(shí),保障用戶銀行卡信息的安全。

      2.支付流程

      流程圖說明:

      (1)用戶在客戶端中點(diǎn)擊購(gòu)買商品,客戶端發(fā)起訂單生成請(qǐng)求到商戶后臺(tái);

      (2)商戶后臺(tái)收到訂單生成請(qǐng)求后,按照《手機(jī)控件支付產(chǎn)品接口規(guī)范》組織并推送訂單信息至銀聯(lián)后臺(tái);

      (3)銀聯(lián)后臺(tái)接收訂單信息并檢查通過后,生成對(duì)應(yīng)交易流水號(hào)(即TN),并回復(fù)交易流水號(hào)至商戶后臺(tái)(應(yīng)答要素:交易流水號(hào)等);

      (4)商戶后臺(tái)接收到交易流水號(hào),將交易流水號(hào)返回給客戶端;

      (5)客戶端通過交易流水號(hào)(TN)調(diào)用支付控件;

      (6)用戶在支付控件中輸入相關(guān)支付信息后,由支付控件向銀聯(lián)后臺(tái)發(fā)起支付請(qǐng)求;

      (7)支付成功后,銀聯(lián)后臺(tái)將支付結(jié)果通知給商戶后臺(tái);

      (8)銀聯(lián)將支付結(jié)果通知支付控件;

      (9)支付控件顯示支付結(jié)果并將支付結(jié)果返回給客戶端;

      注: 本文檔主要關(guān)注上述流程中(5)、(9)部分的實(shí)現(xiàn)

      目前各個(gè)平臺(tái)支持的設(shè)備情況如下:

      Android平臺(tái)SDK主要適用于Android 2.3及以上版本的終端設(shè)備;

      3.測(cè)試賬號(hào)

      提供測(cè)試使用卡號(hào)、手機(jī)號(hào)信息(此類信息僅供測(cè)試,不會(huì)發(fā)生正式交易)

      招商銀行借記卡:6226090000000048

      手機(jī)號(hào):18100000000

      密碼:111101

      短信驗(yàn)證碼:123456(先點(diǎn)獲取驗(yàn)證碼之后再輸入)

      證件類型:01身份證

      證件號(hào):510265790128303

      姓名:張三

      華夏銀行貸記卡:6226388000000095

      手機(jī)號(hào):18100000000

      cvn2:248

      有效期:1219

      短信驗(yàn)證碼:123456(先點(diǎn)獲取驗(yàn)證碼之后再輸入)

      證件類型:01身份證

      證件號(hào):510265790128303

      姓名:張三

      4.接入SDK和一些文檔的說明

      技術(shù)支持和業(yè)務(wù)說明的一些東西

      手機(jī)控件支付SDK下載demo還有相關(guān)的接入文檔之類的jar包

      因?yàn)橄螺d下來的銀聯(lián)手機(jī)控件支付開發(fā)包里面的demo工程都還沒配好的,還有是用eclipse的,一些說明也在下載回來的控件使用指南的文檔中有了,這里也會(huì)列出來,現(xiàn)在我改用Androidstudio來完成這個(gè)demo,如下:

      4.1 SDK包說明

      商戶開發(fā)者在獲取到銀聯(lián)提供的開發(fā)包后請(qǐng)檢查SDK文件所在目錄upmp_android/sdkProSDK,以下部分提及的文件均在該目錄中:

      apk目錄下包括了支付控件的apk:UPPayPluginExPro.apk

      jar目錄下包括了商戶集成所需要的jar包、so文件(支持arm,armv7,x86,x86_64和arm64-v8a平臺(tái))和資源文件。

      UPPayAssistEx.jar定義了調(diào)用支付控件所需要的接口。

      4.2接口說明

      1、 支付接口

      upmp_android/UPPayAssistEx.jar中定義了啟動(dòng)支付控件的接口,接口定義如下:

      public static int startPay(Activity activity, String spId, String sysProvider, String orderInfo, String mode)

      參數(shù)說明:

      activity —— 用于啟動(dòng)支付控件的活動(dòng)對(duì)象

      spId —— 保留使用,這里輸入null

      sysProvider —— 保留使用,這里輸入null

      orderInfo —— 訂單信息為交易流水號(hào),即TN,為商戶后臺(tái)從銀聯(lián)后臺(tái)獲取。

      mode —— 銀聯(lián)后臺(tái)環(huán)境標(biāo)識(shí),“00”將在銀聯(lián)正式環(huán)境發(fā)起交易,“01”將在銀聯(lián)測(cè)試環(huán)境發(fā)起交易

      返回值:

      UPPayAssistEx.PLUGIN_VALID —— 該終端已經(jīng)安裝控件,并啟動(dòng)控件

      UPPayAssistEx.PLUGIN_NOT_FOUND — 手機(jī)終端尚未安裝支付控件,需要先安裝支付控件

      2、檢查是否安裝銀聯(lián)Apk的接口

      upmp_android/UPPayAssistEx.jar中定義了檢測(cè)銀聯(lián)apk是否安裝的接口,接口定義如下:

      public static boolean checkInstalled (Context context)

      參數(shù)說明:

      activity —— 用于啟動(dòng)支付控件的context環(huán)境

      返回值:

      true —— 該終端已經(jīng)安裝控件apk

      false — 該終端未安裝控件apk

      4.3???????添加SDK包

      (1)可以自己新建一個(gè)工程來寫demo,也可以利用Androidstudio導(dǎo)入eclipse的demo

      生成Androidstudio的工程

      (2)在appàsrcàmain新建一個(gè)assets文件夾,拷貝upmp_android/sdkPro/jar/data.bin到工程的assets/目錄下;

      (3)在main目錄下新建一個(gè)jniLibs,然后再拷貝upmp_android/sdkPro/jar/xxx/libentryexpro.so和upmp_android/sdkPro/jar/xxx/libuptsmaddon.so到工程的libs/xxx/目錄下,其中xxx為 armeabi-v7a、armeabi、arm64-v8a、x86、x86_64之一。

      arm64-v8a(x86_64)是針對(duì)arm64(x86 64)架構(gòu)優(yōu)化的庫(kù)文件,引入工程后在arm64(x86 64)機(jī)型上性能會(huì)提升,但是最終生成的程序包將變大。注意: 如果工程中使用了其他的.so庫(kù),那么需要所有.so庫(kù)都有arm64-v8a(x86_64)的版本。

      (4)app目錄下新建libs,拷貝upmp_android/sdkPro/UPPayAssistEx.jar到工程的libs/目錄下;

      拷貝upmp_android/sdkPro/jar/UPPayPluginExPro.jar到工程的libs/目錄下,然后進(jìn)行依賴jar包;

      效果如下圖:

      (5)在工程的AndroidManifest.xml文件中注冊(cè)支付插件使用的Activity。添加如下

      android:name="com.unionpay.uppayplugin.demo.JARActivity"

      android:label="@string/jar" >

      android:name="com.unionpay.uppay.PayActivity"

      android:configChanges="orientation|keyboardHidden|keyboard"

      android:screenOrientation="portrait">

      android:name="com.unionpay.UPPayWapActivity"

      android:configChanges="orientation|keyboardHidden|fontScale"

      android:screenOrientation="portrait"

      android:windowSoftInputMode="adjustResize" >

      同時(shí)添加權(quán)限:

      注意:版本編譯時(shí)的target應(yīng)選用OpenMobile API,建議level19以上

      (6)調(diào)用支付控件

      1、支付接口調(diào)用

      a)?????????????????在調(diào)用支付控件的代碼文件中引入U(xiǎn)PPayAssistEx類如:

      import com.unionpay.UPPayAssistEx;

      b)?????接著可以通過以下方式調(diào)用支付控件:

      // “00” – 銀聯(lián)正式環(huán)境

      // “01” – 銀聯(lián)測(cè)試環(huán)境,該環(huán)境中不發(fā)生真實(shí)交易

      String serverMode = "01";

      UPPayAssistEx.startPay (activity, null,null, tn, serverMode);

      支付完成后,獲取支付控件支付結(jié)果,并添加相應(yīng)處理邏輯,只需實(shí)現(xiàn)調(diào)用Activity中的onActivityResult()方法即可,支付成功時(shí)會(huì)返回商戶客戶端支付結(jié)果的簽名信息。

      對(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é)果僅作為參考。

      示例代碼如下:

      protected void onActivityResult( int requestCode,

      int resultCode,

      Intent data)

      {undefined

      if( data ==null ){undefined

      return;

      }

      String str =??data.getExtras().getString("pay_result");

      if( str.equalsIgnoreCase(R_SUCCESS) ){undefined

      // 支付成功后,extra中如果存在result_data,取出校驗(yàn)

      // result_data結(jié)構(gòu)見c)result_data參數(shù)說明

      if(data.hasExtra("result_data")) {undefined

      String sign =??data.getExtras().getString("result_data");

      // 驗(yàn)簽證書同后臺(tái)驗(yàn)簽證書

      // 此處的verify,商戶需送去商戶后臺(tái)做驗(yàn)簽

      if(verify(sign)) {undefined

      //驗(yàn)證通過后,顯示支付結(jié)果

      showResultDialog(" 支付成功! ");

      } else {undefined

      // 驗(yàn)證不通過后的處理

      // 建議通過商戶后臺(tái)查詢支付結(jié)果

      }

      android移動(dòng)支付——銀聯(lián)支付

      } else {undefined

      // 未收到簽名信息

      // 建議通過商戶后臺(tái)查詢支付結(jié)果

      }

      }else if( str.equalsIgnoreCase(R_FAIL) ){undefined

      showResultDialog(" 支付失敗! ");

      }else if( str.equalsIgnoreCase(R_CANCEL) ){undefined

      showResultDialog(" 你已取消了本次訂單的支付! ");

      }

      }

      c)??????result_data參數(shù)說明:

      參數(shù)說明:

      sign —— 簽名后做Base64的數(shù)據(jù)

      data —— 用于簽名的原始數(shù)據(jù)

      data中原始數(shù)據(jù)結(jié)構(gòu)

      pay_result —— 支付結(jié)果success,fail,cancel

      tn??????????—— 訂單號(hào)

      result_data示例如下:

      "{"sign":"ZnZY4nqFGu/ugcXNIhniJh6UDVriWANlHtIDRzV9w120E6tUgpL9Z7jIFzWrSV73hmrkk8BZMXMc/9b8u3Ex1ugnZn0OZtWfMZk2I979dxp2MmOB+1N+Zxf8iHr7KNhf9xb+VZdEydn3Wc/xX/B4jncg0AwDJO/0pezhSZqdhSivTEoxq7KQTq2KaHJmNotPzBatWI5Ta7Ka2l/fKUv8zr6DGu3/5UaPqHhnUq1IwgxEWOYxGWQgtyTMo/tDIRx0OlXOm4iOEcnA9DWGT5hXTT3nONkRFuOSyqS5Rzc26gQE6boD+wkdUZTy55ns8cDCdaPajMrnuEByZCs70yvSgA==","data":"pay_result=success&tn=201512151321481233778"}"

      2、檢測(cè)是否已安裝銀聯(lián)Apk接口調(diào)用

      if(UPPayAssistEx.checkInstalled(context))

      {undefined

      //當(dāng)判斷用戶手機(jī)上已安裝銀聯(lián)Apk,商戶客戶端可以做相應(yīng)個(gè)性化處理

      }

      (7)老版SDK商戶修改說明

      對(duì)于原有sdk接入商戶,可在原有修改的基礎(chǔ)上更新對(duì)應(yīng)文件后,還需增加如下修改:

      1.?????增加upmp_android/sdkPro/jar/xxx/libuptsmaddon.so

      2.????在工程的AndroidManifest.xml文件增加UPPayWapActivity。添加如下:

      android:name="com.unionpay.UPPayWapActivity"

      android:configChanges="orientation|keyboardHidden"

      android:screenOrientation="portrait"

      android:windowSoftInputMode="adjustResize"/>

      3.????調(diào)用接口改為4.2節(jié)中支付接口startPay,但原有的startPayByJAR接口仍保留,如下所示:

      public static int startPayByJAR (Activity activity, Class payCls, String spId, String sysProvider, String orderInfo, String mode)

      參數(shù)說明:

      activity??—— 用于啟動(dòng)支付控件的活動(dòng)對(duì)象

      payCls ——支付插件代表的類,填入“PayActivty.class”即可

      spId??—— 保留使用,這里輸入null

      sysProvider —— 保留使用,這里輸入null

      orderInfo??—— 訂單信息為交易流水號(hào),即TN,為商戶后臺(tái)從銀聯(lián)后臺(tái)獲取。

      mode??—— 銀聯(lián)后臺(tái)環(huán)境標(biāo)識(shí),“00”將在銀聯(lián)正式環(huán)境發(fā)起交易,“01”將在銀聯(lián)測(cè)試環(huán)境發(fā)起交易

      5.常見問題總結(jié)

      更多請(qǐng)參見https://open.unionpay.com幫助中心-FAQ

      1.???java.lang.ClassNotFoundException:org.simalliance.openmobileapi.SEService

      此條異常僅會(huì)打印異常棧,而不會(huì)引起控件崩潰,無(wú)視即可。

      2.java.io.FileNotFoundException: UPPayPluginExPro.apk

      請(qǐng)將開發(fā)包中的UPPayPluginExPro.apk更改文件名為 UPPayPluginEx.apk后再放到assets文件夾下,可參考控件指南。

      3.demo代碼UPPayAssistEx.installPlugin調(diào)用后無(wú)反應(yīng)/“完成購(gòu)買需要安裝銀聯(lián)支付控件,是否安裝?”的確定按鈕點(diǎn)擊后無(wú)反應(yīng)

      同上一問。

      4.java.lang.NoClassDefFoundError:com.unionpay.UPPayAssistEx

      1.?工程里看看jar包是不是放對(duì)。

      2.?Jar包是不是加到build path里。

      3.?eclipse等工具里,工程上右鍵java build path-order andexport里需要勾上jar包。

      5.Unable to start activity ComponentInfo(…): java.lang.NullPointerException《=UPPayEngine.a報(bào)的空指針

      如:

      比較大的可能:傳進(jìn)控件的tn參數(shù)不能為空或空值。

      Jar方式接入也有可能:data.bin文件沒有放對(duì)位置,請(qǐng)參照控件指南放。

      6.?Permission異常

      如:

      java.lang.RuntimeException: Unable to start activityComponentInfo{com.unionpay.uppayplugin.demo/com.unionpay.uppay.PayActivity}:java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10065 norcurrent process has android.permission.READ_PHONE_STATE.

      請(qǐng)檢查一下權(quán)限是否在AndroidManifest文件中定義:

      7.java.lang.UnsatisfiedLinkErrror: Couldn’t load entryexpro: findLibrary return null或java.lang.UnsatisfiedLinkErrror: Library entryex not found

      libentryexpro.so文件應(yīng)放置到libs/CPU名比如armeabi目錄下。2.1.2及以下控件的.so文件直接放libs目錄下的,升級(jí)2.1.3及以上控件時(shí),請(qǐng)務(wù)必注意目錄層級(jí)多了CPU名的文件夾。

      8.java.lang.NoClassDefFoundError: com.unionpay.uppay.PayActivity

      請(qǐng)將相關(guān)的jar包拷貝至libs目錄下,然后再add to build path。

      9.can’t find reference class org.openmobileapi.SEService

      如:

      出現(xiàn)該錯(cuò)誤是由于target未設(shè)置為openmobile API導(dǎo)致的,具體設(shè)置請(qǐng)參加4.3(5)節(jié)。

      以上一部分是直接copy銀聯(lián)支付的文檔的,因?yàn)楹茉敿?xì)了,再加上一些Androidstudio的東西,跑出來的demo如圖:

      6.實(shí)際項(xiàng)目開發(fā)

      完成所有的配置運(yùn)行出來的Demo可以完全支付了說明Demo就已經(jīng)完全配置好了銀聯(lián)的開發(fā)環(huán)境了,我們只需要參照這個(gè)Demo去配置我們自己的項(xiàng)目即可。

      注:銀聯(lián)開發(fā)環(huán)境的編譯不能在太老的環(huán)境下編譯,否則會(huì)報(bào)類找不到異常

      大家如果碰到其他解決不了問題或者異常 ,有兩個(gè)方法

      1)聯(lián)系技術(shù)支持客服:

      中國(guó)銀聯(lián)線上商戶測(cè)試支持?800033969

      2)支持中心?> FAQ

      FAQ列表- 中國(guó)銀聯(lián)開放平臺(tái)

      倘若大家對(duì)這篇文章存在異議或者有其他問題都可以加入我的qq開發(fā)群討論:

      開發(fā)一群:454430053?開發(fā)二群:537532956

      Android API/SDK

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:【Kafka筆記】Kafka API詳細(xì)解析 Java版本(Producer API,Consumer API,攔截器等)
      下一篇:Excel Sheets Copier復(fù)制表格的方法
      相關(guān)文章
      校园亚洲春色另类小说合集| 亚洲av无码有乱码在线观看| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲videosbestsex日本| 亚洲高清在线播放| 亚洲国产精华液网站w| 国产午夜亚洲精品理论片不卡 | 亚洲自偷自偷偷色无码中文| 亚洲国产精品无码久久青草| www亚洲精品久久久乳| 毛片亚洲AV无码精品国产午夜| 亚洲AV无码男人的天堂| 亚洲精品乱码久久久久久V| 亚洲国产午夜精品理论片在线播放| 亚洲中文字幕无码av永久| 亚洲熟女综合色一区二区三区| 亚洲综合色一区二区三区| 国产精品亚洲精品| 亚洲熟妇无码AV不卡在线播放| 亚洲熟妇无码一区二区三区 | 亚洲偷自精品三十六区| 亚洲一区二区三区久久久久| 亚洲国产激情在线一区| 亚洲综合精品伊人久久| 亚洲国产精品ⅴa在线观看| MM1313亚洲国产精品| 一区国严二区亚洲三区| 亚洲午夜精品第一区二区8050| 久久久久亚洲爆乳少妇无| 久久亚洲国产午夜精品理论片| 亚洲电影一区二区| 亚洲理论在线观看| 一本色道久久综合亚洲精品蜜桃冫| 亚洲性无码一区二区三区| 亚洲av日韩综合一区二区三区| 日韩欧美亚洲中文乱码| 久久久无码精品亚洲日韩软件 | 中文字幕亚洲综合久久综合| 亚洲国产成人久久精品大牛影视| 春暖花开亚洲性无区一区二区| 亚洲乱亚洲乱少妇无码|