【銀聯支付】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下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章