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

本文详细描述了如何在Java项目中使用weixin-java-pay库实现微信支付的退款功能,包括下载和配置API证书、调用refundV3方法、设置回调地址,并介绍了退款回调的处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

我们使用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的版本。

### Java小程序实现微信退款功能 为了实现在Java环境中通过微信支付平台完成退款操作,需遵循特定流程并调用微信提供的API接口。以下是具体的操作指南以及示例代码。 #### 准备工作 在执行任何交易前,确保已经成功申请了微信支付商户账号,并完成了必要的配置设置[^3]。此外,在开发环境里准备好相应的证书文件用于签名验证。 #### 构建请求参数 构建发起退款所需的各项参数,包括但不限于原始订单号(`out_trade_no`)、退款金额(`amount.refund`)等字段。这些信息将被封装成JSON格式作为HTTP POST请求体的一部分发送给服务器端口`/v3/refunds`[^1]。 ```json { "transaction_id": "", "out_refund_no": "1217752501201407033233368018", "total_fee": 532, "refund_fee": 532, "spbill_create_ip": "192.168.1.1" } ``` #### 发送HTTPS请求 利用HttpClient库或者其他类似的工具来创建安全连接并向指定URL提交数据包。这里需要注意的是,所有通信都应采用TLS加密方式以保障信息安全传输[^2]。 ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; // 创建默认的httpClient实例 CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/refunds"); httpPost.setHeader("Content-Type", "application/json"); String jsonStr = "{...}"; // 上述构建好的Json字符串 StringEntity entity = new StringEntity(jsonStr,"UTF-8"); entity.setContentEncoding("UTF-8"); httpPost.setEntity(entity); try (CloseableHttpResponse response = httpClient.execute(httpPost)) { int statusCode = response.getStatusLine().getStatusCode(); System.out.println(statusCode); } finally { httpClient.close(); } ``` #### 处理响应结果 当收到返回的消息后,解析其中的内容判断是否成功接收到了预期的结果。通常情况下会得到一个包含状态码和描述性的消息体,据此来进行后续逻辑处理或错误排查。 ```json { "return_code":"SUCCESS", "result_code":"SUCCESS", ... } ``` #### 安全性和异常情况考虑 在整个过程中务必重视安全性措施的应用,比如对敏感信息做适当保护;同时也要考虑到可能出现的各种意外状况,如网络波动造成的超时等问题,提前设计好应对策略。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平芜尽处是春山-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值