易宝——在线支付

来源:互联网 发布:弹弓皮筋个人多长算法 编辑:程序博客网 时间:2024/06/06 02:02

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 stubreturn 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.付款成功之后的转向操作:

     易宝说明:

     只有支付成功时易宝支付才会通知商户。
     支付成功回调有两种,都会以GET形式通知到在线支付请求参数中的p8_Url上:
     ■ 浏览器重定向
     ■ 服务器点对点通讯
     关于两种通知和业务处理说明:如果用户在支付成功后,并没有通知商家而是直接关闭了重定向的窗口,那么重定向就不会通知到商户,不管用户是否重定向通知到商户,服务器点对点通知都会通知到商户,所以在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.最后显示付款成功页面




1 0
原创粉丝点击