三方支付

常見的第三方支付解決方案

  • 支付寶支付
  • 微信支付
  • 銀聯支付
  • Ping++統一支付平臺(須要繼承服務器端和客戶端)
  • 短信支付

支付寶的集成流程

  • 首先,支付寶支付準備工做
    • 首先登陸【支付寶開放平臺】http://open.alipay.com/platform/home.htm,建立應用,並給應用添加App支付功能
    • 因爲App支付功能須要簽約,所以須要上傳公司信息和證件等資料進行簽約
    • 簽約成功後,須要配置祕鑰。使用支付寶提供的工具生成RSA公鑰和私鑰(工具下載地址),公鑰須要設置到管理後臺,具體操做請登陸官網
  • 第二步,拼接符合支付寶規範的請求參數,主要有如下幾點:php

    • 先拼接訂單信息,以下:html

      Map<string, string=""> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
      String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
    • 而後並對訂單信息使用私鑰進行RSA加密,並拼接訂單信息:android

      String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
      final String orderInfo = orderParam + "&" + sign;
    • 可是,上面的2個步驟,因爲涉及到私鑰加密,若是寫在本地容易暴露私鑰,因此通常會讓服務器提供一個提交確認訂單的接口,客戶端將訂單相關參數傳遞給服務器,服務器負責拼接支付寶的請求參數,而後返回給客戶端,因此上面的步驟其實不用咱們來作。
  • 第三步,調用支付api,傳入請求參數進行支付請求:web

    // 構造PayTask 對象
    PayTask alipay = new PayTask(PayDemoActivity.this);
    Map<string, string=""> result = alipay.payV2(orderInfo, true);
  • 最後,接收支付結果,根據支付狀態進行UI提示:json

    複製代碼
    String resultInfo = payResult.getResult();// 同步返回須要驗證的信息
    String resultStatus = payResult.getResultStatus();
    // 判斷resultStatus 爲「9000」則表明支付成功,具體狀態碼錶明含義可參考接口文檔
    if (TextUtils.equals(resultStatus, "9000")) {
        Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
    } else {
        // 判斷resultStatus 爲非"9000"則表明可能支付失敗
        // "8000"表明支付結果由於支付渠道緣由或者系統緣由還在等待支付結果確認,最終交易是否成功以服務端異步通知爲準(小几率狀態)
        if (TextUtils.equals(resultStatus, "8000")) {
            Toast.makeText(PayDemoActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();
        
        } else {
            // 其餘值就能夠判斷爲支付失敗,包括用戶主動取消支付,或者系統返回的錯誤
            Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
        
        }
    }
    複製代碼

微信支付的集成流程

總體步驟能夠說,和支付寶一致的api

詳情查看:
1.微信商戶接入準備工做
2.微信支付sdk開發文檔 
3.微信支付sdk詳細流程服務器

  • 首先,獲取符合微信支付規範的請求參數,demo中是經過一個url獲取的,這告訴咱們,應該讓服務器提供一個接口,來對訂單信息進行加密而後返回。代碼以下:微信

    String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android";
    byte[] buf = Util.httpGet(url);
  • 第二步,對請求參數進行封裝:app

    複製代碼
    PayReq req = new PayReq();
    //req.appId = "wxf8b4f85f3a794e77";  // 測試用appId
    req.appId           = json.getString("appid");
    req.partnerId       = json.getString("partnerid");
    req.prepayId        = json.getString("prepayid");
    req.nonceStr        = json.getString("noncestr");
    req.timeStamp       = json.getString("timestamp");
    req.packageValue    = json.getString("package");
    req.sign            = json.getString("sign");
    req.extData         = "app data"; // optional
    複製代碼
  • 第三步,調用支付api,傳入請求參數:異步

    // 在支付以前,若是應用沒有註冊到微信,應該先調用IWXMsg.registerApp將應用註冊到微信
    api.sendReq(req);
  • 最後,接收支付結果,根據狀態碼進行UI提示,此處在demo中是在WXPayEntryActivity中進行操做的。

    複製代碼
    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
        private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
        private IWXAPI api;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.pay_result);
            api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
            api.handleIntent(getIntent(), this);
        }
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            api.handleIntent(intent, this);
        }
        @Override
        public void onReq(BaseReq req) {
        }
        @Override
        public void onResp(BaseResp resp) {
            if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle(R.string.app_tip);
                builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
                builder.show();
            }
        }
    }
    複製代碼

銀聯支付的集成流程

銀聯支付最簡單,只要有TN(交易流水號)便可發起支付!

詳情查看:
1.銀聯支付開發者平臺首頁
2.銀聯手機支付資料下載頁 

  • 首先,當要進行支付時,調用本身服務器提供的接口獲取流水號,即TN,代碼相似這樣:

    String tn = HttpHelper.execGet("tn_url");
  • 而後,拿到TN後,調用銀聯SDK的api向銀聯發起支付請求,代碼相似這樣:

    //其中mode參數解釋: "00" - 啓動銀聯正式環境 "01" - 鏈接銀聯測試環境
    
    UPPayAssistEx.startPay(activity, null, null, tn, mode);
  • 最後,在onActivityResult方法中獲取支付結果進行UI提示,代碼相似這樣:

    複製代碼
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            /*************************************************
             * 步驟3:處理銀聯手機支付控件返回的支付結果
             ************************************************/
            if (data == null) {
                return;
            }
        
            String msg = "";
            /*
             * 支付控件返回字符串:success、fail、cancel 分別表明支付成功,支付失敗,支付取消
             */
            String str = data.getExtras().getString("pay_result");
            if (str.equalsIgnoreCase("success")) {
                
                // 若是想對結果數據驗籤,可以使用下面這段代碼,但建議不驗籤,直接去商戶後臺查詢交易結果
                // result_data結構見c)result_data參數說明
                if (data.hasExtra("result_data")) {
                    // 結果result_data爲成功時,去商戶後臺查詢一下再展現成功
                    //注意,此處只是表示客戶端收到了支付成功的響應。可是爲了保險起見,須要向服務器查詢一下是否真的支付功。
                    //具體作法是,讓本身服務器提交一個查詢訂單狀態的接口,若是服務器返回的結果也是支付成功,那麼就真的提示用戶
                } 
                msg = "支付成功!";
            } else if (str.equalsIgnoreCase("fail")) {
                msg = "支付失敗!";
            } else if (str.equalsIgnoreCase("cancel")) {
                msg = "用戶取消了支付";
            }
        
            //進行UI提示
            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();
        }
相關文章
相關標籤/搜索