0

0

Stripe Webhook 签名验证失败:问题诊断与解决方案

DDD

DDD

发布时间:2025-07-21 19:06:11

|

730人浏览过

|

来源于php中文网

原创

stripe webhook 签名验证失败:问题诊断与解决方案

Stripe Webhook 签名验证失败通常意味着请求体处理不正确或签名验证参数存在问题。 正确配置 Express 中间件以接收原始请求体至关重要,同时需要确保签名验证参数正确无误。以下是详细的步骤和注意事项,帮助您解决该问题。

1. 正确配置 Express 中间件

当处理 Stripe Webhook 时,需要确保 Express 能够接收到原始的请求体(raw request body)。这是因为 Stripe 使用请求体的内容生成签名,而默认情况下,Express 会尝试解析请求体,这可能会导致签名验证失败。

正确的配置方式是使用 express.raw() 中间件,并指定 type 为 'application/json'。这告诉 Express 接收 JSON 格式的原始请求体,而不会进行任何解析。

错误的配置:

app.post("/webhook", express.raw({ type: "*/*" }), async (request, response) => {
  // ...
});

正确的配置:

app.post("/webhook", express.raw({ type: 'application/json' }), async (request, response) => {
  // ...
});

2. 正确使用 stripe.webhooks.constructEvent 方法

stripe.webhooks.constructEvent 方法用于验证 Stripe Webhook 的签名。该方法接收三个参数:

  • payload: 原始的请求体。
  • sig: 从请求头中获取的 stripe-signature。
  • secret: 您的 Webhook 密钥。

一个常见的错误是在将 payload 传递给 stripe.webhooks.constructEvent 之前对其进行字符串化处理。stripe.webhooks.constructEvent 方法期望接收的是原始的 Buffer 或字符串,而不是 JSON 字符串。

易标AI
易标AI

告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项

下载

错误的使用方式:

try {
  event = stripe.webhooks.constructEvent(
    JSON.stringify(payload),
    sig,
    process.env.WEBHOOK_SECRET
  );
} catch (err) {
  return response.status(400).send(`Webhook Error: ${err.message}`);
}

正确的使用方式:

try {
  event = stripe.webhooks.constructEvent(
    payload,
    sig,
    process.env.WEBHOOK_SECRET
  );
} catch (err) {
  return response.status(400).send(`Webhook Error: ${err.message}`);
}

3. 完整代码示例

以下是一个完整的代码示例,展示了如何正确处理 Stripe Webhook 的签名验证:

const express = require('express');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const app = express();

app.post("/webhook", express.raw({ type: 'application/json' }), async (request, response) => {
  const payload = request.body;
  const sig = request.headers["stripe-signature"];

  let event;

  try {
    event = stripe.webhooks.constructEvent(
      payload,
      sig,
      process.env.WEBHOOK_SECRET
    );
  } catch (err) {
    return response.status(400).send(`Webhook Error: ${err.message}`);
  }

  if (event.type === "checkout.session.completed") {
    // Retrieve the session. If you require line items in the response, you may include them by expanding line_items.
    const sessionWithLineItems = await stripe.checkout.sessions.retrieve(
      event.data.object.id,
      {
        expand: ["line_items"],
      }
    );
    const lineItems = sessionWithLineItems.line_items;

    // Fulfill the purchase...
    console.log("Fulfilling purchase");
  }

  response.status(200).end();
});

app.listen(4242, () => console.log('Running on port 4242'));

4. 注意事项

  • 确保您的 Webhook 密钥正确配置在环境变量中。
  • 在生产环境中,务必验证 Webhook 的来源,以防止恶意攻击。
  • 仔细阅读 Stripe 官方文档,了解有关 Webhook 安全性的最佳实践。

5. 总结

解决 Stripe Webhook 签名验证失败的关键在于正确处理请求体和使用正确的签名验证方法。通过配置 express.raw() 中间件以接收原始请求体,并直接将 payload 传递给 stripe.webhooks.constructEvent 方法,可以有效地解决此问题。 遵循这些步骤,您可以确保您的 Webhook 安全可靠地处理 Stripe 事件。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号