如何修复 Stripe 付款错误?未找到与有效负载的预期签名匹配的签名

Hea*_*row 0 stripe-payments firebase typescript

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

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

错误:未找到与负载的预期签名匹配的签名。您是否正在传递从 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);

Run Code Online (Sandbox Code Playgroud)

小智 17

就我而言,发生这种情况是因为我使用了错误的“签名秘密”。我使用的是出现在右上角的 webhook id。但我们必须使用“签名秘密

因此,要获取它,请按照以下步骤操作:

  1. 登录 Stripe 仪表板。
  2. 转到开发人员->Webhooks。
  3. 单击您的网络钩子。
  4. 搜索“签名秘密”。
  5. 单击“显示”。
  6. 然后在您的代码中使用它。

它解决了我的问题。请尝试一下。随着条纹的用户界面发生变化,我们大多数人都迷失了方向。


Fáb*_*uza 5

2021 - 解决方案

我遇到了这个错误,经过大量研究后,我无法轻松找出问题所在,但最终我可以根据我的架构来解决这个问题:

//App.js

this.server.use((req, res, next) => {
  if (req.originalUrl.startsWith('/webhook')) {
    next();
  } else {
    express.json()(req, res, next);
  }
});
Run Code Online (Sandbox Code Playgroud)
//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(...)
  }
)
Run Code Online (Sandbox Code Playgroud)

需要注意的两大警告:

  • 确保发送 req.headers['stripe-signature']
  • 确保你endpointSecret是对的,如果不是它仍然会说同样的错误

提示:

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

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

网络钩子密钥示例