web-dev-qa-db-fra.com

Erreur Stripe: aucune signature trouvée correspondant à la signature attendue pour la charge utile

J'ai un webhook à rayures qui appelle une fonction Firebase. Dans cette fonction, je dois vérifier que cette demande provient des serveurs Stripe. Voici le code:

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

Comme mentionné dans Stripe Documentation , je dois utiliser le corps brut pour effectuer ce contrôle de sécurité.

J'ai essayé avec mon code actuel et avec:

app.use(require('body-parser').raw({type: '*/*'}));

Mais j'ai toujours cette erreur:

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

Fonctions cloud automatiquement analyse le contenu corporel des types connus . Si vous obtenez du JSON, il est déjà analysé et disponible dans req.body. Vous ne devriez pas avoir besoin d'ajouter un autre middleware d'analyse de corps.

Si vous devez traiter les données brutes, vous devez utiliser req.rawBody, mais je ne pense pas que vous aurez besoin de le faire ici.

7
Doug Stevenson

Voici le code qui fonctionne pour moi:

    app.use(bodyParser.json({
    verify: function (req, res, buf) {
      var url = req.originalUrl;
      if (url.startsWith('/stripe'))
        req.rawBody = buf.toString();
    }
  }));

Et puis passez le req.rawBody pour vérification

stripe.checkWebHook(req.rawBody, signature);

Réfrence: https://github.com/stripe/stripe-node/issues/341

4
Nitin Kumar

Cela m'est arrivé lors de l'envoi d'un webhook de test à partir du tableau de bord Stripe après avoir renommé une fonction cloud Firebase. Toutes mes autres fonctions fonctionnaient bien. Résolu en réinitialisant le terminal fonctions firebase: config: set stripe.webhook_signature = "Votre secret de signature de webhook" (si vous l'utilisez) et redéploiement des fonctions firebase deploy - -fonction uniquement

Une deuxième fois, j'ai résolu le problème en faisant rouler la signature rayée dans le tableau de bord rayé.

0
Mark

J'ai pu obtenir des données à partir d'un webhook mais pas à partir d'un second: le problème était que la clé secrète que j'utilisais était la même que celle utilisée pour le premier webhook, mais j'ai découvert que chaque webhook a une clé différente, c'est comme j'ai reçu ce même message.

0
Marco