1.首先集成微信的sdk
<dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency>
controller
/** * 微信退款测试 * @param jsonObject * @param request * @return */ @RequestMapping("wxRefund") @ResponseBody public DataAccessResponse wxRefundTestUnEncryption(@RequestBody JSONObject jsonObject, HttpServletRequest request){ DataAccessResponse model = DataAccessResponse.success(); String wxOrder = jsonObject.getString("wxOrder"); String ginOrder = jsonObject.getString("ginOrder"); String orderAmount = jsonObject.getString("orderAmount");//订单金额 orderAmount = String.valueOf(new BigDecimal(orderAmount).multiply(new BigDecimal(100)).intValue()); String refundFee = jsonObject.getString("refundFee");//退款金额 refundFee = String.valueOf(new BigDecimal(refundFee).multiply(new BigDecimal(100)).intValue()); String refundDesc = jsonObject.getString("refundDesc");//退款原因 String refundOrderNo = "TK"+ginOrder; String domainName=this.getRequestURL(request); String callbackUrl = "https:/*****/pay/callback/WxPayCallback";回调 Map<String,String> map = wxPay.wxRefund(wxOrder, ginOrder, refundOrderNo, orderAmount, refundFee, refundDesc); log.info("活动订单退款结果:"+map);当前位置可直接获取到退款结果 model.setData(map); return model; }
/** * 微信退款 * @param transaction_id 微信订单号,付款时由微信生成的,退款时和商户订单号二选一即可,如果同时存在优先级:transaction_id> out_trade_no * @param out_trade_no "RZQY1573525335892000627"; 该处是商户订单号,付款是商户生成的 * @param refundOrderNo "RZQYTK1573525335892000627";//该处是退款时商户动态生成的退款订单号,唯一的 * @param total_fee 订单金额 * @param refund_fee 退款金额 * @param refund_desc 退款原因 * @return */ public Map wxRefund(String transaction_id,String out_trade_no,String refundOrderNo,String total_fee,String refund_fee,String refund_desc){ try { WXConfigUtil config = WXConfigUtil.initWXconfigUtil(); WXPay wxpay = new WXPay(config); Map<String, String> refunMap = new TreeMap<>(); refunMap.put("appid",config.getAppID());//公众账号ID refunMap.put("mch_id",config.getMchID());//商户号 refunMap.put("notify_url", notifyUrl);//异步通知地址(请注意必须是外网) refunMap.put("nonce_str", UUIDLongGenerator.getUUID());//随机字符串 refunMap.put("transaction_id",transaction_id);//微信订单号 refunMap.put("out_trade_no",out_trade_no);//商户订单号 refunMap.put("out_refund_no",refundOrderNo);//商户退款单号 refunMap.put("total_fee",total_fee);//订单金额 refunMap.put("refund_fee",refund_fee);//退款金额 refunMap.put("refund_desc",refund_desc);//退款原因 refunMap.put("sign",WxMD5Util.getSign(refunMap));// 签名,需要将前面的参数加密生成 Map<String, String> refund = wxpay.refund(refunMap); return refund; } catch (Exception e) { e.printStackTrace(); return null; } }
生成签名的class
public class WxMD5Util { public static String getSign(Map<String, String> data) throws Exception { WXConfigUtil config = WXConfigUtil.initWXconfigUtil(); Set<String> keySet = data.keySet(); String[] keyArray = keySet.toArray(new String[keySet.size()]); Arrays.sort(keyArray); StringBuilder sb = new StringBuilder(); for (String k : keyArray) { if (k.equals(WXPayConstants.FIELD_SIGN)) { continue; } if (data.get(k)!=null && data.get(k).trim().length() > 0) // 参数值为空,则不参与签名 sb.append(k).append("=").append(data.get(k).trim()).append("&"); } sb.append("key=").append(config.getKey()); MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } byte[] array = new byte[0]; try { array = md.digest(sb.toString().getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } StringBuilder sb2 = new StringBuilder(); for (byte item : array) { sb2.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); } return sb2.toString().toUpperCase(); } }