Как принудительно перенаправить на другую страницу, кроме success_url в Stripe Checkout? - PullRequest
2 голосов
/ 25 февраля 2020

ВОПРОС:

В настоящее время я использую веб-крючок: при получении события checkout.session.completed пользователь по умолчанию перенаправляется на success_url, даже если я пытаюсь перенаправить его на другая страница с res.redirect ("/ page") (Node.js). Неужели нет способа перенаправить его на другую страницу в случае сбоя моего кода выполнения? (То есть: платеж выполнен успешно, но код выполнения не выполнен, поэтому перенаправление на success_url не подходит)


ССЫЛКА:

https://stripe.com/docs/payments/checkout/one-time

https://stripe.com/docs/payments/checkout/fulfillment#webhooks

"Webhook checkout.session.completed отправляется на ваш сервер до того, как ваш клиент будет перенаправлен. Ваше подтверждение webhook (любое 2xx код состояния) вызовет перенаправление клиента на success_url "


ЧТО Я ПОПРОБОВАЛ:

Цепочка Express. js 4 res .status (401) для перенаправления

Итак, если бы я должен был отправить код состояния 4xx, разве это не помешало бы перенаправлению success_url? Это действительно то, что я наблюдаю.

Но я не могу перенаправить на другую страницу. Я пробовал:

res.status(401).location('/submit/wait/').end();
res.redirect(401, '/submit/wait/');
res.set('Content-Type', 'text/html');
res.status(401).send('<!DOCTYPE html><html><head><meta http-equiv="refresh" content="0; url=/submit/wait"></head></html>`);Is there really no way to then just redirect to another page ?  

КОД

router.post('/webhook', bodyParser.raw({type: 'application/json'}), (req, res) => {

    const sig = req.headers['stripe-signature'];
    let event;

    try {
        event = stripe.webhooks.constructEvent(req.rawBody, sig, endpointSecret);
    } catch (err) {
        return res.status(400).send(`Webhook Error: ${err.message}`);
    }

    if (event.type === 'checkout.session.completed') {

        const session = event.data.object;

        (async () => {

            try {
                //FULFIL ORDER CODE

            } catch(e) {
                console.log("ERROR FULFILLING ORDER: "+e);


                res.status(401).location('/submit/wait/').end();

            }
        })();
    }
    else {
        console.log("DEFAULT RESPONSE");

        // Return a response to acknowledge receipt of the event
        res.json({received: true});
    }

});

1 Ответ

3 голосов
/ 25 февраля 2020

Событие checkout.session.completed , отправленное на конечную точку webhook, предназначено только для того, чтобы вы знали, что сессия проверки завершена. Вы не можете использовать уведомление о событии, чтобы изменить сеанс проверки каким-либо образом, кроме того, что он ответил успешно или неудачно.

Причина, по которой перенаправление клиента задерживается до тех пор, пока вы не отреагируете на событие checkout.session.completed, состоит в том, чтобы позволить вам выполнить выполнение. задач на вашем сервере до того, как пользователь будет перенаправлен на success_url (например, обновление базы данных, выполнение других вызовов API и т. д. c.). Это гарантирует, что клиент попадает на страницу, которая отражает его успешную покупку.

Сам success_url не может быть изменен на данном этапе процесса, но вы можете настроить на своем сервере страницу, которая будет перенаправлять пользователя на любую страницу, которую вы * sh на основе идентификатора сеанса Checkout и установите success_url на этой странице. Вы можете включить идентификатор сеанса Checkout в свой success_url, используя {CHECKOUT_SESSION_ID} заполнитель .

...