wechatpay-apiv3 / wechatpay-java

微信支付 APIv3 的官方 Java Library
Apache License 2.0
841 stars 192 forks source link

支付成功回调后,出现极个别支付单解签失败的情况 #251

Closed liguangling-lgl closed 1 day ago

liguangling-lgl commented 5 months ago

错误描述

WechatIMG5119

重现bug的步骤

@Override
public PayCallbackResult callbackWechatPay(HttpServletRequest httpServletRequest) {
    String body = getRequestBody(httpServletRequest);
    String serialNumber = httpServletRequest.getHeader("Wechatpay-Serial");
    String nonce = httpServletRequest.getHeader("Wechatpay-Nonce");
    String signature = httpServletRequest.getHeader("Wechatpay-Signature");
    String timestamp = httpServletRequest.getHeader("Wechatpay-Timestamp");
    RequestParam requestParam = new RequestParam.Builder()
            .serialNumber(serialNumber)
            .nonce(nonce)
            .signature(signature)
            .timestamp(timestamp)
            .body(body)
            .build();
    log.info("支付回调,通知参数:{}", JSON.toJSONString(requestParam));
    NotificationConfig config = (NotificationConfig) wechatPayConfigHolder.getConfig();
    NotificationParser parser = new NotificationParser(config);
    Transaction transaction = parser.parse(requestParam, Transaction.class);
    String paySn = "P" + IdGeneratorManager.globalGenerator();
    OrderCallbackReqDTO orderCallbackReqDTO = OrderCallbackReqDTO.builder()
            .status(TradeStatusEnum.queryActualTradeStatusCode(transaction.getTradeState().name()))
            .joinTime(DateUtil.date())
            .tradeNo(transaction.getTransactionId())
            .gmtPayment(DateUtil.parse(transaction.getSuccessTime()))
            .orderSn(transaction.getOutTradeNo())
            .paySn(paySn)
            .build();
    return orderService.callbackOrder(orderCallbackReqDTO);
}

private String getRequestBody(HttpServletRequest request) {
    ByteArrayOutputStream body = new ByteArrayOutputStream();
    try {
        ServletInputStream inputStream = request.getInputStream();
        byte[] buffer = new byte[1024];
        for (int length; (length = inputStream.read(buffer)) != -1; ) {
            body.write(buffer, 0, length);
        }
    } catch (IOException ex) {
        log.error("支付回调,读取数据流异常", ex);
    }
    log.info("支付回调,通知消息体:{}", body);
    return body.toString();
}

} 解签代码 ,使用的微信SDK

预期行为

有的订单支付成功回调没有问题,极少订单会出现解签失败的情况,不清楚为什么

导致错误的代码片段

Transaction transaction = parser.parse(requestParam, Transaction.class);

操作系统

linux

Java 版本

Java21

wechatpay-java 版本

0.2.7

其他信息

No response

ByteChen commented 5 months ago

看看是不是探测流量: https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-verification.html#%E5%BA%94%E5%AF%B9%E7%AD%BE%E5%90%8D%E6%8E%A2%E6%B5%8B%E6%B5%81%E9%87%8F

liguangling-lgl commented 5 months ago

是的 ,感谢 确实是这个原因

heixiaoma commented 5 days ago

原来如此,吓得我还以为是用户付款了,没有给用户东西