带有 Google Cloud Functions 的 Stripe webhook 不断给出 Webhook 错误:未找到与有效负载的预期签名匹配的签名

Posted

技术标签:

【中文标题】带有 Google Cloud Functions 的 Stripe webhook 不断给出 Webhook 错误:未找到与有效负载的预期签名匹配的签名【英文标题】:Stripe webhook with Google Cloud Functions keeps giving Webhook Error: No signatures found matching the expected signature for payload 【发布时间】:2021-03-14 20:07:28 【问题描述】:

我知道以前有人问过这个问题,但是如果我在其他问题中实施解决方案,我仍然会收到错误。

情况是:

我尝试将我的 Stripe webhook 测试到 Node.js/Express/Google Cloud Functions 后端。如果我只实现文档中的代码,则会收到错误消息:未找到与有效负载的预期签名匹配的签名。您是否传递了从 Stripe 收到的原始请求正文?

当我在 *** (Stripe Error: No signatures found matching the expected signature for payload) 上搜索此错误时,我读到:

Cloud Functions 自动解析已知类型的正文内容。如果 您正在获取 JSON,然后它已经被解析并可供您使用 请求正文。您不需要添加其他正文解析中间件。

如果你需要处理原始数据,你应该使用req.rawBody,但我 不要认为你需要在这里这样做。

这是包含 Stripe 文档中的代码的代码:

const functions = require('firebase-functions');
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const admin = require('firebase-admin');
const stripe = require('stripe')('sk_test_****');
const cron = require('node-cron');

// Stripe
const endpointSecret = "whsec_****"

const fulfillOrder = (session) => 
    // TODO: fill me in
    console.log("Fulfilling order", session);
  
  
 app.post('/webhook', bodyParser.raw(type: 'application/json'), (request, response) => 
    const payload = request.body;
    const sig = request.headers['stripe-signature'];
  
    let event;
  
    try 
      event = stripe.webhooks.constructEvent(payload, sig, endpointSecret);
     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...
      fulfillOrder(session);
    
  
    response.status(200);
  );

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

所以我理解的方式是使用谷歌云功能时我需要使用:

const payload = request.rawBody;

这给出了同样的错误。要么是这个错误,要么是超时错误。

我试过了:

app.post('/webhook', bodyParser.raw(type: "*/*"), (request, response) => 
    const payload = request.rawBody

这会导致超时错误。

我错过了什么?

【问题讨论】:

【参考方案1】:

Node 框架和中间件通常会修改主体(甚至是原始主体),导致 Stripe 签名验证失败。不幸的是,没有一个单一的、防弹的修复程序,但我建议您查看这个 GitHub 问题中的几种方法和解决方法:https://github.com/stripe/stripe-node/issues/341

希望其中一项修复对您有用。一般来说,主要的事情是尽快将原始正文从请求中取出,然后再进行任何修改。

【讨论】:

感谢贾斯汀迈克尔。我会看看回购。

以上是关于带有 Google Cloud Functions 的 Stripe webhook 不断给出 Webhook 错误:未找到与有效负载的预期签名匹配的签名的主要内容,如果未能解决你的问题,请参考以下文章

具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]

? Google Cloud Functions ?????? MongoDB Atlas ??

Cloud Functions for Firebase:无法访问 BigQuery

Google Cloud Functions 部署问题

如何从 Cloud Functions 连接 Google Cloud SQL?

Google Cloud Functions 通知 iOS