从 Stripe 获取 Webhook 异常

2024-04-08

我正在尝试从 Stripe 设置一个 webhook 来处理payment_intent.succeeded事件,但我得到一个例外。这是我来自 Node 后端的代码(我已经提取了我希望的所有相关部分。如果需要其他任何内容,请告诉我):

const stripeWebHookSecret = 'whsec_WA0Rh4vAD3z0rMWy4kv2p6XXXXXXXXXX';

import express from 'express';
const app = express();
app.use(bodyParser.urlencoded({ extended:true }));
app.use(bodyParser.json());
app.use(session({ <some params here> }));

const openRouter = express.Router();

registerOpenPaymentRoutes(openRouter);

app.use('/open', openRouter);

并实施registerOpenPaymentRoutes看起来像这样:

export const registerOpenPaymentRoutes = (router) => {
    router.post('/payment/intent/webhook', bodyParser.raw({type: 'application/json'}), (req, res) => {
        let signature = req.headers['stripe-signature'];
        try {
            let event = stripe.webhooks.constructEvent(req.body, signature, stripeWebHookSecret);
            switch(event.type){
                case 'payment_intent.succeeded':
                    let intent = event.data.object;
                    res.json({ message: 'Everything went smooth!', intent });
                default:
                    res.status(400).json({ error: 'Event type not supported' });
            }
        }
        catch (error){
            res.status(400).json({ message: `Wrong signature`, signature, body: req.body, error });
        }
    });
}

到目前为止一切顺利。当我从 Stripe 仪表板触发测试 Webhook 事件时,我到达了端点,但从 catch 块中获取了结果。错误信息如下:

No signatures found matching the expected signature for payload. Are you passing the raw request body you received from Stripe? https://github.com/stripe/stripe-node#webhook-signing"

我将返回带有错误消息的签名,正如您在上面看到的那样,签名如下所示:

"t=1557911017,v1=bebf499bcb35198b8bfaf22a68b8879574298f9f424e57ef292752e3ce21914d,v0=23402bb405bfd6bd2a13c310cfecda7ae1905609923d801fa4e8b872a4f82894"

据我从文档中了解到,获取提到的原始请求正文需要的是bodyParser.raw({type: 'application/json'})我已经在那里的路由器的参数。

谁能看到缺失的部分吗?


这是因为您已经将 Express 应用程序设置为使用bodyParser.json()中间件,与bodyParser.raw()您在 webhook 路由中设置的中间件。

如果您删除app.use(bodyParser.json());你的 webhooks 将按预期工作,但其余的路由将不会有解析的正文,这并不理想。

我建议添加一个自定义中间件来选择bodyParser基于路线的版本。就像是:

// only use the raw bodyParser for webhooks
app.use((req, res, next) => {
  if (req.originalUrl === '/payment/intent/webhook') {
    next();
  } else {
    bodyParser.json()(req, res, next);
  }
});

然后显式地使用bodyParser.raw()webhook 路由上的中间件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Stripe 获取 Webhook 异常 的相关文章

随机推荐

  • 如何在Delphi中一次正确地释放包含各种类型的记录?

    type TSomeRecord Record field1 integer field2 string field3 boolean End var SomeRecord TSomeRecord SomeRecAr array of TS
  • CompiledQuery 与 List.Contains (where...in list) 功能?

    我正在尝试使用 Linq to Entities 编写 CompiledQuery 它将替换采用两个数组 在本例中为逗号分隔的 TEXT 参数的存储过程 本质上 SQL 是这样的 Stored Proc definition ArrayPa
  • PHP 到期日期

    背景信息 我正在为游戏 garrys mod 创建一个捐赠 购买系统 当用户通过 paypal 捐赠时 我有 php 代码来处理 iPN 并将数据输入数据库 它还会生成一个序列密钥并将其通过电子邮件发送给用户 然后用户可以在游戏中输入该密钥
  • 玩!无法将 java 列表转换为 scala 列表

    我正在尝试将字符串列表从 java 控制器传递到 scala 模板 这是查看代码 public static Result index List
  • 如何从 JavaScript 通过 TCP 套接字进行通信?

    我正在考虑 AJAX 应用程序必须轮询更新是多么的限制 而 javascript 最好能够建立到服务器的真正的双向连接 我想知道是否有某种方法将 javascript 与浏览器插件集成 可以建立 TCP 连接 以便我可以将数据传入和传出浏览
  • 如果用户在 WPF 中键入任何内容,请检查密码框

    我在用PasswordBox我想检测用户何时输入任何内容 如果是 我需要将按钮状态更改为启用 如何检查用户是否输入任何内容 在里面PasswordBox 它的行为不同于TextBox因为你不能将它绑定到文本 当用户输入任何内容时会引发一些事
  • 是否可以通过 FTP 代理使用 C# FtpWebRequest?

    据我了解 FtpWebRequest Proxy属性表示 HTTP 代理 我必须通过 FTP 代理向外部服务器发出 FTP 请求 到目前为止 我实现此功能的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载 是否可以
  • 如何在 Angular 应用程序中存储身份验证令牌

    我有一个与 REST API 服务器通信的 Angular 应用程序 SPA 我有兴趣找到存储从 API 服务器返回的访问令牌的最佳方法 以便 Angular 客户端可以使用它来验证未来的请求到 API 出于安全原因 我想将其存储为浏览器会
  • 静态转换与动态转换

    假设我有一个充满继承性的 C 库 我得到了一个Base 当我知道它实际上指向一个函数时Derived对象和Derived继承Base 但我不知道它是什么类型的继承 公共 受保护 私有 我也不知道层次结构中是否有虚函数 鉴于这种情况 无需查看
  • 如何找到 Postgres / PostgreSQL 表及其索引的磁盘大小

    我从 Oracle 转到 Postgres 并寻找一种方法来查找表和索引大小 bytes MB GB etc 或者甚至更好的所有表的大小 在 Oracle 中 我有一个令人讨厌的长查询 它查看 user lobs 和 user segmen
  • 多重继承:包含 super() 调用的重写方法

    使用文件 super5 py class A def m self print m of A called class B A def m self print m of B called super m class C A def m s
  • 如何在数据库中存储很旧的日期?

    这实际上不是我遇到的问题 但想象一下有人正在建立一个有关中世纪的网站并想要存储日期 他们会如何做 MySQL 规范DATE说它不会低于 1000 年 当格式为YYYY MM DD 您如何存储有关的信息苏格兰国王肯尼思二世去世 http en
  • Bootstrap 4 无线电验证

    我需要在使用 Bootstrap 4 的页面中使用 Radio 元素进行表单验证方面的一些帮助 我需要在单选元素下方添加错误消息 div class invalid feedback Please choose an option div
  • 如何使用Control.FromHandle?

    我看到一个名为 Control FromHandle 的方法 它 应该 允许您访问它 现在 我想使用这段代码尝试一下 DllImport user32 dll SetLastError true static extern IntPtr F
  • write 函数在 Unix 上需要 unistd.h,那么 Windows 上呢?

    我已经从 Linux 计算机更改为 Windows 但在编译代码时遇到了问题 因为这两个操作系统不共享相同的头文件 由于unistd h没有明显包含在内 Visual C不知道什么read write close socklen t and
  • 当其中一个参数中有空格时,nodeJS child_process.spawn 不起作用

    我正在尝试使用child process spawn功能 语法是 child process spawn command args options 每当我在 args 数组的任何元素中包含空格时 该命令都会简单地发出参数 这是我用来测试它的
  • 适用于多个应用程序的 OWIN 身份验证服务器

    我正在实现一个解决方案 该解决方案具有 MVC 客户端 让我们在 localhost 4077 调用此 CLIENT 和 WebAPI 服务 在 localhost 4078 调用 API 我已经在 API 中实现了 OWIN OAuth
  • Roslyn:如何使用 Roslyn C# 获取声明语法的命名空间

    我有一个包含一些类文件的 C 解决方案 借助 Roslyn 我能够解析解决方案以获取解决方案中的项目列表 从那里 我可以获得每个项目中的文档 然后 我可以获得每个 ClassDeclarationSyntax 的列表 这是起点 foreac
  • Android EditText (TextView) 如何绘制闪烁的光标?

    我正在制作自己的蒙古竖字TextView and EditText 通过扩展从头开始View 我试图了解闪烁光标是如何在Android TextView源代码 https github com android platform framew
  • 从 Stripe 获取 Webhook 异常

    我正在尝试从 Stripe 设置一个 webhook 来处理payment intent succeeded事件 但我得到一个例外 这是我来自 Node 后端的代码 我已经提取了我希望的所有相关部分 如果需要其他任何内容 请告诉我 cons