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