Получение исключения на webhook от Stripe - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь настроить webhook от Stripe для обработки события payment_intent.succeeded, но я получаю исключение. Это мой код из бэкэнда Node (я извлек все соответствующие части, которые я надеюсь. Дайте мне знать, если что-то еще понадобится):

const stripeWebHookSecret = 'whsec_WA0Rh4vAD3z0rMWy4kv2p6XXXXXXXXXX';

import express from 'express';
const app = express();
app.use(bodyParser.urlencoded({ extended:true }));
app.use(bodyParser.json());
app.use(session({ <some params here> }));

const openRouter = express.Router();

registerOpenPaymentRoutes(openRouter);

app.use('/open', openRouter);

А реализация registerOpenPaymentRoutes выглядит так:

export const registerOpenPaymentRoutes = (router) => {
    router.post('/payment/intent/webhook', bodyParser.raw({type: 'application/json'}), (req, res) => {
        let signature = req.headers['stripe-signature'];
        try {
            let event = stripe.webhooks.constructEvent(req.body, signature, stripeWebHookSecret);
            switch(event.type){
                case 'payment_intent.succeeded':
                    let intent = event.data.object;
                    res.json({ message: 'Everything went smooth!', intent });
                default:
                    res.status(400).json({ error: 'Event type not supported' });
            }
        }
        catch (error){
            res.status(400).json({ message: `Wrong signature`, signature, body: req.body, error });
        }
    });
}

Пока все хорошо. Когда я запускаю тестовое событие webhook с информационной панели Stripe, я достигаю конечной точки, но получаю результат из блока catch. Сообщение об ошибке выглядит следующим образом:

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"

Я возвращаю подпись с сообщением об ошибке, как вы видите выше, и подпись выглядит так:

"t=1557911017,v1=bebf499bcb35198b8bfaf22a68b8879574298f9f424e57ef292752e3ce21914d,v0=23402bb405bfd6bd2a13c310cfecda7ae1905609923d801fa4e8b872a4f82894"

Насколько я понимаю из документации, для получения необработанного тела запроса, как уже упоминалось, требуется аргумент bodyParser.raw({type: 'application/json'}) маршрутизатора, который у меня уже есть.

Кто-нибудь может увидеть недостающую часть?

1 Ответ

1 голос
/ 15 мая 2019

Это потому, что вы уже настроили ваше экспресс-приложение для использования промежуточного программного обеспечения bodyParser.json(), которое конфликтует с промежуточным программным обеспечением bodyParser.raw(), которое вы установили в маршруте веб-крюка.

Если вы удалите app.use(bodyParser.json());Если ваши веб-зацепки будут работать так, как задумано, но тогда остальные маршруты не будут иметь анализируемого тела, что не идеально.

Я предлагаю добавить пользовательское промежуточное ПО для выбора версии bodyParser на основемаршрут.Что-то вроде:

// only use the raw bodyParser for webhooks
app.use((req, res, next) => {
  if (req.originalUrl === '/payment/intent/webhook') {
    next();
  } else {
    bodyParser.json()(req, res, next);
  }
});

Затем явно используйте промежуточное ПО bodyParser.raw() на маршрутах webhook.

...