引言
本文主要讲解银联支付官方测试案例,并分析银联支付的流程。
本文目录结构:
1.导入银联支付
1.首先去官网注册账号(已有账号可以忽略此步骤),官网的地址:https://open.unionpay.com/tjweb/acproduct/dictionary
2.注册成功后,登录,登录成功后,进入商户测试中心
3.进入测试中心,点击左侧测试参数,下载下面红框的4个证书,测试demo需要用到。
4.进入开放平台下载demo:https://open.unionpay.com/tjweb/acproduct/list?apiSvcId=448&index=4
5.使用IDEA导入java项目(如果不知道IDEA如何导入Eclipse项目,可以参考我的博客https://yanglinwei.blog.csdn.net/article/details/106014301),导入成功如下图:
注意:配置tomcat时,红色框的内容必须如下,因为demo的代码写死了,否则运行不了!!!坑
6.配置证书路径:打开acp_sdk.properties
文件,配置证书路径地址(配置成你本地的路径存放证书的路径即可)
2.测试
运行项目,浏览器输入http://localhost:8080/ACPSample_B2C/,demo界面的css样式丢失了(没有去找原因,使用Eclipse导入应该是没问题的,可能是IDEA没有配好,不影响功能演示),直接按下图,依次点击“消费样例”->"消费"->"提交”
:
点击提交后,会先跳转到:http://localhost:8080/ACPSample_B2C/form_6_2_FrontConsume,如下:
然后再跳转到支付界面:
支付账号可以在开放平台里获取,如下:
卡号 | 卡性质 | 机构名称 | 手机号码 | 密码 | CVN2 | 有效期 | 证件号 | 姓名 |
6216261000000000018 | 借记卡 | 平安银行 | 13552535506 | 123456 | 341126197709218366 | 全渠道 | ||
6221558812340000 | 贷记卡 | 平安银行 | 13552535506 | 123456 | 123 | 2311 | 341126197709218366 | 互联网 |
网关、WAP短信验证码 111111 控件短信验证码 123456
网上截图如下:
输入银行账号后,下一步,输入用户信息,点击确认付款:
付款成功,可以看到界面如下:
点击返回商户,可以看到返回的响应参数如下:
3.代码流程分析
下面来讲解代码运行原理。
1.首先项目启动时,会进入AutoLoadServlet
这个类,这个类从应用的classpath下加载acp_sdk.properties
属性文件并将该属性文件中的键值对赋值到SDKConfig类中
2.当点击提交订单时,会进入Form_6_2_FrontConsume
这个代码,并对信息进行校验。
UI | 对应代码 |
3.我们分析上一步的最后一行代码,可以看到返回的是一个HTML页面
HTML页面的代码通过断点获取,可以看到里面的内容如下(整理后):
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form id="pay_form" action="https://gateway.test.95516.com/gateway/api/frontTransReq.do" method="post"> <input type="hidden" name="bizType" id="bizType" value="000201" /> <input type="hidden" name="txnSubType" id="txnSubType" value="01" /> <input type="hidden" name="orderId" id="orderId" value="20200509160810" /> <input type="hidden" name="backUrl" id="backUrl" value="http://222.222.222.222:8080/ACPSample_B2C/backRcvResponse" /> <input type="hidden" name="signature" id="signature" value="X2D6DAMvxPArQ4NIGPod45YkfLhIApFt8D5f5OVUVR3NV7EKhYMLSD4ndAT2brvdylwV0JmEeJ+jVzkJPZ1AjbXO9LEEkAHST5Pisx9aMvwgB563lCbLmsCoRaY3qVobmL6yHo2oA9kaaHLp1O54YudyAXa+xBZh+vgtsFHQ2LbOPAhjv0LeCm+tv8BlS7MJkRLZyqwu2XZLU0n9I2ADKqhWzxI9C91HUVJ5u0/vU2PSEhmS6FBA6TWyrZE7vIF9jjX0DvWz4T5yFtkcQYLDh6J4YBHIwMJpYDoYi70NrfowI6Z4/09eh88Cswv1pwh+dND7WFMEuBZF9W4cPNBu9g==" /> <input type="hidden" name="txnType" id="txnType" value="01" /> <input type="hidden" name="channelType" id="channelType" value="07" /> <input type="hidden" name="frontUrl" id="frontUrl" value="http://localhost:8080/ACPSample_B2C/frontRcvResponse" /> <input type="hidden" name="certId" id="certId" value="68759663125" /> <input type="hidden" name="encoding" id="encoding" value="UTF-8" /> <input type="hidden" name="version" id="version" value="5.1.0" /> <input type="hidden" name="accessType" id="accessType" value="0" /> <input type="hidden" name="txnTime" id="txnTime" value="20200509160810" /> <input type="hidden" name="merId" id="merId" value="777290058110048" /> <input type="hidden" name="payTimeout" id="payTimeout" value="20200509164025" /> <input type="hidden" name="currencyCode" id="currencyCode" value="156" /> <input type="hidden" name="signMethod" id="signMethod" value="01" /> <input type="hidden" name="txnAmt" id="txnAmt" value="1000" /> <input type="hidden" name="riskRateInfo" id="riskRateInfo" value="{commodityName=测试商品名称}" /> </form> <script type="text/javascript">document.all.pay_form.submit();</script> </body> </html>
4.可以看到返回的html,把内容都hidden了,浏览器自动解析,并提交,这时会跳转到银联支付的界面:
5.支付完成后,点击返回,可以看到会请求我们的前台地址(这个地址是在'acp_sdk.properties'
里配置的)
点击“返回商户”:
跳转到配置的前台通知地址:
UI | 代码 |
至此银联支付的源码讲解到此结束,具体的细节需要童鞋们自己断点去看。