微信支付退款部分代碼


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM