网上图书商城项目学习笔记-022易宝支付

一、流程分析

1.在线支付介绍

2.易宝的支付流程

3.支付发起点

4.订单支付之请求易宝

二、代码

1.view层

(1)desc.jsp

1 <c:if test="${order.status eq 1 }">
2     <a href="<c:url value='/OrderServlet?method=prePay&oid=${order.oid }'/>" class="pay"></a><br/>
3 </c:if>    

 (2)pay.jsp

  1 <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
  2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3 
  4 
  5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6 <html>
  7   <head>
  8     <title>pay.jsp</title>
  9     
 10     <meta http-equiv="pragma" content="no-cache">
 11     <meta http-equiv="cache-control" content="no-cache">
 12     <meta http-equiv="expires" content="0">    
 13     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 14     <meta http-equiv="description" content="This is my page">
 15     <!--
 16     <link rel="stylesheet" type="text/css" href="styles.css">
 17     -->
 18     <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/order/pay.css'/>">
 19     <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script>
 20 
 21 <script type="text/javascript">
 22 $(function() {
 23     $("img").click(function() {
 24         $("#" + $(this).attr("name")).attr("checked", true);
 25     });
 26 });
 27 </script>
 28   </head>
 29   
 30   <body>
 31 <div class="divContent">
 32     <span class="spanPrice">支付金额:</span><span class="price_t">&yen;${order.total }</span>
 33     <span class="spanOid">编号:${order.oid} }</span>
 34 </div>
 35 <form action="<c:url value='/OrderServlet'/>" method="post" id="form1" target="_top">
 36 <input type="hidden" name="method" value="pay"/>
 37 <input type="hidden" name="oid" value="${order.oid }"/>
 38 <div class="divBank">
 39     <div class="divText">选择网上银行</div>
 40     <div style="margin-left: 20px;">
 41       <div style="margin-bottom: 20px;">
 42         <input id="ICBC-NET-B2C" type="radio" name="yh" value="ICBC-NET-B2C" checked="checked"/>
 43         <img name="ICBC-NET-B2C" align="middle" src="<c:url value='/bank_img/icbc.bmp'/>"/>
 44         
 45         <input id="CMBCHINA-NET-B2C" type="radio" name="yh" value="CMBCHINA-NET-B2C"/>
 46         <img name="CMBCHINA-NET-B2C" align="middle" src="<c:url value='/bank_img/cmb.bmp'/>"/>
 47 
 48         <input id="ABC-NET-B2C" type="radio" name="yh" value="ABC-NET-B2C"/>
 49         <img name="ABC-NET-B2C" align="middle" src="<c:url value='/bank_img/abc.bmp'/>"/>
 50         
 51         <input id="CCB-NET-B2C" type="radio" name="yh" value="CCB-NET-B2C"/>
 52         <img name="CCB-NET-B2C" align="middle" src="<c:url value='/bank_img/ccb.bmp'/>"/>
 53       </div>    
 54       <div style="margin-bottom: 20px;">
 55         <input id="BCCB-NET-B2C" type="radio" name="yh" value="BCCB-NET-B2C"/>
 56         <img name="BCCB-NET-B2C" align="middle" src="<c:url value='/bank_img/bj.bmp'/>"/>
 57 
 58         <input id="BOCO-NET-B2C" type="radio" name="yh" value="BOCO-NET-B2C"/>
 59         <img name="BOCO-NET-B2C" align="middle" src="<c:url value='/bank_img/bcc.bmp'/>"/>
 60 
 61         <input id="CIB-NET-B2C" type="radio" name="yh" value="CIB-NET-B2C"/>
 62         <img name="CIB-NET-B2C" align="middle" src="<c:url value='/bank_img/cib.bmp'/>"/>
 63 
 64         <input id="NJCB-NET-B2C" type="radio" name="yh" value="NJCB-NET-B2C"/>
 65         <img name="NJCB-NET-B2C" align="middle" src="<c:url value='/bank_img/nanjing.bmp'/>"/>
 66       </div>
 67       <div style="margin-bottom: 20px;">
 68         <input id="CMBC-NET-B2C" type="radio" name="yh" value="CMBC-NET-B2C"/>
 69         <img name="CMBC-NET-B2C" align="middle" src="<c:url value='/bank_img/cmbc.bmp'/>"/>
 70 
 71         <input id="CEB-NET-B2C" type="radio" name="yh" value="CEB-NET-B2C"/>
 72         <img name="CEB-NET-B2C" align="middle" src="<c:url value='/bank_img/guangda.bmp'/>"/>
 73 
 74         <input id="BOC-NET-B2C" type="radio" name="yh" value="BOC-NET-B2C"/>
 75         <img name="BOC-NET-B2C" align="middle" src="<c:url value='/bank_img/bc.bmp'/>"/>
 76 
 77         <input id="PINGANBANK-NET" type="radio" name="yh" value="PINGANBANK-NET"/>
 78         <img name="PINGANBANK-NET" align="middle" src="<c:url value='/bank_img/pingan.bmp'/>"/>
 79       </div>
 80       <div style="margin-bottom: 20px;">
 81         <input id="CBHB-NET-B2C" type="radio" name="yh" value="CBHB-NET-B2C"/>
 82         <img name="CBHB-NET-B2C" align="middle" src="<c:url value='/bank_img/bh.bmp'/>"/>
 83 
 84         <input id="HKBEA-NET-B2C" type="radio" name="yh" value="HKBEA-NET-B2C"/>
 85         <img name="HKBEA-NET-B2C" align="middle" src="<c:url value='/bank_img/dy.bmp'/>"/>
 86 
 87         <input id="NBCB-NET-B2C" type="radio" name="yh" value="NBCB-NET-B2C"/>
 88         <img name="NBCB-NET-B2C" align="middle" src="<c:url value='/bank_img/ningbo.bmp'/>"/>
 89 
 90         <input id="ECITIC-NET-B2C" type="radio" name="yh" value="ECITIC-NET-B2C"/>
 91         <img name="ECITIC-NET-B2C" align="middle" src="<c:url value='/bank_img/zx.bmp'/>"/>
 92       </div>
 93       <div style="margin-bottom: 20px;">
 94         <input id="SDB-NET-B2C" type="radio" name="yh" value="SDB-NET-B2C"/>
 95         <img name="SDB-NET-B2C" align="middle" src="<c:url value='/bank_img/sfz.bmp'/>"/>
 96 
 97         <input id="GDB-NET-B2C" type="radio" name="yh" value="GDB-NET-B2C"/>
 98         <img name="GDB-NET-B2C" align="middle" src="<c:url value='/bank_img/gf.bmp'/>"/>
 99 
100         <input id="SHB-NET-B2C" type="radio" name="yh" value="SHB-NET-B2C"/>
101         <img name="SHB-NET-B2C" align="middle" src="<c:url value='/bank_img/sh.bmp'/>"/>
102 
103         <input id="SPDB-NET-B2C" type="radio" name="yh" value="SPDB-NET-B2C"/>
104         <img name="SPDB-NET-B2C" align="middle" src="<c:url value='/bank_img/shpd.bmp'/>"/>
105       </div>
106       <div style="margin-bottom: 20px;">
107         <input id="POST-NET-B2C" type="radio" name="yh" value="POST-NET-B2C"/>
108         <img name="POST-NET-B2C" align="middle" src="<c:url value='/bank_img/post.bmp'/>"/>
109 
110         <input id="BJRCB-NET-B2C" type="radio" name="yh" value="BJRCB-NET-B2C"/>
111         <img name="BJRCB-NET-B2C" align="middle" src="<c:url value='/bank_img/beijingnongshang.bmp'/>"/>
112 
113         <input id="HXB-NET-B2C" type="radio" name="yh" value="HXB-NET-B2C"/>
114         <img name="HXB-NET-B2C" align="middle" src="<c:url value='/bank_img/hx.bmp'/>"/>
115 
116         <input id="CZ-NET-B2C" type="radio" name="yh" value="CZ-NET-B2C"/>
117         <img name="CZ-NET-B2C" align="middle" src="<c:url value='/bank_img/zheshang.bmp'/>"/>
118       </div>
119     </div>
120     <div style="margin: 40px;">
121         <a href="javascript:void $('#form1').submit();" class="linkNext">下一步</a>
122     </div>
123 </div>
124 </form>
125   </body>
126 </html>

2.servlet层

(1)OrderServlet.java 

  1     /**
  2      * 跳转支付页面
  3      * @param req
  4      * @param resp
  5      * @return
  6      * @throws ServletException
  7      * @throws IOException
  8      */
  9     public String prePay(HttpServletRequest req, HttpServletResponse resp)
 10             throws ServletException, IOException {
 11         req.setAttribute("order", service.load(req.getParameter("oid")));
 12         return "f:/jsps/order/pay.jsp";
 13     }
 14     
 15     public String pay(HttpServletRequest req, HttpServletResponse resp)
 16             throws ServletException, IOException {
 17         req.setAttribute("order", service.load(req.getParameter("oid")));
 18         Properties props = new Properties();
 19         props.load(this.getClass().getClassLoader().getResourceAsStream("payment.properties"));
 20         
 21         /*
 22          * 1. 准备13个参数
 23          */
 24         String p0_Cmd = "Buy";//业务类型,固定值Buy
 25         String p1_MerId = props.getProperty("p1_MerId");//商号编码,在易宝的唯一标识
 26         String p2_Order = req.getParameter("oid");//订单编码
 27         String p3_Amt = "0.01";//支付金额
 28         String p4_Cur = "CNY";//交易币种,固定值CNY
 29         String p5_Pid = "";//商品名称
 30         String p6_Pcat = "";//商品种类
 31         String p7_Pdesc = "";//商品描述
 32         String p8_Url = props.getProperty("p8_Url");//在支付成功后,易宝会访问这个地址。
 33         String p9_SAF = "";//送货地址
 34         String pa_MP = "";//扩展信息
 35         String pd_FrpId = req.getParameter("yh");//支付通道
 36         String pr_NeedResponse = "1";//应答机制,固定值1
 37         
 38         /*
 39          * 2. 计算hmac
 40          * 需要13个参数
 41          * 需要keyValue
 42          * 需要加密算法
 43          */
 44         String keyValue = props.getProperty("keyValue");
 45         String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order,
 46                 p3_Amt, p4_Cur, p5_Pid, p6_Pcat,
 47                 p7_Pdesc, p8_Url, p9_SAF, pa_MP, 
 48                 pd_FrpId, pr_NeedResponse, keyValue);
 49         
 50         /*
 51          * 3. 重定向到易宝的支付网关
 52          */
 53         StringBuilder sb = new StringBuilder("https://www.yeepay.com/app-merchant-proxy/node");
 54         sb.append("?").append("p0_Cmd=").append(p0_Cmd);
 55         sb.append("&").append("p1_MerId=").append(p1_MerId);
 56         sb.append("&").append("p2_Order=").append(p2_Order);
 57         sb.append("&").append("p3_Amt=").append(p3_Amt);
 58         sb.append("&").append("p4_Cur=").append(p4_Cur);
 59         sb.append("&").append("p5_Pid=").append(p5_Pid);
 60         sb.append("&").append("p6_Pcat=").append(p6_Pcat);
 61         sb.append("&").append("p7_Pdesc=").append(p7_Pdesc);
 62         sb.append("&").append("p8_Url=").append(p8_Url);
 63         sb.append("&").append("p9_SAF=").append(p9_SAF);
 64         sb.append("&").append("pa_MP=").append(pa_MP);
 65         sb.append("&").append("pd_FrpId=").append(pd_FrpId);
 66         sb.append("&").append("pr_NeedResponse=").append(pr_NeedResponse);
 67         sb.append("&").append("hmac=").append(hmac);
 68         
 69         resp.sendRedirect(sb.toString());
 70         return null;
 71     }
 72     
 73     public String back(HttpServletRequest req, HttpServletResponse resp)
 74             throws ServletException, IOException {
 75         
 76         /*
 77          * 1. 获取12个参数
 78          */
 79         String p1_MerId = req.getParameter("p1_MerId");
 80         String r0_Cmd = req.getParameter("r0_Cmd");
 81         String r1_Code = req.getParameter("r1_Code");
 82         String r2_TrxId = req.getParameter("r2_TrxId");
 83         String r3_Amt = req.getParameter("r3_Amt");
 84         String r4_Cur = req.getParameter("r4_Cur");
 85         String r5_Pid = req.getParameter("r5_Pid");
 86         String r6_Order = req.getParameter("r6_Order");
 87         String r7_Uid = req.getParameter("r7_Uid");
 88         String r8_MP = req.getParameter("r8_MP");
 89         String r9_BType = req.getParameter("r9_BType");
 90         String hmac = req.getParameter("hmac");
 91         
 92         /*
 93          * 2. 获取keyValue
 94          */
 95         Properties props = new Properties();
 96         props.load(this.getClass().getClassLoader().getResourceAsStream("payment.properties"));
 97         String keyValue = props.getProperty("keyValue");
 98         
 99         /*
100          * 3. 调用PaymentUtil的校验方法来校验调用者的身份
101          *   >如果校验失败:保存错误信息,转发到msg.jsp
102          *   >如果校验通过:
103          *     * 判断访问的方法是重定向还是点对点,如果要是重定向
104          *     修改订单状态,保存成功信息,转发到msg.jsp
105          *     * 如果是点对点:修改订单状态,返回success
106          */
107         boolean bool = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType, keyValue);
108         if(!bool) {
109             req.setAttribute("code", "error");
110             req.setAttribute("msg", "无效的签名,支付失败!(cnm)");
111             return "f:/jsps/msg.jsp";
112         }
113         if(r1_Code.equals("1")) {
114             service.updateStatus(r6_Order, 2);
115             if(r9_BType.equals("1")) {
116                 req.setAttribute("code", "success");
117                 req.setAttribute("msg", "恭喜,支付成功!");
118                 return "f:/jsps/msg.jsp";
119             } else if(r9_BType.equals("2")) {
120                 resp.getWriter().print("success");
121             }
122         }
123         return null;
124     }

3.其他辅助文件等

(1)payment.properties

1 p1_MerId=10001126856
2 keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
3 p8_Url=http://localhost:8080/goods/OrderServlet?method=back

(2)PaymentUtil.java

  1 package com.tony.goods.order.web.servlet;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 import java.security.MessageDigest;
  5 import java.security.NoSuchAlgorithmException;
  6 import java.util.Arrays;
  7 
  8 public class PaymentUtil {
  9 
 10     private static String encodingCharset = "UTF-8";
 11     
 12     /**
 13      * 生成hmac方法
 14      * 
 15      * @param p0_Cmd 业务类型
 16      * @param p1_MerId 商户编号
 17      * @param p2_Order 商户订单号
 18      * @param p3_Amt 支付金额
 19      * @param p4_Cur 交易币种
 20      * @param p5_Pid 商品名称
 21      * @param p6_Pcat 商品种类
 22      * @param p7_Pdesc 商品描述
 23      * @param p8_Url 商户接收支付成功数据的地址
 24      * @param p9_SAF 送货地址
 25      * @param pa_MP 商户扩展信息
 26      * @param pd_FrpId 银行编码
 27      * @param pr_NeedResponse 应答机制
 28      * @param keyValue 商户密钥
 29      * @return
 30      */
 31     public static String buildHmac(String p0_Cmd,String p1_MerId,
 32             String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,
 33             String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,
 34             String pr_NeedResponse,String keyValue) {
 35         StringBuilder sValue = new StringBuilder();
 36         // 业务类型
 37         sValue.append(p0_Cmd);
 38         // 商户编号
 39         sValue.append(p1_MerId);
 40         // 商户订单号
 41         sValue.append(p2_Order);
 42         // 支付金额
 43         sValue.append(p3_Amt);
 44         // 交易币种
 45         sValue.append(p4_Cur);
 46         // 商品名称
 47         sValue.append(p5_Pid);
 48         // 商品种类
 49         sValue.append(p6_Pcat);
 50         // 商品描述
 51         sValue.append(p7_Pdesc);
 52         // 商户接收支付成功数据的地址
 53         sValue.append(p8_Url);
 54         // 送货地址
 55         sValue.append(p9_SAF);
 56         // 商户扩展信息
 57         sValue.append(pa_MP);
 58         // 银行编码
 59         sValue.append(pd_FrpId);
 60         // 应答机制
 61         sValue.append(pr_NeedResponse);
 62         
 63         return PaymentUtil.hmacSign(sValue.toString(), keyValue);
 64     }
 65     
 66     /**
 67      * 返回校验hmac方法
 68      * 
 69      * @param hmac 支付网关发来的加密验证码
 70      * @param p1_MerId 商户编号
 71      * @param r0_Cmd 业务类型
 72      * @param r1_Code 支付结果
 73      * @param r2_TrxId 易宝支付交易流水号
 74      * @param r3_Amt 支付金额
 75      * @param r4_Cur 交易币种
 76      * @param r5_Pid 商品名称
 77      * @param r6_Order 商户订单号
 78      * @param r7_Uid 易宝支付会员ID
 79      * @param r8_MP 商户扩展信息
 80      * @param r9_BType 交易结果返回类型
 81      * @param keyValue 密钥
 82      * @return
 83      */
 84     public static boolean verifyCallback(String hmac, String p1_MerId,
 85             String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
 86             String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
 87             String r8_MP, String r9_BType, String keyValue) {
 88         StringBuilder sValue = new StringBuilder();
 89         // 商户编号
 90         sValue.append(p1_MerId);
 91         // 业务类型
 92         sValue.append(r0_Cmd);
 93         // 支付结果
 94         sValue.append(r1_Code);
 95         // 易宝支付交易流水号
 96         sValue.append(r2_TrxId);
 97         // 支付金额
 98         sValue.append(r3_Amt);
 99         // 交易币种
100         sValue.append(r4_Cur);
101         // 商品名称
102         sValue.append(r5_Pid);
103         // 商户订单号
104         sValue.append(r6_Order);
105         // 易宝支付会员ID
106         sValue.append(r7_Uid);
107         // 商户扩展信息
108         sValue.append(r8_MP);
109         // 交易结果返回类型
110         sValue.append(r9_BType);
111         String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
112         return sNewString.equals(hmac);
113     }
114     
115     /**
116      * @param aValue
117      * @param aKey
118      * @return
119      */
120     public static String hmacSign(String aValue, String aKey) {
121         byte k_ipad[] = new byte[64];
122         byte k_opad[] = new byte[64];
123         byte keyb[];
124         byte value[];
125         try {
126             keyb = aKey.getBytes(encodingCharset);
127             value = aValue.getBytes(encodingCharset);
128         } catch (UnsupportedEncodingException e) {
129             keyb = aKey.getBytes();
130             value = aValue.getBytes();
131         }
132 
133         Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
134         Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
135         for (int i = 0; i < keyb.length; i++) {
136             k_ipad[i] = (byte) (keyb[i] ^ 0x36);
137             k_opad[i] = (byte) (keyb[i] ^ 0x5c);
138         }
139 
140         MessageDigest md = null;
141         try {
142             md = MessageDigest.getInstance("MD5");
143         } catch (NoSuchAlgorithmException e) {
144 
145             return null;
146         }
147         md.update(k_ipad);
148         md.update(value);
149         byte dg[] = md.digest();
150         md.reset();
151         md.update(k_opad);
152         md.update(dg, 0, 16);
153         dg = md.digest();
154         return toHex(dg);
155     }
156 
157     public static String toHex(byte input[]) {
158         if (input == null)
159             return null;
160         StringBuffer output = new StringBuffer(input.length * 2);
161         for (int i = 0; i < input.length; i++) {
162             int current = input[i] & 0xff;
163             if (current < 16)
164                 output.append("0");
165             output.append(Integer.toString(current, 16));
166         }
167 
168         return output.toString();
169     }
170 
171     /**
172      * 
173      * @param args
174      * @param key
175      * @return
176      */
177     public static String getHmac(String[] args, String key) {
178         if (args == null || args.length == 0) {
179             return (null);
180         }
181         StringBuffer str = new StringBuffer();
182         for (int i = 0; i < args.length; i++) {
183             str.append(args[i]);
184         }
185         return (hmacSign(str.toString(), key));
186     }
187 
188     /**
189      * @param aValue
190      * @return
191      */
192     public static String digest(String aValue) {
193         aValue = aValue.trim();
194         byte value[];
195         try {
196             value = aValue.getBytes(encodingCharset);
197         } catch (UnsupportedEncodingException e) {
198             value = aValue.getBytes();
199         }
200         MessageDigest md = null;
201         try {
202             md = MessageDigest.getInstance("SHA");
203         } catch (NoSuchAlgorithmException e) {
204             e.printStackTrace();
205             return null;
206         }
207         return toHex(md.digest(value));
208 
209     }
210     
211 //    public static void main(String[] args) {
212 //        System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp杩?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t"));
213 //    }
214 }

(3)支付主要 参数说明

支付请求参数说明
 

正式请求地址https://www.yeepay.com/app-merchant-proxy/node

 参数名称  参数含义 是否必填  参数长度  参数说明  签名顺序
 p0_Cmd  业务类型  Max(20)  固定值“Buy” . 1
 p1_MerId  商户编号  Max(11) 商户在易宝支付系统的唯一身份标识.获取方式见“如何获得商户编号” 2
 p2_Order  商户订单号  Max(50) 若不为””,提交的订单号必须在自身账户交易中唯一;为 ””
时,易宝支付会自动生成随机的商户订单号.易宝支付系统中对于已付或者撤销的订单,商户端不能重复提交。
3
 p3_Amt  支付金额  Max(20)  单位:元,精确到分.此参数为空则无法直连(如直连会报错:抱歉,交易金额太小。),必须到易宝网关让消费者输入金额 4
 p4_Cur  交易币种  Max(10)  固定值 ”CNY”. 5
 p5_Pid  商品名称  Max(20) 用于支付时显示在易宝支付网关左侧的订单产品信息.
此参数如用到中文,请注意转码.
6
 p6_Pcat  商品种类  Max(20)  商品种类.
 此参数如用到中文,请注意转码.
7
 p7_Pdesc  商品描述  Max(20)  商品描述.
 此参数如用到中文,请注意转码.
8
 p8_Url  商户接收支付成功数据的地址  Max(200) 支付成功后易宝支付会向该地址发送两次成功通知,该地址可以带参数,如:
“ www.yeepay.com/callback.action?test=test”.
注意:如不填p8_Url的参数值支付成功后您将得不到支付成功的通知。
9
 p9_SAF  送货地址  Max(1) 为“1”: 需要用户将送货地址留在易宝支付系统;为“0”: 不需要,默认为 ”0”. 10
 pa_MP  商户扩展信息  Max(200)  返回时原样返回,此参数如用到中文,请注意转码. 11
 pd_FrpId  支付通道编码  Max(50) 默认为 ”” ,到易宝支付网关.
若不需显示易宝支付的页面,直接跳转到各银行、
神州行支付、骏网一卡通等支付页面,
该字段可依照附录:支付通道编码列表 设置参数值.如果此值设置错误则会报"error.noAvaliableFrp"错误
12
 pr_NeedResponse  应答机制  Max(1)

固定值为“1”: 需要应答机制; 收到易宝支付服务器点对点支付成功通知,必须回写以”success”(无关大小写)开头的字符串,即使您收到成功通知时发现该订单已经处理过,也要正确回写”success”,否则易宝支付将认为您的系统没有收到通知,启动重发机制,直到收到”success”为止。

13
 hmac  签名数据    Max(32) 产生hmac需要两个参数,并调用相关API.
参数1: STR,列表中的参数值按照签名顺序拼接所产生的字符串,注意null要转换为 ””,并确保无乱码.
参数2: 商户密钥.见"如何获得商户密钥"
各语言范例已经提供封装好了的方法用于生成此参数。
如果以上两个参数有错误,则该参数必然错误,见"抱歉,交易签名无效."
支付结果参数说明
 

 

只有支付成功时易宝支付才会通知商户。
支付成功回调有两种,都会以GET形式通知到在线支付请求参数中的p8_Url上:
■ 浏览器重定向
■ 服务器点对点通讯
关于两种通知和业务处理说明:如果用户在支付成功后,并没有通知商家而是直接关闭了重定向的窗口,那么重定向就不会通知到商户,不管用户是否重定向通知到商户,服务器点对点通知都会通知到商户,所以在callback页中r9_btype=1和r9_btype=2的两种通知类型中都要进行业务处理。并注意处理重复订单的问题,以防两次通知都处理了相同的业务造成损失。
 参数名称  参数含义  参数长度  参数说明  签名顺序
 p1_MerId  商户编号  Max(11)  商户在易宝支付系统的唯一身份标识. 1
 r0_Cmd  业务类型  Max(20) 固定值 ”Buy”. 2
 r1_Code  支付结果   固定值 “1”, 代表支付成功. 3
 r2_TrxId  易宝支付交易流水号  Max(50) 易宝支付平台产生的交易流水号,每笔订单唯一 4
 r3_Amt  支付金额  Max(20) 单位:元,精确到分. 商户收到该返回数据后,一定用自己数据库中存储的金额与该金额进行比较. 5
 r4_Cur  交易币种  Max(10) 返回时是"RMB" 6
 r5_Pid  商品名称  Max(20)  易宝支付返回商户设置的商品名称.
 此参数如用到中文,请注意转码.
7
 r6_Order  商户订单号  Max(50)  易宝支付返回商户订单号. 8
 r7_Uid  易宝支付会员ID  Max(50) 如果用户使用的易宝支付会员进行支付则返回该用户的易宝支付会员ID;反之为””. 9
 r8_MP  商户扩展信息  Max(200) 此参数如用到中文,请注意转码. 10
 r9_BType  交易结果返回类型  Max(1)  为“1”: 浏览器重定向;
 为“2”: 服务器点对点通讯.
11
 rb_BankId  支付通道编码   返回用户所使用的支付通道编码.
该返回参数不参与到hmac校验,范例中没有收录,可根据您的需要自行添加.
 
 ro_BankOrderId  银行订单号   该返回参数不参与到hmac校验,范例中没有收录,可根据您的需要自行添加.  
 rp_PayDate  支付成功时间   该返回参数不参与到hmac校验,范例中没有收录,可根据您的需要自行添加.  
 rq_CardNo  神州行充值卡序列号   若用户使用神州行卡支付,返回用户所使用的神州行卡序列号. 该返回参数不参与到hmac校验,范例中没有收录,可根据您的需要自行添加.  
 ru_Trxtime  交易结果通知时间   该返回参数不参与到hmac校验,范例中没有收录,可根据您的需要自行添加.  
 hmac  签名数据  Max(32) 产生hmac需要两个参数,并调用相关API.
参数1: STR,列表中的参数值按照签名顺序拼接所产生的字符串,注意null要转换为 ””,并确保无乱码.
参数2: 商户密钥.见"如何获得商户密钥"
各语言范例已经提供封装好了的方法用于生成此参数。
如果以上两个参数有错误,则该参数必然错误,见"抱歉,交易签名无效."
 
 
易宝在线支付资料:http://pan.baidu.com/s/1mhancfA
原文地址:https://www.cnblogs.com/shamgod/p/5174748.html