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(); } }