之前我认为银联支付可能需要和各个银行对接比较麻烦,但是实际上并不需要,官方有现成的sdk,先看一下官方给我们的银联支付流程图:
![2a95e58407733b1d964c8ea6c8d56ef6.png](https://i-blog.csdnimg.cn/blog_migrate/a07a52eab821ec481b671ec9d3eacdc7.jpeg)
大家不要被这张图片搞懵逼的了,其实很简单,这里我将其分为5小步。
第一步:根据官方文档选择符合自己的sdk
官方文档:
https://open.unionpay.com/ajweb/help/file/techFile?productId=3
第二步:将相对应的.so文件copy到 自己的工程里面去。
特别注意:
.so文件要放在src/main 目录下,和Java文件并行。还有就是把用到的权限复制到自己项目中)
第三步: 和支付宝一样,APP客户端带着这些订单号向服务器后台请求订单号orderNo
第四步:服务器后台接收到购买信息之后,将信息提交给银联后台,银联接收到后台之后给服务器返回tn号
第五步:开启调用银联支付。APP客户端带着这个流水号,也就是第三步中服务器返回的tn号,调用银联SDK所提供的方法
注意:
这个订单流水号为21位纯数字号
调用方法: UPPayAssistEx.startPay(this, null, null, tn, mMode);
结果返回:
处理银联手机支付控件返回的支付结果 调用银联支付后,返回app的时候用了,看返回结果传,成功,失败,或者是什么返回。
@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结构见 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"); //此处的 verif建议送去商户后台做验签 //如要放在手机端验,则代码必须支持更新证书 boolean ret = verify(dataOrg,sign, mnode); if (ret) { //验签成功,显示支付结果 msg = "支付成功!"; } else { // 验签失败 msg = "支付失败!"; } }catch (JSONException e) { log.error("json error", e); } } // 结果 resultdata为成功时,去商户后台查询一下再展示成功 msg = "支付成功!"; } else if (str.equalsIgnoreCase("fail")) { msg = "支付失败!"; } else if(str.equalsIgnoreCase("cancel")) { msg = "用户取消支付!"; } }
最后注意在调用:
/*****************************************************************
* mMode参数解释: "00" - 启动银联正式环境 "01" - 连接银联测试环境
*****************************************************************/
private final String mMode = "00";
注意:
tn值就是上面第三后台给的tn,给到服务器那里,这里我这边是通过后台请求下来的,关于mMode,看第一步骤,自己改一下就行了,00开发环境,01测试环境。但是要注意,这个只是个回调接口方法。