Android第三方支付——銀聯支付

目錄

前段時間項目中使用到了微信支付和支付寶支付,所以順便把另外一個主流的支付(銀聯支付)也學習了一下,再次把此次學習的知識作於一個記錄。

銀聯支付技術文檔地址

官方文檔地址:https://open.unionpay.com

支付流程圖

這裏寫圖片描述

簡要說明一下流程,首先後臺向銀聯支付系統推送訂單,銀聯支付系統會返回這個訂單交易流水號,後臺會把這個交易流水號返回給APP端,接着APP端調支付控件支付;待銀聯支付系統處理完交易,將結果通知給APP端和後臺,最後APP端去後臺驗簽訂單信息,驗籤通過則支付成功,反之則失敗。

調用步驟

  • 1、獲取交易流水號
 @Override
    public void run() {
        String tn = null;
        InputStream is;
        try {

            String url = TN_URL_01;

            URL myURL = new URL(url);
            URLConnection ucon = myURL.openConnection();
            ucon.setConnectTimeout(120000);
            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);
    }

非UI線程中異步調用,返回交易流水號後調起支付。

  • 2、調支付啓動支付控件
@Override
    public boolean handleMessage(Message msg) {
        Log.e(LOG_TAG, " " + "" + msg.obj);
        if (mLoadingDialog.isShowing()) {
            mLoadingDialog.dismiss();
        }

        String tn = "";
        if (msg.obj == null || ((String) msg.obj).length() == 0) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("錯誤提示");
            builder.setMessage("網絡連接失敗,請重試!");
            builder.setNegativeButton("確定",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            builder.create().show();
        } else {
            tn = (String) msg.obj;
            /**
             * 通過銀聯工具類啓動支付插件
             */
            doStartUnionPayPlugin(this, tn, mMode);
        }

        return false;
    }

PS:doStartUnionPayPlugin(this, tn, mMode)中tn爲交易流水號,mMode爲環境標記,00表示生產環境,01表示測試環境。

  • 3、處理支付控件返回的支付結果
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        /**
         * 處理支付控件返回的支付結果
         */
        if (data == null) {
            return;
        }

        String msg = "";
        /**
         * 支付控件返回字符串:success、fail、cancel 分別代表支付           成功,支付失敗,支付取消
         */
        String str = data.getExtras().getString("pay_result");
        if (str.equalsIgnoreCase("success")) {
            // 支付成功後,extra中如果存在result_data,取出校驗
            if (data.hasExtra("result_data")) {
                String result = data.getExtras().getString("result_data");
                try {
                    JSONObject resultJson = new JSONObject(result);
                    String sign = resultJson.getString("sign");
                    String dataOrg = resultJson.getString("data");
                    // 驗簽證書同後臺驗簽證書進行校驗
                    // 如果校驗不通過則支付失敗
                    boolean ret = verify(dataOrg, sign, mMode);
                    if (ret) {
                        // 驗證通過後,顯示支付結果
                        msg = "支付成功!";
                    } else {
                        // 驗證不通過後的處理
                        // 建議調後臺查詢支付結果
                        msg = "支付失敗!";
                    }
                } catch (JSONException e) {
                }
            } else {
                // 未收到簽名信息
                // 建議調後臺查詢支付結果
            }
        } else if (str.equalsIgnoreCase("fail")) {
            msg = "支付失敗!";
        } else if (str.equalsIgnoreCase("cancel")) {
            msg = "用戶取消了支付";
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("支付結果通知");
        builder.setMessage(msg);
        builder.setInverseBackgroundForced(true);
        // builder.setCustomTitle();
        builder.setNegativeButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.create().show();
    }

注意事項

  • 環境選擇

    mMode爲00代表生產環境,01代表測試環境,如果是測試環境下,不去後臺驗籤,否則一直不能通過。

  • 支付回調處理

    生產環境下如果支付失敗後,最好去後臺查詢支付結果,確保結果的準確性。

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