【问题标题】:How to fix Stripe payments error? No signatures found matching the expected signature for payload如何修复条纹支付错误?未找到与有效负载的预期签名匹配的签名
【发布时间】:2020-04-25 09:53:41
【问题描述】:

为什么我会发现这个错误?

我在这里看到过类似的问题,但它们似乎无法解决我的问题。

错误:未找到与有效负载的预期签名匹配的签名。您是否传递了从 Stripe 收到的原始请求正文? https://github.com/stripe/stripe-node#webhook-signing

这是我删除了键的 index.ts。

import * as functions from 'firebase-functions';

import * as Stripe from 'stripe';
const stripe = new Stripe('sk_test_*****************************');
const endpointSecret = 'whsec_******************************';

import * as express from 'express';
import * as cors from 'cors';


const bodyParser = require('body-parser')

const app = express();
app.use(cors({origin: true}));


app.post('/webhook', bodyParser.raw({type: 'application/json'}), async(req, res) => {

  const sig = req.headers['stripe-signature'] as string;
  let event;

    try {
      event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
    } catch (err) {

      console.log("ERROR!!!1");
      console.log(err);
      return res.status(400).send(`Webhook Error: ${err.message}`);
    }

    console.log('Success:', event.id);

    // Handle the checkout.session.completed event
    if (event.type === 'checkout.session.completed') {

      const session = event.data.object;
      console.log("MADE IT!!!");
      console.log(session);
      return;

      // Fulfill the purchase...
      //handleCheckoutSession(session);
    }

    return;

});

export const payments = functions.https.onRequest(app);

【问题讨论】:

标签: typescript firebase stripe-payments


【解决方案1】:

2021 - 解决方案

我遇到了这个错误,经过大量研究后,我无法轻易找出问题所在,但最终我可以根据以下架构做到这一点:

//App.js

this.server.use((req, res, next) => {
  if (req.originalUrl.startsWith('/webhook')) {
    next();
  } else {
    express.json()(req, res, next);
  }
});
//routes.js

routes.post(
  '/webhook-payment-intent-update',
  bodyParser.raw({ type: 'application/json' }),

  //your stripe logic (Im using a controller, but wherever)
  (req, res) => {
    stripe.webhooks.constructEvent(...)
  }
)

需要注意的两大警告:

  • 确保发送req.headers['stripe-signature']
  • 确保您的endpointSecret 是正确的,否则它仍然会报同样的错误

提示:

  • 通过安装 Stripe CLI 在本地测试它:https://stripe.com/docs/webhooks/test

  • 在条带仪表板上验证您的密钥,或者您也可以通过如下验证您的条带日志来确定您是否拥有正确的密钥:

【讨论】:

  • bodyParser.anything 已弃用,请改用 express.raw({ type: "application/json" })
【解决方案2】:

就我而言,这是因为我使用了错误的“签名密钥”。我使用的是出现在右上角的 webhook id。但是我们必须使用“Signing secret

所以要获得它,请按照以下步骤操作:

  1. 登录到 Stripe 仪表板。
  2. 转到开发人员->Webhook。
  3. 点击您的 webhook。
  4. 搜索“签名密钥”。
  5. 点击“显示”。
  6. 然后在您的代码中使用它。

它解决了我的问题。请尝试一下。由于条纹的 UI 发生了变化,所以我们大多数人都迷失了。

【讨论】:

  • 谢谢!你救了我几个小时的痛苦和痛苦:)
【解决方案3】:

如果签名密钥不正确,也会引发此错误消息。如果您确保您传递的是原始身体,请仔细检查您的秘密并且它是正确的。

当我(几个月后)重新访问我正在从事的一个需要 Stripe 集成的副项目时,我收到了这个错误。错误是因为他们在 90 天后轮换了我的签名秘密。根据他们的客户服务,他们在轮换密钥时不会发送通知,因此不是很明显。

【讨论】:

    【解决方案4】:

    req.body 是解析后的 JSON 正文。您将需要req.rawBody.toString(),这应该会验证。

    【讨论】:

    • 谢谢。这给了我错误:无法读取未定义的属性“toString”。知道如何解决这个问题吗?
    • 我还必须将其更改为 req.body.rawBody.toString() 因为 req.rawBody.toString() 给了我这个错误:属性 'rawBody' 在类型 'Request'。
    • 试试 req.rawBody 不要添加 toString()
    • req.rawBody 给了我错误:“Request”类型上不存在属性“rawBody”。作为
    • 嗯,req.rawBody 可能会迷路,因为您正在路由 Express 应用程序。它将在onRequest() 中的原始传入req 上,因此您可能需要找到一种方法将其通过管道传输到您的快速应用程序。有关 rawBody 的更多信息,请参阅 the docs
    猜你喜欢
    • 2019-05-22
    • 2020-07-07
    • 2019-09-04
    • 2021-02-19
    • 2019-11-10
    • 2021-07-26
    • 2022-12-12
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多