我正在开发一个端点来接收来自 stripe 的 webhook 事件。使用stripe库来验证签名。
Webhook.constructEvent(body, sigHeader, "whsec_....");
它总是给我错误“找不到签名”,我已经调试并发现预期签名与计算签名不同。我已确保我的签名密钥是正确的,我认为问题出在我在 Spring Boot 控制器中获取的请求正文。
我正在尝试提取请求正文,如下所示。在弹簧控制器中获取原始主体的正确方法是什么:
@PostMapping("/event")
public ResponseEntity<String> processStripeEvents(@RequestBody String payload, HttpServletRequest request)
我也尝试使用 apache IOUtils 从请求中读取正文,但这也给出了相同的错误。我正在使用 Webhook.site 来测试事件接收,这可能是问题所在吗?
最后下面的代码对我有用。 @RequestBody 或 Apache IOUtils 不会给出原始的原始主体,它会由于签名不匹配而进行一些转换。
@PostMapping("/event")
public ResponseEntity<String> processStripeEvents(HttpServletRequest request) throws IOException {
logger.info("Received event from stripe ");
Event event = null;
String body = request.getReader().lines().collect(Collectors.joining("\n"));
try {
String sigHeader = request.getHeader("Stripe-Signature");
event = Webhook.constructEvent(body, sigHeader, "whsec_...");
} catch (Exception e) {
logger.error("Error while verifying stripe event signature", e);
return ResponseEntity.badRequest().body(e.getMessage());
}
}