最近做了公众号的微信支付,想起来之前的第三方易宝支付,重新实现理解了一下。无论是微信,还是易宝。整个支付过程都是设置一些参数,然后提交给支付网关,最后返回数据,针对业务进行操作。
商户公司直接与银行对接和通过中间公司与银行对接
直接银行对接
1.优点:安全,适用于资金流量比较大的企业
2.缺点:开发工作量大,维护工作量大,缴纳接口使用费
中间公司对接
1.优点:开发工作量小,维护工作量小,适用于资金流量小的企业
2.缺点:不安全
规范:
MD5-hmac:秘密的秘钥验证算法。hmac提供的数据完整性和源身份验证完全取决于秘钥分配的范围。如果只要发送者和接收者知道hmac秘钥,那么这就对两者间发送的数据提供了源身份验证和完整性保证
通过http向易宝支付网关发送请求,请求可以是get和post,页面采用GBK
易宝支付网关对对企业发来的数据,使用用户的密钥生成MD5-hmac码,然后跟企业发来的MD5-hmac码对比,相同则把请求转发给银行网关,用户支付完成后,银行网关引导用户重定向到易宝支付网关,易宝支付网关再引导用户重定向到企业制定的URL
使用intellij idea对代码实现
1.首先创建一个java Web工程 http://www.cnblogs.com/yangyquin/p/5285272.html
2.完整的站点地图
3.执行流程
1.web.xml,引导进入index.jsp
2.表单提交,action=${pageContext.request.contextPath}/servlet/yeepay/paymentRequest
3.web.xml中配置的Servlet,进入com.dynamic.servlet.PaymentRequest
4.配置参数,转发到connection.jsp中
5.向易宝网关提交请求,请求中包括企业回调业务地址,请求完成后回调 http://localhost:5050/servlet/yeepay/response
6.web.xml中配置的Servlet,进入com.dynamic.servlet.PaymentResutlResponse
7.校验MD5-hmac,成功,执行企业业务代码,数据保存到数据库中
4.代码实现
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<description>发起支付请求</description>
<display-name>发起支付请求</display-name>
<servlet-name>PaymentRequest</servlet-name>
<servlet-class>com.dynamic.servlet.PaymentRequest</servlet-class>
</servlet>
<servlet>
<description>响应支付结果请求</description>
<display-name>响应支付结果请求</display-name>
<servlet-name>PaymentResutlResponse</servlet-name>
<servlet-class>com.dynamic.servlet.PaymentResutlResponse</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PaymentRequest</servlet-name>
<url-pattern>/servlet/yeepay/paymentRequest</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PaymentResutlResponse</servlet-name>
<url-pattern>/servlet/yeepay/response</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
merchantInfo.properties,属性文件,指定参数
p1_MerId=10001126856 #商家ID
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl #商户密钥
merchantCallbackURL=http://localhost:5050/servlet/yeepay/response #商户接收支付成功数据的地址
configInfo,读取属性文件
package com.dynamic.util;
import java.util.Properties;
/**
* Created by fxq on 2017/5/12.
*/
public class ConfigInfo {
private static Properties cache = new Properties();
static {
try {
cache.load(ConfigInfo.class.getClassL