wechatpay-java icon indicating copy to clipboard operation
wechatpay-java copied to clipboard

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

Open liguangling-lgl opened this issue 7 months ago • 2 comments

错误描述

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

liguangling-lgl avatar Jan 13 '24 15:01 liguangling-lgl