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,表示退款申请成功,款项具体是否成功退回,需要调用 查询退款 或 等待微信的 退款结果通知
如您在阅读中发现不足,欢迎留言!!!