66 lines
2.2 KiB
JavaScript
66 lines
2.2 KiB
JavaScript
import { getCookie } from "./cookie.js"
|
|
|
|
let form = document.querySelector('.order-create-form')
|
|
|
|
// Render the PayPal button into #paypal-button-container
|
|
paypal.Buttons({
|
|
|
|
style: {
|
|
color: "gold",
|
|
shape: "rect",
|
|
layout: "vertical"
|
|
},
|
|
|
|
// Call your server to set up the transaction
|
|
createOrder: function(data, actions) {
|
|
const formData = new FormData(form)
|
|
|
|
// get the csrftoken
|
|
const csrftoken = getCookie("csrftoken")
|
|
|
|
const options = {
|
|
method: "POST",
|
|
body: new URLSearchParams(formData),
|
|
mode: "same-origin",
|
|
};
|
|
|
|
// construct a new Request passing in the csrftoken
|
|
const request = new Request('/checkout/', {
|
|
headers: { "X-CSRFToken": csrftoken },
|
|
})
|
|
|
|
return fetch(request, options)
|
|
.then((response) => response.json())
|
|
.then((order) => order.id)
|
|
},
|
|
|
|
// Call your server to finalize the transaction
|
|
onApprove: (data, actions) => {
|
|
const csrftoken = getCookie("csrftoken")
|
|
return fetch('/paypal/order/' + data.orderID + '/capture/', {
|
|
method: 'post',
|
|
headers: {'X-CSRFToken': csrftoken}
|
|
})
|
|
.then((response) => response.json())
|
|
.then((orderData) => {
|
|
var errorDetail = Array.isArray(orderData.details) && orderData.details[0];
|
|
|
|
if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') {
|
|
return actions.restart(); // Recoverable state, per:
|
|
// https://developer.paypal.com/docs/checkout/integration-features/funding-failure/
|
|
}
|
|
|
|
if (errorDetail) {
|
|
var msg = 'Sorry, your transaction could not be processed.';
|
|
if (errorDetail.description) msg += '\n\n' + errorDetail.description;
|
|
if (orderData.debug_id) msg += ' (' + orderData.debug_id + ')';
|
|
// Show a failure message
|
|
return actions.redirect(orderData.redirect_urls['cancel_url'])
|
|
}
|
|
|
|
// Successful capture!
|
|
actions.redirect(orderData.redirect_urls['return_url'])
|
|
});
|
|
}
|
|
}).render('#paypal-button-container');
|