对易宝支付的认识与总结
上周,有一个任务是实现考生付款的功能,当时接到这个功能时,把他想简单了,只想到我和考生之间的交互了,连银行都忘了,哈哈!于是觉得做出来很容易嘛!但是,再去做时,发现并不是那么回事,因为付款是一件很神圣的事,参与的对象有考生,我,银行,第三方,毕竟涉及到钱了嘛!这里的我就代表我公司了,最终收到钱的对象!人家付款都觉得有点麻烦,何况咱写程序的呢,也得给他造点麻烦,以免考生的钱花错地方了呀,那人家还怪咱呢,咱怪谁呢?于是咱就要委屈自己了,要多费点脑子,少玩一会了!后来去了解了一下易宝支付,才知道,他就是要介入考生的那个”小三“!
当然,这个第三方介入与不介入也都行!付款的方式有好几种呢:
1.考生把钱直接送到咱手里
2.考生把钱打给银行,银行再打给咱
3.考生把钱给第三方,第三方再跟银行交互,银行再打给咱
那么,这里一共有三种,为什么要选择第三种呢?
第一种,当然虽然直接,但是要是考生在海南,公司在北京,难道考生坐飞机来北京送到公司里?当然不现实,pass!
第二种,方便了考生,也方便了公司,对于大额交易,安全啊!但是呢,公司系统直接与银行对接,要是银行系统更新了呢,那咱不也要改点什么,咱是被人牵着鼻子走啊,而且人家问你要的钱多啊,你爱接不接,咱能不接吗?那就先不说了,另一方面,什么农业银行啊,工商银行啊,交通银行啊,发展银行啊,这么多的银行,你都去接,那你收考生的钱直接就给银行吧,太贵了,太麻烦了!
所以啊,综合来看,我们只有采取第三种方式才划算了点,为什么划算了点呢?咱们直接与第三方对接,对接免费啊,不过人家收1%手续费,那咱交的不多,咱的交易额不大啊,要是咱交易个上亿的,咱还不用他了呢,是吧,没有银行安全啊!
好了,废话不多说了,下面咱来学习学习,认识认识这个神奇的很多很多商家在用的易宝支付吧!
首先,我们再来了解易宝支付这个名词:易宝支付
然后,我们去下载易宝支付的jar包和帮助文档:易宝支付帮助文档和jar包
当然,要想测试你的易宝支付功能,你需要去易宝申请商户编号和商家密钥!
(易宝支付基本上都是采取gbk或gb2312编码格式)
下面看看我的支付流程:
<1>.考生应交费信息页面:

<2>.点击“易宝支付”,在后台要处理的代码是:
ReportAction里面pay方法:
<4>.选择工商银行后,页面连接到银行页面为:
<5>.如果单笔订单查询考生已缴费,点击易宝支付出现提示页面:
说明:
1.jar包里面的类:
2.生成hmac时参数一定要严格按照帮助文档上的参数顺序。
3.读取merchantInfo.properties文件信息:(merchantInfo.properties文件操作)
public class Configuration {private static Object lock = new Object();private static Configuration config = null;private static ResourceBundle rb = null;private static final String CONFIG_FILE = "merchantInfo";private Configuration() {rb = ResourceBundle.getBundle(CONFIG_FILE);}public static Configuration getInstance() {synchronized(lock) {if(null == config) {config = new Configuration();}}return (config);}public String getValue(String key) {return (rb.getString(key));}}
简述整个支付流程:(单笔订单查询和单笔退款流程都和其流程一样,无非一些参数值和判断有差异)
支付与处理响应结果流程:
1.从数据库或者页面获取到订单中的一些信息与商家密钥一块作为参数调用PaymentForOnlineService
类中getReqMd5HmacForOnlinePayment(p0_Cmd, p1_MerId, p2_Order, p3_Amt, p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP, pd_FrpId, pr_NeedResponse, keyValue)方法获得hmac签名。
2.把这些参数和hmac签名与支付请求路径https://www.yeepay.com/app-merchant-proxy/node连接字符串(就是https://www.yeepay.com/app-merchant-proxy/node?p0_Cmd=& p1_MerId=。。。&hmac=格式)。
3.然后重定向response.sendRedirect(https://www.yeepay.com/app-merchant-proxy/node?p0_Cmd=& p1_MerId=。。。&hmac=)开始支付;
4.支付完成(完成不是成功)又重定向到当初你填的 p8_Url值这个路径去,当然,易宝传过来的还有很多参数(参见说明文档)包括hmac签名,获得传过来的参数调用PaymentForOnlineService类中verifyCallback(String hmac, String p1_MerId, String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,String r4_Cur, String r5_Pid, String r6_Order, String r8_MP, String rb_PayStatus, String rb_BankId, String ro_BankOrderId,String rp_PayDate, String keyValue)方法在这个方法中调用DigestUtil类中hmacSign(sValue.toString(), keyValue)方法返回新的hmac签名,与传进来的hmac值相比较,相等则合法继续根据其他返回参数给予相应提示,不相等就提示不合法!(sValue.toString()是传进来的所有参数连接成的字符串,keyValue是商家密钥)。


