#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
Затем выполните:
- Измените свой серверный сервер, чтобы возвращать
JsonResult
URL-адрес вместоRedirectResult
return Json(new {redirectUrl = "/checkout/thank-you"});
- используется
then
для перенаправления
// other code omitted
.then(function (response) { return response.json(); })
.then(function (data) {window.location.replace(data.redirectUrl)});