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();
    }
}
12-28 16:59
查看更多