微信支付-申请退款

点击进入-申请退款官方文档

方式一:调用微信支付的SDK里的refund

第一步:依赖

        <!--微信支付-->
        <dependency>
            <groupId>com.github.wxpay</groupId>
            <artifactId>wxpay-sdk</artifactId>
            <version>0.0.3</version>
        </dependency>

 第二步:实现SDK里的WXPayConfig

@Component
public class WxConfig implements WXPayConfig {

    private byte[] certData;
    private static final String APP_ID = "";
    private static final String MCH_ID = "";
    private static final String KEY = "";

    /** JSAPI 公众号支付  NATIVE 扫码支付  APP APP支付 */
    public static final String TRADE_TYPE_JSPAI = "JSAPI";
    public static final String TRADE_TYPE_MATIVE = "NATIVE";
    public static final String TRADE_TYPE_APP = "APP";

    /** 回调地址 */
    public static String WX_NOTIFY_URL = "http://{ip}:{port}/pay/wxNotifyUrl";

    public WxConfig() {
        //String certPath = "classpath:cer/apiclient_cert.p12";
        String certPath = "C:/cert/apiclient_cert.p12";
        try {
            File file = ResourceUtils.getFile(certPath);
            InputStream certStream = new FileInputStream(file);
            this.certData = new byte[(int) file.length()];
            certStream.read(this.certData);
            certStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    public String getAppID() {
        return APP_ID;
    }

    public String getMchID() {
        return MCH_ID;
    }

    public String getKey() {
        return KEY;
    }

    public InputStream getCertStream() {
        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }

    public int getHttpConnectTimeoutMs() {
        return 8000;
    }

    public int getHttpReadTimeoutMs() {
        return 10000;
    }
}

第三步:在WxConfig配置类里,添加退款方法,(    wxPay.refund(reqData)    )

/** 微信SDK源码-解释   new WXPay(wxConfig)  */
public class WXPay {

    private WXPayConfig config;
    private SignType signType;
    private boolean useSandbox;

    public WXPay(final WXPayConfig config) {
        this(config, SignType.MD5, false);
    }

    //...
}

具体参数,参考微信申请退款官方文档

@Component
public class WxConfig implements WXPayConfig {


    /**
     * 微信公众号  退款
     * author yuhao
     * date 2018-10-17 17:00
     */
    public Map<String, String> refund(WXPayConfig wxPayConfig, Order order) {

        WXPay wxPay = new WXPay(wxPayConfig);//创建实例对象时,将WxConfig里的支付相关参数,配置到WXPay对象里
        Map<String, String> reqData = new HashMap<>();//构建调用refund方法所需要的参数

        /** appid 公众号ID*/
        /** mch_id 商户号ID*/
        /** nonce_str 随机字符串*/
        /** sign 签名*/
        /** sign_type 签名类型*/
        //以上自动填充

        /**transaction_id 微信订单号  或  out_trade_no商户订单号*/
        reqData.put("out_trade_no", order.getId());
        /** 商户退款单号*/
        reqData.put("out_refund_no", order.getRefundId());
        /** 订单金额*/
        reqData.put("total_fee", WxUtils.getMoney(order.getSMoney()));
        /** 退款金额 */
        reqData.put("refund_fee", WxUtils.getMoney(order.getRMoney()));

        if (order.getReason() != null) {
            /** 退款原因*/
            reqData.put("refund_desc", order.getReason());
        }

        Map<String, String> refund = new HashMap<>();
        try {
            refund = wxPay.refund(reqData);//调用WXPay的refund方法,返回退款是否成功

            for (String key : refund.keySet()) {
                System.out.println("key===" + key + "         " + refund.get(key));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return refund;
    }

}

方式二:通过接口链接,调用requestWithCert

接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

package com.github.wxpay.sdk;

import com.github.wxpay.sdk.WXPayConstants.SignType;

public class WXPay {
    /**
     * 需要证书的请求
     * @param strUrl String
     * @param reqData 向wxpay post的请求数据  Map
     * @param connectTimeoutMs 超时时间,单位是毫秒
     * @param readTimeoutMs 超时时间,单位是毫秒
     * @return API返回数据
     * @throws Exception
     */
    public String requestWithCert(String strUrl, Map<String, String> reqData,
                                  int connectTimeoutMs, int readTimeoutMs) throws Exception {
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40625058/article/details/86486912