当前位置: 首页 > 知识库问答 >
问题:

条带webhook错误:未找到与负载的预期签名匹配的签名

彭令秋
2023-03-14

我使用由Stripe提供的代码来测试网络钩子。条纹机密和终结点机密已进行了三次检查。

条带版本:6.19正文解析器:1.19

当我在Stripe dashboard上测试webhook时,我得到的结果是:(TestWebhook错误:400)找不到与负载的预期签名匹配的签名。您是否正在传递从Stripe收到的原始请求正文?

任何帮助都将不胜感激。

var bodyParser - require('body-parser);


// Using Express
const app = require('express')();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());


// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
const stripe = require('stripe')('sk_test_VPw...');

// Find your endpoint's secret in your Dashboard's webhook settings
const endpointSecret = 'whsec_...';


// Use body-parser to retrieve the raw body as a buffer
const bodyParser = require('body-parser');

// Match the raw body to content type application/json
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (request, response) => {
  const sig = request.headers['stripe-signature'];

  let event;

  try {
    event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret); //NOT WORKING!
  } catch (err) {
    return response.status(400).send(`Webhook Error: ${err.message}`);
  }

  // Handle the checkout.session.completed event
  if (event.type === 'checkout.session.completed') {
    const session = event.data.object;

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

  // Return a response to acknowledge receipt of the event
  response.json({received: true});
});

共有3个答案

狄海
2023-03-14

如何在Express中同时获取解析正文和原始正文:

app.use(bodyParser.json({
  verify: (req, res, buf) => {
    req.rawBody = buf
  }
}))

感谢:https://flaviocopes.com/express-get-raw-body/

厉熠彤
2023-03-14

一行加上不推荐的bodyParser。确保在定义泛型解析器(也称为express)之前定义endpoint的解析器。json()。

app.use('/stripe/webhook', express.raw({type: "*/*"}))
app.use(express.json())
程鸿畅
2023-03-14

通常这是由于您在检查签名之前解析或修改了原始请求字符串(因此签名是根据修改后的字符串计算的,而不是根据发送的字符串计算的)。在本例中,JSON express中间件似乎正在这样做:app。使用(express.json())

Stripe提供了一个在webhookendpoint上使用原始bodyParser中间件的示例,以便您的代码获得所需的原始字符串:

// Use JSON parser for all non-webhook routes
app.use((req, res, next) => {
  if (req.originalUrl === '/webhook') {
    next();
  } else {
    express.json()(req, res, next);
  }
});

// Stripe requires the raw body to construct the event
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
  const sig = req.headers['stripe-signature'];

  let event;

  try {
    event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
  } catch (err) {
    // On error, log and return the error message
    console.log(`❌ Error message: ${err.message}`);
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }

  // Successfully constructed event
  console.log('✅ Success:', event.id);

  // Return a response to acknowledge receipt of the event
  res.json({received: true});
});

 类似资料:
  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 我试图上传一个图像使用预先签名的网址 我得到了一个类似的url https://s3.eu-west-1.amazonaws.com/bucket/folder/access.JPG?AWSAccessKeyId=xxxx 我已经尝试上传文件与内容类型图像/jpg,多部分/表单数据。 尝试生成没有文件类型和上传的网址。 尝试了放后法 但似乎什么都不管用 错误总是: 我们计算的请求签名与您提供的签名

  • null 无论我用电子邮件发送apks还是用USB安装apks,问题仍然存在。

  • 问题内容: 我有以下JNLP文件: 现在,当我尝试从网络运行时,出现以下错误: 随着以下的例外 有谁知道如何解决这个问题? 问题答案: 这为我工作: 转到控制面板/ Java。 然后单击“设置”按钮并激活“保留我的计算机上的临时文件”选项。 很奇怪,但是有效!

  • 下面是C 17形式的规则([basic.lval]/8),但它在其他标准中看起来很相似(C 98中是“lvalue”而不是“glvalue”): 8如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义: (8.4)-对应于对象动态类型的有符号或无符号类型 这条规则听起来像是“除非你做X,否则你会得到UB”,但这并不意味着如果你做了X,你就不会得到UB,正如人们所期望的那样

  • 我在Rest服务上使用JWT的Spring启动和Spring安全。我使用了下面链接中的代码:https://www.javainuse.com/spring/boot-jwt-mysql它工作正常,但是当我们使用它的令牌进行身份验证时...我们面临以下错误: til.getSignatureException:JWT签名与本地计算的签名不匹配。JWT有效性不能被断言,也不应该被信任。在til.ja