【微信支付V2】申请退款

1、微信文档

当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家账号上。

https://pay.weixin.qq.com/doc/v2/merchant/4011941262

2、退款需注意

  • 1、交易时间超过一年的订单无法提交退款
  • 2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号
  • 3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次
  • 4、每个支付订单的部分退款次数不能超过50次
  • 5、如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败
  • 6、申请退款接口的返回仅代表业务的受理情况,具体退款是否成功,需要通过退款查询接口获取结果。
  • 7、一个月之前的订单申请退款频率限制为:5000/min
  • 8、同一笔订单多次退款的请求需相隔1分钟

3、申请退款

import com.alibaba.fastjson.JSON;
import com.biz.common.util.MathUtil;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 微信支付工具类
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class PayUtils {

    private final WxPayService wxPayService;
    /**
     * 退款回调通知地址
     */
    @Value("${wx.pay.refund-notify-url}")
    private String refundNotifyUrl;

    /**
     * 申请退款
     *
     * @param orderNo      订单号
     * @param paidAmount   已付金额
     * @param refundNo     退款单号
     * @param refundAmount 退款金额
     */
    public WxPayRefundResult refundOrder(String orderNo, BigDecimal paidAmount, String refundNo, BigDecimal refundAmount) {
        WxPayRefundResult result = null;
        try {
            WxPayRefundRequest request = new WxPayRefundRequest();
            request.setOutTradeNo(orderNo);
            request.setOutRefundNo(refundNo);
            request.setTotalFee(toFen(paidAmount));
            request.setRefundFee(toFen(refundAmount));
            request.setNotifyUrl(refundNotifyUrl);
            result = wxPayService.refund(request);
            log.info("请求WX申请退款结果:{},{}", refundNo, JSON.toJSONString(result));
        } catch (WxPayException e) {
            log.error(String.format("订单申请退款异常: %s", orderNo), e);
        }
        return result;
    }

    /**
     * 元转分
     */
    private static int toFen(BigDecimal amountY) {
        BigDecimal amountF = MathUtil.of().mul(amountY, new BigDecimal("100")).get();
        return amountF.intValue();
    }
}

需要的参数有原商户订单号、支付金额、商户退款单号、退款金额。退款金额不能超过支付金额,多次申请退款,请确保【商户退款单号】唯一。

接口响应如下:

{
    "transaction_id": "1008450740201411110005820873",
    "nonce_str": "NfsMFbUFpdbEhPXP",
    "out_trade_no": "1415757673",
    "out_refund_no": "1415701182",
    "appid": "wx2421b1c4370ec43b",
    "refund_fee": "1",
    "sign": "B7274EB9F8925EB93100DD2085FA56C0",
    "return_msg": "OK",
    "result_code": "SUCCESS",
    "mch_id": "10000100",
    "return_code": "SUCCESS",
    "refund_id": "2008450740201411110000174436"
}

return_code、result_code都为SUCCESS,表示退款申请成功,款项具体是否成功退回,需要调用 查询退款 或 等待微信的 退款结果通知

如您在阅读中发现不足,欢迎留言!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Asurplus

学如逆水行舟,不进则退

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

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

打赏作者

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

抵扣说明:

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

余额充值