常見的第三方支付解決方案
- 支付寶支付
- 微信支付
- 銀聯支付
- Ping++統一支付平台(需要繼承服務器端和客戶端)
- 短信支付
支付寶的集成流程
- 相關資料鏈接:
- 支付寶支付指引流程:支付指引流程
- 支付寶Android端集成流程:Android端集成流程
- 首先,支付寶支付准備工作
- 首先登錄【支付寶開放平台】http://open.alipay.com/platform/home.htm,創建應用,並給應用添加App支付功能
- 由於App支付功能需要簽約,因此需要上傳公司信息和證件等資料進行簽約
- 簽約成功后,需要配置秘鑰。使用支付寶提供的工具生成RSA公鑰和私鑰(工具下載地址),公鑰需要設置到管理后台,具體操作請登錄官網
-
第二步,拼接符合支付寶規范的請求參數,主要有以下幾點:
-
先拼接訂單信息,如下:
Map<string, string=""> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2); String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
-
然后並對訂單信息使用私鑰進行RSA加密,並拼接訂單信息:
String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2); final String orderInfo = orderParam + "&" + sign;
- 但是,上面的2個步驟,由於涉及到私鑰加密,如果寫在本地容易暴露私鑰,所以一般會讓服務器提供一個提交確認訂單的接口,客戶端將訂單相關參數傳遞給服務器,服務器負責拼接支付寶的請求參數,然后返回給客戶端,所以上面的步驟其實不用我們來做。
-
-
第三步,調用支付api,傳入請求參數進行支付請求:
// 構造PayTask 對象 PayTask alipay = new PayTask(PayDemoActivity.this); Map<string, string=""> result = alipay.payV2(orderInfo, true);
-
最后,接收支付結果,根據支付狀態進行UI提示:
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(); } }
微信支付的集成流程
整體步驟可以說,和支付寶一致的
-
首先,獲取符合微信支付規范的請求參數,demo中是通過一個url獲取的,這告訴我們,應該讓服務器提供一個接口,來對訂單信息進行加密然后返回。代碼如下:
String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android"; byte[] buf = Util.httpGet(url);
-
第二步,對請求參數進行封裝:
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(交易流水號)即可發起支付!
-
首先,當要進行支付時,調用自己服務器提供的接口獲取流水號,即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(); }