前言:
经测试上一个退款结果回调有误,这个是测试通过的

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=支付用户零钱
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐