一、应用场景
当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。
注意:
1、交易时间超过一年的订单无法提交退款
2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号
3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次
错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次
4、每个支付订单的部分退款次数不能超过50次
二、获取证书
退款操作是需要安全证书的。在申请微信支付成功后,收到的相应邮件后,可以按照指引下载API证书,也可以按照以下路径下载:微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全 。根据操作下载安装保存即可。
三、java代码
WXPayConfig wxPayConfig = new WxConfig();
WXPay wxPay = null;
Map<String, String> data = new HashMap<>();
Map<String, String> refund = null;
try {
data.put("appid", WxConfig.APPID);
data.put("mch_id", WxConfig.mchId);
data.put("nonce_str", WXPayUtil.generateNonceStr());
data.put("out_refund_no", "xxxxxxx");
data.put("total_fee", totalFee);
data.put("refund_fee", refundFee);
if (!StringUtils.isEmpty(wxOrderNo)) {
data.put("transaction_id", wxOrderNo);
} else if (!StringUtils.isEmpty(orderNo)) {
data.put("out_trade_no", orderNo);
} else {
return ReturnMessage.fail(44, "请确认订单号");
}
wxPay = new WXPay(wxPayConfig);
refund = wxPay.refund(data);
System.out.println("申请退款结果:" + refund);
} catch (Exception e) {
e.printStackTrace();
}
if ("SUCCESS".equals(refund.get("return_code"))) {
return ReturnMessage.success(0, "退款成功", refund);
}
return ReturnMessage.fail(77, "退款失败");
备注:如果想接受退款通知消息,可以添加参数notify_url,该参数必须是外网可以访问的url。具体文档中都有。扫码支付开发者文档
使用安全证书
class WxConfig extends WXPayConfig{
@Override
InputStream getCertStream() {
// 安全证书的保存地址
File file = new File(securityPath + "apiclient_cert.p12");
InputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return inputStream;
}
}
网友评论