Firebase関数を呼び出すストライプwebhookがあります。この関数では、このリクエストがStripeサーバーからのものであることを確認する必要があります。ここにコードがあります:
const functions = require('firebase-functions');
const bodyParser = require('body-parser');
const stripe = require("stripe")("sk_test_****");
const endpointSecret = 'whsec_****';
const app = require('express')();
app.use(bodyParser.json({
verify: function (req, res, buf) {
var url = req.originalUrl;
if (url.startsWith('/webhook')) {
req.rawBody = buf.toString()
}
}
}));
app.post('/webhook/example', (req, res) => {
let sig = req.headers["stripe-signature"];
try {
console.log(req.bodyRaw)
let event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
console.log(event);
res.status(200).end()
// Do something with event
}
catch (err) {
console.log(err);
res.status(400).end()
}
});
exports.app = functions.https.onRequest(app);
Stripe Documentation で述べたように、このセキュリティチェックを実行するにはraw bodyを使用する必要があります。
私は現在のコードと:
app.use(require('body-parser').raw({type: '*/*'}));
しかし、私はいつもこのエラーを受け取ります:
Error: No signatures found matching the expected signature for payload. Are you passing the raw request body you received from Stripe? https://github.com/stripe/stripe-node#webhook-signing
Cloud Functionsが自動的に 既知のタイプの本文コンテンツを解析 。 JSONを取得している場合は、すでに解析されており、req.body
で利用できます。他のボディ解析ミドルウェアを追加する必要はありません。
生データを処理する必要がある場合は、req.rawBody
を使用する必要がありますが、ここではその必要はないと思います。
ここに私のために働いているコードがあります:
app.use(bodyParser.json({
verify: function (req, res, buf) {
var url = req.originalUrl;
if (url.startsWith('/stripe'))
req.rawBody = buf.toString();
}
}));
そして、検証のためにreq.rawBodyを渡します
stripe.checkWebHook(req.rawBody, signature);
これは、firebaseクラウド関数の名前を変更した後、StripeダッシュボードからテストWebhookを送信したときに起こりました。他のすべての機能は正常に動作していました。ターミナルで再設定firebase functions:config:set stripe.webhook_signature = "Your webhook signing secret"(それを使用している場合)と関数を再デプロイすることで解決firebase deploy- -専用機能
2回目は、ストライプダッシュボードでストライプの署名をロールすることで問題を解決しました。
1つのWebhookからはデータを取得できましたが、2番目のWebhookからは取得できませんでした。問題は、使用した秘密鍵が最初のWebhookに使用したものと同じであるということですが、すべてのWebhookには異なるキーがあることがわかりました。同じメッセージを受け取った方法。