1.在线支付的两种常见支付方式和采用第三方支付公司的支付流程。
第三方支付公司的支付流程:
2.易宝:参考内容
商户账号:p1_MerId=10001126856
秘钥:keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
加密算法:PaymentUtil.java
请求参数处理:PayServlet.java
返回参数处理:CallbackServlet.java
易宝支付产品通用接口帮助文档.CHM
电子签名的使用:在网站向易宝提交数据的时候通过网站提交的hmac码和易宝自己生产的hamc对比看数据在传递过程中是否被改变。
3.支付代码:
1.jsp页面中提交<formid="orderForm" action="${ pageContext.request.contextPath}/order_payOrder.action" method="post">
action中进行处理:
2.Action处理
<span style="font-family:SimSun;font-size:18px;">public class OrderAction extends ActionSupport implements ModelDriven<Order>
{
// 模型驱动
private Order order = new Order();
public Order getModel()
{
// TODO Auto-generated method stub
return order;
}
// 接受支付通道编码
private String pd_FrpId;
public void setPd_FrpId(String pd_FrpId)
{
this.pd_FrpId = pd_FrpId;
}
// 接受付完款成功之后的相应参数。
private String r6_Order;
private String r3_Amt;
public void setr6_Order(String r6_Order)
{
this.r6_Order = r6_Order;
}
public void setr3_Amt(String r3_Amt)
{
this.r3_Amt = r3_Amt;
}
// 为订单付款的方法
public String payOrder() throws IOException
{
// 为订单付款
String p0_Cmd = "Buy"; // 业务类型
String p1_MerId = "10001126856"; // 商户编号
String p2_Order = order.getOid().toString(); // 订单编号
String p3_Amt = "0.01"; // 支付金额
String p4_Cur = "CNY"; // 交易货币
String p5_Pid = ""; // 商品名称
String p6_Pcat = ""; //商品类型
String p7_Pdesc = ""; //商品描述
String p8_Url = "http://localhost:8080/shop3.8/order_callBack.action"; //
String p9_SAF = ""; //送货地址
String pa_MP = ""; //扩展信息
String pd_FrpId = this.pd_FrpId; // 支付通道编码
String pr_NeedResponse = "1"; // 应答机制
String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"; // 秘钥
String hmac = PaymentUtil.buildHmac(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); //
StringBuffer stringBuffer = new StringBuffer(
"https://www.yeepay.com/app-merchant-proxy/node?");
stringBuffer.append("p0_Cmd=").append(p0_Cmd).append("&");
stringBuffer.append("p1_MerId=").append(p1_MerId).append("&");
stringBuffer.append("p2_Order=").append(p2_Order).append("&");
stringBuffer.append("p3_Amt=").append(p3_Amt).append("&");
stringBuffer.append("p4_Cur=").append(p4_Cur).append("&");
stringBuffer.append("p5_Pid=").append(p5_Pid).append("&");
stringBuffer.append("p6_Pcat=").append(p6_Pcat).append("&");
stringBuffer.append("p7_Pdesc=").append(p7_Pdesc).append("&");
stringBuffer.append("p8_Url=").append(p8_Url).append("&");
stringBuffer.append("p9_SAF=").append(p9_SAF).append("&");
stringBuffer.append("pa_MP=").append(pa_MP).append("&");
stringBuffer.append("pd_FrpId=").append(pd_FrpId).append("&");
stringBuffer.append("pr_NeedResponse=").append(pr_NeedResponse)
.append("&");
stringBuffer.append("keyValue=").append(keyValue).append("&");
stringBuffer.append("hmac=").append(hmac);
// 重定向到易宝
ServletActionContext.getResponse()
.sendRedirect(stringBuffer.toString());
return NONE;
}
</span>
3.点击支付:已经付过款的商品显示
没有付款的商品跳转到付快页面
4.付款成功之后的转向操作:
易宝说明:
关于两种通知和业务处理说明:如果用户在支付成功后,并没有通知商家而是直接关闭了重定向的窗口,那么重定向就不会通知到商户,不管用户是否重定向通知到商户,服务器点对点通知都会通知到商户,所以在callback页中r9_btype=1和r9_btype=2的两种通知类型中都要进行业务处理。并注意处理重复订单的问题,以防两次通知都处理了相同的业务造成损失。
点对点需要固定的ip地址,在网站接受第三方公司传递来的数据时也要进行hmac码的验证操作。判断数据时候为真实数据。
5.转向代码
<span style="font-family:SimSun;font-size:18px;">// 订单成功之后的转向
public String callBack()
{
// 修改订单状态,改为已经付款
Order cuOrder = orderService.findByOid(Integer.parseInt(r6_Order));
cuOrder.setState(2);
orderService.update(cuOrder);
// 在页面显示付款成功信息!
this.addActionMessage("订单付款成功:订单编号" + r6_Order + "付款金额:" + r3_Amt);
return "msg";
}
</span>
6.最后显示付款成功页面