NodeJS Stripe Webhook constructEvent方法在指向ec2示例时返回400错误

eaf3rand  于 2023-06-22  发布在  Node.js
关注(0)|答案(2)|浏览(139)

我在windows操作系统中开发了我的应用程序,并在ngrok的帮助下集成了Stripe webhook。一切都很顺利,我能够从webhook接收事件。但是一旦我把它移到AWS云上的EC2示例,它就给我抛出了一个错误。
错误:(在Stripe Dashboard Webhook尝试部分)
Webhook错误:第一个参数的类型必须是string或Buffer、ArrayBuffer或Array的示例或类似于Array的Object。接收未定义
奇怪的是,没有改变任何一段代码,它仍然在Windows上工作。
完整错误:

TypeError [ERR_INVALID_ARG_TYPE]: The "key" argument must be of type string or an instance of Buffer, TypedArray, DataView, or KeyObject
. Received undefined
    at prepareSecretKey (internal/crypto/keys.js:322:11)
    at new Hmac (internal/crypto/hash.js:111:9)
    at Object.createHmac (crypto.js:147:10)
    at Object._computeSignature (/home/psuser/middleware/node_modules/stripe/lib/Webhooks.js:65:8)
    at Object.verifyHeader (/home/psuser/middleware/node_modules/stripe/lib/Webhooks.js:107:36)
    at Object.constructEvent (/home/psuser/middleware/node_modules/stripe/lib/Webhooks.js:12:20)
    at /home/psuser/middleware/routes/carts.js:210:29
    at Layer.handle [as handle_request] (/home/psuser/middleware/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/psuser/middleware/node_modules/express/lib/router/route.js:137:13)
    at /home/psuser/middleware/node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (/home/psuser/middleware/node_modules/raw-body/index.js:224:16)
    at done (/home/psuser/middleware/node_modules/raw-body/index.js:213:7)
    at IncomingMessage.onEnd (/home/psuser/middleware/node_modules/raw-body/index.js:273:7)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'ERR_INVALID_ARG_TYPE'
}
The "key" argument must be of type string or an instance of Buffer, TypedArray, DataView, or KeyObject. Received undefined

// End point Code

router.post('/webhook', async (request, response) => {
  const sig = request.headers['stripe-signature'];
  let event;

  try {
    event = stripe.webhooks.constructEvent(request.rawBody, sig, process.env.STRIPE_WEBHOOK_SECRET);
  }
  catch (err) {
    console.log(err.message);
    return response.status(400).send(`Webhook Error: ${err.message}`);
  }
});

// In app.js 

app.use(express.json({
  // Because Stripe needs the raw body, we compute it but only when hitting the Stripe callback URL.
  verify: function (req, res, buf) {
    var url = req.originalUrl;
    if (url.endsWith('/webhook')) {
      req.rawBody = buf.toString()
    }
  }
}));
8wigbo56

8wigbo561#

你可以安装micro(npm install micro),它有自己的buffer方法

const { buffer } = require('micro')

为了创建请求所需的类型:

const reqBuffer = await buffer(req)

然后你可以做:

event = stripe.webhooks.constructEvent(reqBuffer, sig, process.env.STRIPE_WEBHOOK_SECRET);

但我认为你的问题只是在你的EC2服务器中缺少一个ENV变量,你在你的服务器中有export STRIPE_WEBHOOKS_SECRET=secret吗?

jbose2ul

jbose2ul2#

我遇到的另一个潜在问题是,每个webhook端点在Stripe中都有一个唯一的webhook键。所以你的本地whsec_...在Vercel中部署时将不起作用。您需要从端点设置中获取唯一密钥,并将其提供到部署环境中。

相关问题