Ошибка чередования: не найдено ни одной подписи, соответствующей ожидаемой подписи для полезной нагрузки. - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть веб-крючок в полоску, который вызывает функцию Firebase.В этой функции мне нужно убедиться, что этот запрос исходит от серверов 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

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Вот код, который работает для меня:

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

Refrence: https://github.com/stripe/stripe-node/issues/341

0 голосов
/ 23 декабря 2018

Облачные функции автоматически анализирует содержимое тела известных типов .Если вы получаете JSON, то он уже проанализирован и доступен для вас в req.body.Вам не нужно добавлять другое промежуточное программное обеспечение для разбора тела.

Если вам нужно обработать необработанные данные, вы должны использовать req.rawBody, но я не думаю, что вам нужно делать это здесь.

...