1. 程式人生 > >【銀聯支付】Android studio版本的銀聯支付Demo

【銀聯支付】Android studio版本的銀聯支付Demo

首先看一下效果圖:
這裡寫圖片描述

注意:本Demo使用的銀聯SDK版本:3.1.0 更新時間:2017-08-02

  1. 概述
            銀聯手機支付控制元件(以下簡稱支付控制元件),主要為合作商戶的手機客戶端提供安全、便捷的支付服務。使用者通過在支付控制元件中輸入銀行卡卡號、手機號、密碼(借記卡和預付卡)或者CVN2、有效期(信用卡)、驗證碼等要素完成支付。

  2. 支付流程介紹
           通過支付控制元件進行交易的流程如下圖:
    這裡寫圖片描述
    流程圖說明:
    (1)使用者在客戶端中點選購買商品,客戶端發起訂單生成請求到商戶後臺;
    (2)商戶後臺收到訂單生成請求後,按照《手機控制元件支付產品介面規範》組織並推送訂單資訊至銀聯後臺;
    (3)銀聯後臺接收訂單資訊並檢查通過後,生成對應交易流水號(即TN),並回復交易流水號至商戶後臺(應答要素:交易流水號等);
    (4)商戶後臺接收到交易流水號,將交易流水號返回給客戶端;
    (5)客戶端通過交易流水號(TN)呼叫支付控制元件;
    (6)使用者在支付控制元件中輸入相關支付資訊後,由支付控制元件向銀聯後臺發起支付請求;
    (7)支付成功後,銀聯後臺將支付結果通知給商戶後臺;
    (8)銀聯將支付結果通知支付控制元件;
    (9)支付控制元件顯示支付結果並將支付結果返回給客戶端;
    目前各個平臺支援的裝置情況如下:
    Android平臺SDK主要適用於Android 2.3

    及以上版本的終端裝置;

  3. 測試賬號
           提供測試使用卡號、手機號資訊(此類資訊僅供測試,不會發生正式交易
    這裡寫圖片描述

  4. Android客戶端接入 (Android studio 版本)
    新增SDK包到專案中:
    1.拷貝兩個jar包:UPPayAssistEx.jar UPPayPluginExPro.jar到libs目錄下
    2.在main包下新建assets資料夾放置資原始檔data.bin
    3.在main包下新建jniLibs資料夾分別放置armeabi-v7a、armeabi、arm64-v8a、x86、x86_64資料夾下的.so檔案
    效果圖:
    這裡寫圖片描述

  5. 清單檔案AndroidManifest.xml配置註冊支付外掛使用的Activity

<activity
     android:name="com.unionpay.uppay.PayActivity"
     android:configChanges="orientation|keyboardHidden"
     android:excludeFromRecents="true"
     android:label="@string/app_name"
     android:screenOrientation="portrait"
     android:windowSoftInputMode
="adjustResize" />

       demo中有請求網路拿tn,需配置網路許可權

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.NFC" />
 <uses-feature android:name="android.hardware.nfc.hce" />

6.呼叫支付控制元件

 // “00” – 銀聯正式環境
 // “01” – 銀聯測試環境,該環境中不發生真實交易
    String tn = (String) msg.obj;
    if (!TextUtils.isEmpty(tn)) {
         // 測試環境
         tring serverMode = "01";
         UPPayAssistEx.startPayByJAR(MainActivity.this, PayActivity.class, null, null, tn, serverMode);
     }

       子執行緒獲取tn(流水號,實際專案中由後臺返回)

    /**
     * 獲取tn執行緒
     */
    private class MyThread extends Thread {
        public MyThread() {
        }

        @Override
        public void run() {
            super.run();
            String tn = null;
            InputStream is;
            try {
                String url = TN_URL_01;
                URL myURL = new URL(url);
                URLConnection ucon = myURL.openConnection();
                ucon.setConnectTimeout(120 * 1000);
                is = ucon.getInputStream();
                int i = -1;
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                while ((i = is.read()) != -1) {
                    baos.write(i);
                }

                tn = baos.toString();
                is.close();
                baos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

            Message msg = mHandler.obtainMessage();
            msg.obj = tn;
            mHandler.sendMessage(msg);
        }
    }

       最後處理支付後的結果

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null) {
            return;
        }

        String str = data.getExtras().getString("pay_result");
        Log.e("xuke", "sign=" + str);
        if (str.equalsIgnoreCase(R_SUCCESS)) {
            Snackbar.make(container, R.string.pay_success, Snackbar.LENGTH_LONG).show();
        } else if (str.equalsIgnoreCase(R_FAIL)) {
            Snackbar.make(container, R.string.pay_fail, Snackbar.LENGTH_LONG).show();
        } else if (str.equalsIgnoreCase(R_CANCEL)) {
            Snackbar.make(container, R.string.pay_cancel, Snackbar.LENGTH_LONG).show();
        }
    }

       實際開發中最好有驗證簽名信息為好,控制元件返回的結果資訊僅作為參考,商戶訂單是否成功支付應該以商戶後臺主動到全渠道查詢的結果或者收到全渠道支付結果通知為準。
       收到控制元件返回結果後,建議無視結果中的內容和簽名信息,直接到自己的後臺查狀態,如果後臺此時未收到全渠道的後臺通知,則主動發起查詢介面到全渠道查狀態。這樣可既保證APP中展示的訂單狀態和後臺記錄一致,也可及時更新後臺記錄的訂單狀態。
       如仍希望使用控制元件返回的資訊,驗籤時建議送到後臺去驗籤;如果需要在APP中驗籤,則需要自行實現驗籤公鑰更新的機制,否則銀聯更新金鑰後會驗籤失敗。

具體詳細demo可參考官方文件
demo下載