- 支付的工具类:PayUtils.java
- 基于易宝支付的代码:可以参考易宝支付手册!
- 思路: ---》 网站(传递参数:使用了一套加密算法+密钥)
- ---》第三方支付平台(传递参数:使用了一套加密算法+密钥)
- - --》网银(传递参数:使用了一套加密算法+密钥)
- ---》第三方支付平台(传递参数:使用了一套加密算法+密钥)
- ---》网站
- public class PaymentUtil {
- private static String encodingCharset = "UTF-8";
- /**
- * 生成hmac方法
- *
- * @param p0_Cmd 业务类型
- * @param p1_MerId 商户编号
- * @param p2_Order 商户订单号
- * @param p3_Amt 支付金额
- * @param p4_Cur 交易币种
- * @param p5_Pid 商品名称
- * @param p6_Pcat 商品种类
- * @param p7_Pdesc 商品描述
- * @param p8_Url 商户接收支付成功数据的地址
- * @param p9_SAF 送货地址
- * @param pa_MP 商户扩展信息
- * @param pd_FrpId 银行编码
- * @param pr_NeedResponse 应答机制
- * @param keyValue 商户密钥
- * @return
- */
- public static String buildHmac(String p0_Cmd,String p1_MerId,
- String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,
- String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,
- String pr_NeedResponse,String keyValue) {
- StringBuilder sValue = new StringBuilder();
- // 业务类型
- sValue.append(p0_Cmd);
- // 商户编号
- sValue.append(p1_MerId);
- // 商户订单号
- sValue.append(p2_Order);
- // 支付金额
- sValue.append(p3_Amt);
- // 交易币种
- sValue.append(p4_Cur);
- // 商品名称
- sValue.append(p5_Pid);
- // 商品种类
- sValue.append(p6_Pcat);
- // 商品描述
- sValue.append(p7_Pdesc);
- // 商户接收支付成功数据的地址
- sValue.append(p8_Url);
- // 送货地址
- sValue.append(p9_SAF);
- // 商户扩展信息
- sValue.append(pa_MP);
- // 银行编码
- sValue.append(pd_FrpId);
- // 应答机制
- sValue.append(pr_NeedResponse);
- return PaymentUtil.hmacSign(sValue.toString(), keyValue);
- }
- /**
- * 返回校验hmac方法
- *
- * @param hmac 支付网关发来的加密验证码
- * @param p1_MerId 商户编号
- * @param r0_Cmd 业务类型
- * @param r1_Code 支付结果
- * @param r2_TrxId 易宝支付交易流水号
- * @param r3_Amt 支付金额
- * @param r4_Cur 交易币种
- * @param r5_Pid 商品名称
- * @param r6_Order 商户订单号
- * @param r7_Uid 易宝支付会员ID
- * @param r8_MP 商户扩展信息
- * @param r9_BType 交易结果返回类型
- * @param keyValue 密钥
- * @return
- */
- public static boolean verifyCallback(String hmac, String p1_MerId,
- String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
- String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
- String r8_MP, String r9_BType, String keyValue) {
- StringBuilder sValue = new StringBuilder();
- // 商户编号
- sValue.append(p1_MerId);
- // 业务类型
- sValue.append(r0_Cmd);
- // 支付结果
- sValue.append(r1_Code);
- // 易宝支付交易流水号
- sValue.append(r2_TrxId);
- // 支付金额
- sValue.append(r3_Amt);
- // 交易币种
- sValue.append(r4_Cur);
- // 商品名称
- sValue.append(r5_Pid);
- // 商户订单号
- sValue.append(r6_Order);
- // 易宝支付会员ID
- sValue.append(r7_Uid);
- // 商户扩展信息
- sValue.append(r8_MP);
- // 交易结果返回类型
- sValue.append(r9_BType);
- String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
- return sNewString.equals(hmac);
- }
- /**
- * @param aValue
- * @param aKey
- * @return
- */
- public static String hmacSign(String aValue, String aKey) {
- byte k_ipad[] = new byte[64];
- byte k_opad[] = new byte[64];
- byte keyb[];
- byte value[];
- try {
- keyb = aKey.getBytes(encodingCharset);
- value = aValue.getBytes(encodingCharset);
- } catch (UnsupportedEncodingException e) {
- keyb = aKey.getBytes();
- value = aValue.getBytes();
- }
- Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
- Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
- for (int i = 0; i < keyb.length; i++) {
- k_ipad[i] = (byte) (keyb[i] ^ 0x36);
- k_opad[i] = (byte) (keyb[i] ^ 0x5c);
- }
- MessageDigest md = null;
- try {
- md = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- return null;
- }
- md.update(k_ipad);
- md.update(value);
- byte dg[] = md.digest();
- md.reset();
- md.update(k_opad);
- md.update(dg, 0, 16);
- dg = md.digest();
- return toHex(dg);
- }
- public static String toHex(byte input[]) {
- if (input == null)
- return null;
- StringBuffer output = new StringBuffer(input.length * 2);
- for (int i = 0; i < input.length; i++) {
- int current = input[i] & 0xff;
- if (current < 16)
- output.append("0");
- output.append(Integer.toString(current, 16));
- }
- return output.toString();
- }
- /**
- *
- * @param args
- * @param key
- * @return
- */
- public static String getHmac(String[] args, String key) {
- if (args == null || args.length == 0) {
- return (null);
- }
- StringBuffer str = new StringBuffer();
- for (int i = 0; i < args.length; i++) {
- str.append(args[i]);
- }
- return (hmacSign(str.toString(), key));
- }
- /**
- * @param aValue
- * @return
- */
- public static String digest(String aValue) {
- aValue = aValue.trim();
- byte value[];
- try {
- value = aValue.getBytes(encodingCharset);
- } catch (UnsupportedEncodingException e) {
- value = aValue.getBytes();
- }
- MessageDigest md = null;
- try {
- md = MessageDigest.getInstance("SHA");
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- return null;
- }
- return toHex(md.digest(value));
- }
- // public static void main(String[] args) {
- // System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp杩?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t"));
- // }
- }
- /**
- * 订单Action类
- */
- // 为订单付款:
- public String payOrder() throws IOException {
- // 1.修改数据:
- Order currOrder = orderService.findByOid(order.getOid());
- currOrder.setAddr(order.getAddr());
- currOrder.setName(order.getName());
- currOrder.setPhone(order.getPhone());
- // 修改订单
- orderService.update(currOrder);
- // 2.完成付款:
- // 付款需要的参数:
- 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://192.168.36.69:8080/shop/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); // hmac
- // 向易宝发送请求:
- StringBuffer sb = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");
- sb.append("p0_Cmd=").append(p0_Cmd).append("&");
- sb.append("p1_MerId=").append(p1_MerId).append("&");
- sb.append("p2_Order=").append(p2_Order).append("&");
- sb.append("p3_Amt=").append(p3_Amt).append("&");
- sb.append("p4_Cur=").append(p4_Cur).append("&");
- sb.append("p5_Pid=").append(p5_Pid).append("&");
- sb.append("p6_Pcat=").append(p6_Pcat).append("&");
- sb.append("p7_Pdesc=").append(p7_Pdesc).append("&");
- sb.append("p8_Url=").append(p8_Url).append("&");
- sb.append("p9_SAF=").append(p9_SAF).append("&");
- sb.append("pa_MP=").append(pa_MP).append("&");
- sb.append("pd_FrpId=").append(pd_FrpId).append("&");
- sb.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");
- sb.append("hmac=").append(hmac);
- //校验返回的Hmac
- Boolean verify=PayUtils. verifyCallback(String hmac, String p1_MerId,
- String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
- String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
- String r8_MP, String r9_BType, String keyValue);
- //如果成功,则向易宝发出请求,否则保存错误信息到errorPage;
- if(verify==true){
-
- / / 重定向:向易宝出发:
- ServletActionContext.getResponse().sendRedirect(sb.toString());
- return NONE;
- }else{
- this.addActionMessage("你不是什么好人!!");
- return "msg";
- }
- }
- // 付款成功后跳转回来的路径:
- public String callBack(){
- // 修改订单的状态:
- Order currOrder = orderService.findByOid(Integer.parseInt(r6_Order));
- // 修改订单状态为2:已经付款:
- currOrder.setState(2);
- orderService.update(currOrder);
- this.addActionMessage("支付成功!订单编号为: "+r6_Order +" 付款金额为: "+r3_Amt);
- return "msg";
- }