目錄
前段時間項目中使用到了微信支付和支付寶支付,所以順便把另外一個主流的支付(銀聯支付)也學習了一下,再次把此次學習的知識作於一個記錄。
銀聯支付技術文檔地址
官方文檔地址: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代表測試環境,如果是測試環境下,不去後臺驗籤,否則一直不能通過。
支付回調處理
生產環境下如果支付失敗後,最好去後臺查詢支付結果,確保結果的準確性。