/** * 验证微信签名 * * @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数 * @return 开发者通过检验signature对请求进行相关校验。若确认此次GET请求来自微信服务器 请原样返回echostr参数内容,则接入生效 成为开发者成功,否则接入失败 * @see <a href="http://mp.weixin.qq.com/wiki/0/61c3a8b9d50ac74f18bdf2e54ddfc4e0.html">接入指南</a> */ public static String signature(String... para) { Arrays.sort(para); StringBuffer sb = new StringBuffer(); for (String str : para) { sb.append(str); } return DigestUtil.SHA1(sb.toString()); }
/** * 生成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 getReqMd5HmacForOnlinePayment( 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) { StringBuffer sValue = new StringBuffer(); // 业务类型 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); String sNewString = null; sNewString = DigestUtil.hmacSign(sValue.toString(), keyValue); return (sNewString); }
/** * 返回校验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 易宝支付会员ID * @param r7_Uid 商户扩展信息 * @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) { StringBuffer sValue = new StringBuffer(); // 商户编号 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 = null; sNewString = DigestUtil.hmacSign(sValue.toString(), keyValue); if (hmac.equals(sNewString)) { return (true); } return (false); }
/** * 订单查询请求参数 该方法是根据《易宝支付产品通用接口(HTML版)文档 v3.0》怎样查询订单进行的封装 具体参数含义请仔细阅读《易宝支付产品通用接口(HTML版)文档 v3.0》 * 商户订单号 * * @param p2_Order * @return queryResult */ public static QueryResult queryByOrder(String p2_Order) { QueryResult qr = null; String hmac = DigestUtil.getHmac(new String[] {query_Cmd, p1_MerId, p2_Order}, keyValue); Map reParams = new HashMap(); reParams.put("p0_Cmd", query_Cmd); reParams.put("p1_MerId", p1_MerId); reParams.put("p2_Order", p2_Order); reParams.put("hmac", hmac); List responseStr = null; try { log.debug("Begin http communications.data[" + reParams + "]"); responseStr = HttpUtils.URLGet(queryRefundReqURL, reParams); log.debug("End http communications.responseStr.data[" + responseStr + "]"); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } if (responseStr.size() == 0) { throw new RuntimeException("No response."); } qr = new QueryResult(); for (int t = 0; t < responseStr.size(); t++) { String currentResult = (String) responseStr.get(t); if (currentResult == null || currentResult.equals("")) { continue; } int i = currentResult.indexOf("="); int j = currentResult.length(); if (i >= 0) { String sKey = currentResult.substring(0, i); String sValue = currentResult.substring(i + 1); try { sValue = URLDecoder.decode(sValue, decodeCharset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage()); } if (sKey.equals("r0_Cmd")) { qr.setR0_Cmd(sValue); } else if (sKey.equals("r1_Code")) { qr.setR1_Code(sValue); } else if (sKey.equals("r2_TrxId")) { qr.setR2_TrxId(sValue); } else if (sKey.equals("r3_Amt")) { qr.setR3_Amt(sValue); } else if (sKey.equals("r4_Cur")) { qr.setR4_Cur(sValue); } else if (sKey.equals("r5_Pid")) { qr.setR5_Pid(sValue); } else if (sKey.equals("r6_Order")) { qr.setR6_Order(sValue); } else if (sKey.equals("r8_MP")) { qr.setR8_MP(sValue); } else if (sKey.equals("rb_PayStatus")) { qr.setRb_PayStatus(sValue); } else if (sKey.equals("rc_RefundCount")) { qr.setRc_RefundCount(sValue); } else if (sKey.equals("rd_RefundAmt")) { qr.setRd_RefundAmt(sValue); } else if (sKey.equals("hmac")) { qr.setHmac(sValue); } } } if (!qr.getR1_Code().equals("1")) { throw new RuntimeException("Query fail.Error code:" + qr.getR1_Code()); } String newHmac = ""; newHmac = DigestUtil.getHmac( new String[] { qr.getR0_Cmd(), qr.getR1_Code(), qr.getR2_TrxId(), qr.getR3_Amt(), qr.getR4_Cur(), qr.getR5_Pid(), qr.getR6_Order(), qr.getR8_MP(), qr.getRb_PayStatus(), qr.getRc_RefundCount(), qr.getRd_RefundAmt() }, keyValue); if (!newHmac.equals(qr.getHmac())) { throw new RuntimeException("Hmac error."); } return (qr); }
/** * 订单退款请求参数 方法是根据《易宝支付产品通用接口(HTML版)文档 v3.0》退款如何操作进行的封装 具体参数含义请仔细阅读《易宝支付产品通用接口(HTML版)文档 v3.0》 * 易宝支付交易流水号 * * @param pb_TrxId 退款金额 * @param p3_Amt 交易币种 * @param p4_Cur 退款说明 * @param p5_Desc * @return refundResult */ public static RefundResult refundByTrxId( String pb_TrxId, String p3_Amt, String p4_Cur, String p5_Desc) { RefundResult rr = null; String hmac = DigestUtil.getHmac( new String[] {refund_Cmd, p1_MerId, pb_TrxId, p3_Amt, p4_Cur, p5_Desc}, keyValue); Map reParams = new HashMap(); reParams.put("p0_Cmd", refund_Cmd); reParams.put("p1_MerId", p1_MerId); reParams.put("pb_TrxId", pb_TrxId); reParams.put("p3_Amt", p3_Amt); reParams.put("p4_Cur", p4_Cur); reParams.put("p5_Desc", p5_Desc); reParams.put("hmac", hmac); List responseStr = null; try { log.debug("Begin http communications.data[" + reParams + "]"); responseStr = HttpUtils.URLGet(queryRefundReqURL, reParams); log.debug("End http communications.responseStr.data[" + responseStr + "]"); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } if (responseStr.size() == 0) { throw new RuntimeException("No response."); } rr = new RefundResult(); for (int t = 0; t < responseStr.size(); t++) { String currentResult = (String) responseStr.get(t); if (currentResult == null || currentResult.equals("")) { continue; } try { URLDecoder.decode(currentResult, decodeCharset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage()); } int i = currentResult.indexOf("="); int j = currentResult.length(); if (i >= 0) { String sKey = currentResult.substring(0, i); String sValue = currentResult.substring(i + 1); if (sKey.equals("r0_Cmd")) { rr.setR0_Cmd(sValue); } else if (sKey.equals("r1_Code")) { rr.setR1_Code(sValue); } else if (sKey.equals("r2_TrxId")) { rr.setR2_TrxId(sValue); } else if (sKey.equals("r3_Amt")) { rr.setR3_Amt(sValue); } else if (sKey.equals("r4_Cur")) { rr.setR4_Cur(sValue); } else if (sKey.equals("hmac")) { rr.setHmac(sValue); } } } if (!rr.getR1_Code().equals("1")) { throw new RuntimeException("Query fail.Error code:" + rr.getR1_Code()); } String newHmac = ""; newHmac = DigestUtil.getHmac( new String[] { rr.getR0_Cmd(), rr.getR1_Code(), rr.getR2_TrxId(), rr.getR3_Amt(), rr.getR4_Cur() }, keyValue); if (!newHmac.equals(rr.getHmac())) { throw new RuntimeException("Hmac error."); } return (rr); }