JAVA 微信小程序v3最新版本0.2.17(保姆级)-退款结果回调(修复版已测试)
·
前言:
经测试上一个退款结果回调有误,这个是测试通过的
controller:
//退款结果回调
@PostMapping("/refundCallback")
public String refundCallback(HttpServletRequest request) {
return apiService.refundCallback(request);
}
退款结果映射实体类:
@Data
public class RefundResourceVO implements Serializable {
//微信支付退款单号
private String refund_id;
//退款状态
private String refund_status;
//退款成功时间
private String success_time;
//退款入账账户
private String user_received_account;
}
service:
@Resource
private NotificationParser notificationParser;
@Resource
private RefundService refundService;
@Resource
private WxRefundInfoMapper wxRefundInfoMapper;
//退款结果回调
public String refundCallback(HttpServletRequest request) {
try {
//验证签名并返回结果
RefundResourceVO vo = verifyWechatCallback2(request);
if (StringUtils.isNull(vo)) {
log.warn("退款回调验签失败");
return this.buildFailXml("验签失败");
}
log.info("退款成功结果: {}", vo);
//检查事件类型
if (!"SUCCESS".equals(vo.getRefund_status())) {
log.warn("非退款成功事件,忽略: {}", vo.getRefund_status());
return buildSuccessXml(); // 仍然返回 success,避免重试
}
//根据 refundId 查询订单
WxRefundInfo refundInfo = wxRefundInfoMapper.selectWxRefunfInfoByRefundId(vo.getRefund_id());
if ("SUCCESS".equals(refundInfo.getStatus()) || "CLOSED".equals(refundInfo.getStatus())) {
return this.buildSuccessXml();
}
Date successTime = toDate(vo.getSuccess_time());
//更新本地订单信息
wxRefundInfoMapper.updateRefundInfoInfo(new WxRefundInfo() {{
this.setRefundId(refundInfo.getRefundId());
this.setStatus(vo.getRefund_status());
this.setSuccessTime(successTime);
this.setUserReceivedAccount(vo.getUser_received_account());
}});
return this.buildSuccessXml();
} catch (Exception e) {
log.error("微信退款回调处理异常", e);
}
return this.buildFailXml("系统异常");
}
验签逻辑:
//验签逻辑
private RefundResourceVO verifyWechatCallback2(HttpServletRequest request) {
try {
//提取请求头中的验签信息
String serial = request.getHeader("Wechatpay-Serial");
String nonce = request.getHeader("Wechatpay-Nonce");
String timestamp = request.getHeader("Wechatpay-Timestamp");
String signature = request.getHeader("Wechatpay-Signature");
String requestBody = getRequestBody(request);
//构建微信回调的请求参数对象
RequestParam requestParam = new RequestParam.Builder()
.serialNumber(serial)
.timestamp(timestamp)
.nonce(nonce)
.signature(signature)
.body(requestBody)
.build();
// 尝试解析,如果验签失败,parser.parse 会抛出异常
return notificationParser.parse(requestParam, RefundResourceVO.class);
} catch (Exception e) {
log.error("微信退款回调验签异常", e);
return null;
}
}
//获取请求体
private static String getRequestBody(HttpServletRequest request) {
StringBuilder requestBody = new StringBuilder();
try {
requestBody.append(IoUtil.readUtf8(request.getInputStream()));
} catch (IOException e) {
log.error("读取请求体发生了异常: ", e);
}
return requestBody.toString();
}
应答微信:
//应答成功
public String buildSuccessXml() {
return "<xml>\n" +
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>";
}
//应答失败
public String buildFailXml(String msg) {
return "<xml>\n" +
" <return_code><![CDATA[FAIL]]></return_code>\n" +
" <return_msg><![CDATA[" + msg + "]]></return_msg>\n" +
"</xml>";
}
退款成功结果:
RefundResourceVO {
refund_id=50300406588885082242894066132,
refund_status=SUCCESS,
success_time=2025-08-22T11:20:05+08:00,
user_received_account=支付用户零钱
}
更多推荐



所有评论(0)