聊一聊Java如何接入招行一网通支付功能
1.前提条件
相比较于支付宝和微信的支付功能接入这一块,银行相对来说更加严格,比如说支付宝,在你签约之前可以进行一些测试。但是银行来说就不是这样了,如果您现在要进行招行的支付功能开发的话,请务必先让相关人员去进行签约
2. 测试开发必须条件
进行测试开发之前有几个比较重要的东西是不可避免的,我们来看一下都是有什么:
商户号、商户分行号以及商户秘钥(具体明细请参考:http://link.cmbchina.com/open2/DOC/ToTest6.aspx)
验证码查询地址(测试环境招行所发的验证码都可以在此网站查询到http://121.15.180.69/GetMsgVerifyCode/Default.aspx)
API文档(进行签约时招行一般会给我们一份文档,但是此文档也是很有参考价值的http://link.cmbchina.com/open2/API/APIdefault.aspx)
3.测试开发
咱们这次一个完整的支付流程为例
进入正式的开发之前咱们先来看一下一个图,这个图呢,简单介绍了一下这个支付的流程,并没有考虑失败的因素。仅供大家参考!

接下来呢,我们就按照上图所示的流程进行开发。
第一个相信不用费心,APP请求时携带一个订单号就行。
我们根据订单号查询出此订单关联的订单金额及用户等信息,然后呢参考此链接(http://link.cmbchina.com/open2/API/PWDPayAPI4.aspx)的请求报文要求的必填字段一一组合起来。
这里组合的时候有几个小小的问题,因为招行对我们发送的请求报文是有要求的:测试环境回调地址不支持域名,只能是纯IP地址,且端口只能为80、443、8081其中的一个。另外请求报文中的reqData字段里的内容要进行排序。最后,排序完的报文要进行签名。详细要求请看此链接:http://link.cmbchina.com/open2/API/SigAndCheck2.aspx
这里进行排序的话我可以提供一种全新的思路,我们可以把待排序的字段使用一个dto封装起来类似于下面这种:
1 |
//客户协议号。 |
这样的dto转换成json串的时候是已经有序了的。
对参数进行签名的话怎可以参考招行为我们提供的代码示例。http://link.cmbchina.com/open2/API/Appendix16.aspx#jvch2
需要注意的就是上方我们dto转成的是一个json串,但是签名要求的待签名的字符串格式是这样的。agrNo=xxx&amount=88.88&bankSerialNo=1234567&branchNo=xxx
排序以及签名完毕以后就可以把这个发送给APP了,我们发送给APP的就是下方这个形式的json:
1 |
{
|
- APP收到服务器返回的请求报文,就可以组成如下表单向招行发送请求:
1 |
<form action="http://121.15.180.66:801/NetPayment/BaseHttp.dll?MB_EUserPay" method="post" > |
这一块呢,也有一个需要注意的地方,因为有的时候我们服务端开发的时候可能APP还没有时间,如果我们每次都让人家帮忙也挺浪费时间的。这里也有一个快速测试的好办法。我们可以把上方的代码拿着自己建一个HTML文件,发送到自己手机上,然后使用手机浏览器打开其实也是可以的。
此时招行就会返回一个统一的支付页面
在这我们填入签约时招行给我们的测试账号等信息,账号支付使用的验证码请参考文章刚开始我们所说的网址
假设支付成功,那么招行就会回调我们请求参数所填的回调地址,这里其实是有两个回调地址的,一个是签约成功的回调,一个是支付成功的回调。
关于这些回调的问题一般我们会有两种方式解决,1呢是内网穿透,2呢就是远程Debug,因为招行的测试回调地址只能是ip所以这里我们就是要第二种方式,不熟悉远程Debug的同学可以参考我的另一篇博文IDEA远程Debug
我们就拿支付成功的回调来说。
招行会把参数放到一个jsonRequestData的属性里。我们可以通过以下方式来取得:JSONObject jsonRequestData=JSONObject.parseObject(request.getParameter("jsonRequestData"));
这个json里面的东西我们可以参考一下这个链接http://link.cmbchina.com/open2/API/PayRltAPI6.aspx
有了这些东西我们就可以准确的知道此次支付的一些相关信息。不过呢,这样有个问题呀,这东西要是别人伪造的怎么办呀。所以呢,这里还一个验签的过程,验证此次回调到底是不是招行发来的。
这个验签还牵扯到一个问题,那就是验签需要招行的公钥,而招行的公钥是会定期更新的,所以我们可以做一个定时任务定期去请求招行的公钥(关于定时任务的相关可以参考我的这篇博客:Java定时任务解决方案)
至于怎么去查询请参考此链接http://link.cmbchina.com/open2/API/QueryAPI3.aspx,使用我们上方所说的如何排序请求参数,如何进行签名。不过这个只需要在服务端请求就可以了,至于在服务端如何发送请求大家可以使用一下方式:
1 |
public static String doPost(String jsonParam, String url, String charset) {
|
既然公钥有了,我们就可以进行验签了。
具体验签细节可参看此链接:http://link.cmbchina.com/open2/API/Appendix16.aspx。
如果验签通过的情况下我们就可以happy进行各种操作了。
不过呢,还有一点。记得给招行返回一个收到的信息
`
response.setStatus(HttpStatus.SC_OK);
`
你要是不告诉人家你收到了,他是会在间隔一段时间后再次发送通知,直到10个以后。
- 这个大流程终于走到这了,这个时候你是使用APP轮训,或者向APP推送告知支付完成的信息就是看你需求了。
结语
关于招行的支付功能是我上周刚刚亲手撸出来的代码,我想能踩的坑我基本上已经踩过了,如果大家在开发过程中遇到什么问题的话都可以来我的网站,我们一起交流讨论:石玉军的个人博客

本文出自http://zhixiang.org.cn,转载请保留。
聊一聊Java如何接入招行一网通支付功能的更多相关文章
- 手机网站支付如何接入支付宝简易版支付功能PHP版
接入支付宝准备工作:(关于账号可以是个体商户也可以是企业账号但必须有营业执照) 1.登录蚂蚁金服开放平台 2.创建应用,应用分类网页应用和移动应用.应用提交审核审核通过后得到Appid才能调用相应的 ...
- 关于Java调用接入微信、支付宝支付提现
前言: 本篇文章介绍关于自己写的一个集成微信.支付宝的支付.提现等功能的介绍,本项目已在码云上进行开源,欢迎大家一起来进行改造,使进行更好的创新供大家使用:也有对应的pom文件坐标可以导入,因目前不知 ...
- java如何集成支付宝移动快捷支付功能
项目需要,需要在客户端集成支付宝接口.第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家.就研究了一下:因为使用支付宝接口,就需要到支付宝官 ...
- Java生鲜电商平台-商家支付系统与对账系统架构实战
Java生鲜电商平台-商家支付系统与对账系统架构实战 说明:关于生鲜电商平台,支付系统是连接消费者.商家(或平台)和金融机构的桥梁,管理支付数据,调用第三方支付平台接口,记录支付信息(对应订单号,支付 ...
- java支付宝开发-02-手机网站支付
源码已上传github,欢迎专注:https://github.com/shirayner/alipay-wap 一.基础部分 1.手机网站支付产品介绍 1.1 阅读官方介绍: 手机网站支付产品介绍 ...
- 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】
一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...
- ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付接口及同步跳转及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET ...
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...
- Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)
Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS) 1. 数据库表设计. 说明:无论是支付宝还 ...
随机推荐
- MAC配置VIM环境
Ruby开发环境配置 ~/.vimrc set nocompatible " be iMproved, required filetype off " required set r ...
- mac环境下mongodb的安装和使用
mac环境下mongodb的安装和使用 简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据 ...
- SQLServer 中有五种约束, Primary Key 约束、 Foreign Key 约束、 Unique 约束、 Default 约束和 Check 约束
一直在关注软件设计方面,数据库方面就忽略了很多,最近在设计数据库时遇到了一些小麻烦,主要是数据库中约束和性能调优方面的应用,以前在学习 Sql Server 2000,还有后来的 Sql Server ...
- Layui 写一个简单的后台页面
参考如下: 1.layui 官方文档 http://www.layui.com/doc/ 2.https://blog.csdn.net/huyanliang/article/details/7796 ...
- github 生成配置ssh 秘钥方法详解
如果安装github成功后,当从本地提交文件到github的时候,提交不成功,报错,可能问题就是你还没有生成ssh秘钥 1.当你提交文件到github,不成功,出现如下的情况,就代表着github上面 ...
- qt quick-初始学习概念
Qt Quick简介: Qt Quik 是一种高级用户界面技术,使用它可以轻松地创建供移动和嵌入式设备使用到动态触摸式界面和轻量级应用程序:Qt Quick主要由三部份组成: 改进的Qt Creato ...
- 你电梯没了—OO第二单元作业思考
写在前面 这三次电梯调度作业,主要是学习多线程并行操作,对于各个线程的时间轴的把握,互相的配合与影响,通过使用锁来解决访问冲突等方面. 个人在学会Thread相关操作之外,写出来一些奇怪结构的诡异操作 ...
- Xshell连接不上阿里云服务器
心血来潮买了一台1核2g内存,外加40g系统盘的阿里云ecs服务器,在配置xshell连接服务器一直无法连接,试了很多种方法,各种心累,不过最后还是找到了原因,是因为在服务器上没有配置安全组规则,附上 ...
- Tomcat 500error: Could not initialize class
Web 项目报错Could not initialize class ,出现500,说明服务器是起来了,可能是这个类的驱动有问题,缺少初始化需要的文件 查到有相关情况: 考虑是jar 包的问题,检查了 ...
- java39
String a= "hello.a.java;b.java;hello.java;hello.toha;"; //将每个分号的内容取出来 String[] res=a.split ...