web-dev-qa-db-ja.com

ストライプエラー:ペイロードの予期される署名と一致する署名が見つかりませんでした

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
9
Zat42

Cloud Functionsが自動的に 既知のタイプの本文コンテンツを解析 。 JSONを取得している場合は、すでに解析されており、req.bodyで利用できます。他のボディ解析ミドルウェアを追加する必要はありません。

生データを処理する必要がある場合は、req.rawBodyを使用する必要がありますが、ここではその必要はないと思います。

7
Doug Stevenson

ここに私のために働いているコードがあります:

    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);

参考: https://github.com/stripe/stripe-node/issues/341

4
Nitin Kumar

これは、firebaseクラウド関数の名前を変更した後、StripeダッシュボードからテストWebhookを送信したときに起こりました。他のすべての機能は正常に動作していました。ターミナルで再設定firebase functions:config:set stripe.webhook_signature = "Your webhook signing secret"(それを使用している場合)と関数を再デプロイすることで解決firebase deploy- -専用機能

2回目は、ストライプダッシュボードでストライプの署名をロールすることで問題を解決しました。

0
Mark

1つのWebhookからはデータを取得できましたが、2番目のWebhookからは取得できませんでした。問題は、使用した秘密鍵が最初のWebhookに使用したものと同じであるということですが、すべてのWebhookには異なるキーがあることがわかりました。同じメッセージを受け取った方法。

0
Marco