Обратный вызов post-запроса Javascript, перенаправление с .СЕТЕВОЙ контроллер MVC

#asp.net-mvc #paypal #paypal-sandbox #fetch-api

#asp.net-mvc #paypal #paypal-песочница #извлечение-api

Вопрос:

Я интегрирую PayPal checkout с решением e-com, где после успешного создания PayPal заказа / платежа PayPal я выполняю некоторую обработку на стороне сервера, которая в конечном итоге возвращает RedirectResult (с URL-адресом для сбоя платежа или успеха соответственно) с моего контроллера обратно клиенту / интерфейсу.

У меня есть следующий код ниже, и я ожидал, что он перенаправит автоматически, но перенаправление не происходит.

 paypal.Buttons({
    createOrder: function (data, actions) {
        return actions.order.create({
            intent: "CAPTURE",
            purchase_units: [{
                amount: {
                    value: '5.20',
                }
            }]
        });
    },
    onApprove: function (data, actions) {
        return actions.order.capture().then(function (details) {
            return fetch('/umbraco/surface/PayPalPayment/process', {
                method: 'post',
                redirect: 'follow',
                body: JSON.stringify({
                    OrderID: data.orderID,
                    PayerID: data.payerID,
                }),
                headers: {
                    'content-type': 'application/json'
                }
            });
        }).catch(error=>console.log("Error capturing order!", error));
    }
}).render('#paypal-button-container');
  

Если я явно перенаправлю с помощью приведенного ниже кода, то действие будет выполнено.

 onApprove: function (data, actions) {
        return actions.order.capture().then(function (details) {
            return fetch('/umbraco/surface/PayPalPayment/process', {
                method: 'post',
                redirect: 'follow',
                body: JSON.stringify({
                    OrderID: data.orderID,
                    PayerID: data.payerID,
                }),
                headers: {
                    'content-type': 'application/json'
                }
            }).then(function () { window.location.replace('https://www.google.co.uk') });
        }).catch(function (error) {
            console.log("Error capturing order!", error);
            window.location.replace('https://www.bbc.co.uk');
        });
    }
  

В принципе, мне интересно, почему fetch redirect не следует за перенаправлением, возвращаемым с моего контроллера. Перенаправление контроллера для полной завершенности:

 return new RedirectResult("/checkout/thank-you") ;
  

Комментарии:

1. Basically, I'm wondering why fetch redirect does not follow the Redirect that is returned form my controller — Не могли бы вы объяснить это подробнее?

Ответ №1:

Позвольте мне попытаться перефразировать ваш вопрос

Вы хотите знать, почему браузер не перенаправил после того, как вы сделали fetch — даже несмотря на то, fetch что ответ api был RedirectResult

Причина проста, вы сделали запрос в fetch , что означает, что вы выполняете ajax-запрос (следовательно, браузер не изменится)

вы устанавливаете redirect значение follow , что означает, что после первого запроса (т. е. после получения ответа от /umbraco/surface/PayPalPayment/process ) он будет следовать по URL /checkout/thank-you , так что то, что вы получите в then() , будет ответом /checkout/thank-you

в целом, ответ действительно последовал, но, возможно, не так, как вы ожидали (следуйте в запросе ajax, а не в браузере, меняющем страницу)

Если вам нужно перенаправление на определенную страницу, после успешного вызова /umbraco/surface/PayPalPayment/process

Затем выполните:

  1. Измените свой серверный сервер, чтобы возвращать JsonResult URL-адрес вместо RedirectResult
 return Json(new {redirectUrl = "/checkout/thank-you"});
  
  1. используется then для перенаправления
 // other code omitted

.then(function (response) { return response.json(); })
.then(function (data) {window.location.replace(data.redirectUrl)});