一、流程分析
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">¥${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的两种通知类型中都要进行业务处理。并注意处理重复订单的问题,以防两次通知都处理了相同的业务造成损失。
关于两种通知和业务处理说明:如果用户在支付成功后,并没有通知商家而是直接关闭了重定向的窗口,那么重定向就不会通知到商户,不管用户是否重定向通知到商户,服务器点对点通知都会通知到商户,所以在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