微信小程序开发-微信支付退款功能以及退款回调方法【WxPayRefundV3版本 附有完整代码】

之前有写过详细的微信支付功能:微信支付

我们使用weixin-java-pay的jar包等,配置上的流程同微信支付,可以看上面的文章。
退款使用的WxPayService类的refundV3方法。使用该方法需要在微信支付配置的基础上加上:apiclient_key.pem 证书文件、 apiclient_cert.pem证书文件、apiV3 秘钥值的配置
在这里插入图片描述

一、退款功能

1、下载API证书,并放到程序的指定位置
在这里插入图片描述
按照指引下载后解压内容如下,放到程序的resource下面
在这里插入图片描述
放置的程序路径如下:
在这里插入图片描述

2、在yml配置文件中定义

wechat:
  appid: 
  secret: 
  # 商户
  mchId: 
  # 秘钥
  mchKey: 
  apiV3Key: 
  # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
  keyPath: classpath:apiclient_cert.p12
  privateKeyPath: classpath:apiclient_key.pem
  privateCertPath: classpath:apiclient_cert.pem
  #JSAPI--公众号支付    NATIVE--原生扫码支付   APP--app支付
  tradeType: JSAPI
  notifyUrl: 	#支付回调方法地址
  refundNotifyUrl:   #退款回调方法地址

3、在原有的WxProperties和WxConfig中对WxPayService配置的内容中进行新增内容。
WxProperties:
在这里插入图片描述

WxConfig:【这里的setNotifyUrl的地址是支付回调的地址】
在这里插入图片描述
4、调用退款方法定义以及调用

 /**
     * 微信支付退款
     * @param orderNo
     * @param amount
     * @return
     */
    public Result<WxPayRefundV3Result> rebackPay(String orderNo,Integer amount){
        Result<WxPayRefundV3Result> res = new Result<WxPayRefundV3Result>();
        //微信支付-申请退款请求参数
        WxPayRefundV3Request request = new WxPayRefundV3Request();
        WxPayRefundV3Request.Amount am = new WxPayRefundV3Request.Amount();
        am.setTotal(amount);//原订单金额
        //退款币种
        am.setCurrency("CNY");
        //退款金额 单位为分
        am.setRefund(amount);
        //金额信息
        request.setAmount(am);
        //transaction_id:微信支付订单号
        request.setTransactionId(orderNo);
        //商户订单号
        request.setOutRefundNo("return_"+orderNo);
        request.setNotifyUrl(this.wxPayService.getConfig().getPayScoreNotifyUrl()); //设置回调地址
        WxPayRefundV3Result result;
        try {
            //调用微信V3退款API
            result = wxPayService.refundV3(request);
            String status = result.getStatus();
            switch (status) {
                case "SUCCESS":
                    res.success("退款成功");
                    break;
                case "CLOSED":
                    res.success("退款关闭");
                    break;
                case "PROCESSING":
                    res.success("退款处理中");
                    break;
                case "ABNORMAL":
                    res.success("退款异常");
                    break;
                default:
                    res.error("受理失败");
                    break;
            }
            res.setResult(result);
        } catch (Exception e) {
            e.printStackTrace();
            res.error("申请退款失败,"+e.getMessage());
        }
        return res;
    }

Controller层调用:
在这里插入图片描述
#二、回调方法
在调用退款方法中使用此句设置了退款回调方法的地址;

 request.setNotifyUrl(this.wxPayService.getConfig().getPayScoreNotifyUrl());//回调地址

不论是支付回调还是退款回调,都需要把访问地址映射到公网中才可以测试和使用。

回调方法如下:
Controller:

 /**
     * 微信退款结果回调
     * @param
     * @throws Exception
     */
    @PostMapping("/refundNotify")
    void refundNotify(@RequestBody String xmlData) throws Exception{
        wxPayOrderApi.refundNotify(xmlData);
    }

实现层代码:

 /**
     * 微信退款结果回调
     * @param xmlData
     * @throws Exception
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void refundNotify(@RequestBody String xmlData) throws Exception {
        //SignatureHeader signatureHeader = this.getSignatureHeader(timestamp, nonce, serial, signature);
       final WxPayRefundNotifyV3Result notifyResult = this.wxPayService.parseRefundNotifyV3Result(xmlData,null);
        if (null != notifyResult && notifyResult.getResult().getRefundStatus().equals("SUCCESS")) {
           System.out.println("微信退款结果回调结果==============>:" + notifyResult.getResult());//TODO 删除
              //逻辑代码,修改微信支付订单状态以及其他操作
            }
        }
    }

使用wxPayService.parseRefundNotifyV3Result方法,自行查看源码
在这里插入图片描述

记:一开始退款使用的是refund方法,如下:
在这里插入图片描述
在这里插入图片描述
因为支付使用的也是这个版本,就用了一样的,可奈何在创建访问地址时报错,根据错误信息检查了程序,无果,于是就直接使用的v3的版本。