Невозможно передать данные в представления Django с помощью fetch() в js после PayPal
У меня возникли проблемы с вставкой новых записей заказов в базу данных с помощью PayPal. Нет никаких проблем с проведением платежа с помощью PayPal. Но, когда я пытаюсь передать данные POST в django views. Ничего не отображается. Затем я пытаюсь вывести некоторое значение в views.py, но все равно ничего не отображается.
Итак, я думаю, что функции в views.py не срабатывают и, возможно, есть проблема внутри fetch(), но я не могу найти проблему. Не могли бы вы, ребята, помочь мне понять, в чем проблема. Спасибо.
Javascript
var total = '{{ amount|floatformat:2 }}'
function initPayPalButton() {
paypal.Buttons({
style: {
shape: 'pill',
color: 'blue',
layout: 'vertical',
label: 'paypal',
},
createOrder: function(data, actions) {
return actions.order.create({
purchase_units: [{"amount":{"currency_code":"MYR","value":total}}],
application_context: {
shipping_preference: 'NO_SHIPPING'
}
});
},
onApprove: function(data, actions) {
return actions.order.capture().then(function(orderData) {
submitFormData();
window.alert('Payment Success')
});
},
onError: function(err) {
console.log(err);
}
}).render('#paypal-button-container');
}
initPayPalButton();
submitFormData()
function submitFormData(){
var url = "/checkout/"
fetch(url, {
method:'POST',
headers:{
'Content-Type':'application/json',
'X-CSRFToken':csrftoken,
},
body:JSON.stringify({
'email': document.getElementById("txtEmail").value.rstrip(),
'phoneNo': document.getElementById("txtPhoneNo").value.rstrip(),
}),
})
.then((response) => response.json())
.then((data) => {
window.location.href = "{% url 'ecommerce:checkout' %}"
})
}
urls.py
path('checkout/', OrderSummaryView.as_view(), name='checkout'),
views.py
class OrderSummaryView(LoginRequiredMixin, View):
def get(self, *args, **kwargs): ...
def post(self, *args, **kwargs):
try:
data = json.loads(self.request.body)
print(data['email'])
print(data['phoneNo'])
messages.success(self.request, 'Order Successfully!')
return render(self.request, 'user/homepage.html')
except ObjectDoesNotExist:
messages.warning(self.request, "Order Failed")
return redirect("ecommerce:cart")
Я пытаюсь вывести некоторое значение в файле views.py, но ничего не отображается.
Где вы ожидаете его отображения? Ваше представление не возвращает json вызывающей стороне, поэтому вы не можете использовать response.json()
в JS. Вместо этого оно возвращает рендер 'user/homepage.html', что не имеет никакого смысла, но вы должны быть в состоянии просмотреть данные того, что оно возвращает, на вкладке "Network" вашего браузера в Developer Tools.
Более того, вам следует не использовать actions.order.create()
/ .capture()
на стороне клиента, а затем размещать данные для хранения в базе данных. Вместо этого перейдите на соответствующую интеграцию на стороне сервера, которая записывает такие данные в момент захвата.
Следуйте руководству Установка стандартных платежей и создайте 2 маршрута на вашем сервере, один для 'Create Order' и один для 'Capture Order', документированные здесь. Оба маршрута должны возвращать только JSON данные (без HTML или текста). Внутри второго маршрута, когда API захват будет успешным, вы должны сохранить его результирующие платежные данные в вашей базе данных (в частности purchase_units[0].payments.captures[0].id
, который является идентификатором транзакции PayPal, а также email/телефон, отправленный в маршрут) и выполнить любую необходимую бизнес-логику (такую как отправка писем с подтверждением или резервирование продукта) непосредственно перед передачей вашего возвращенного JSON ответа на фронтенд вызывающей стороне.
Сопрягите эти 2 маршрута с потоком утверждения на фронтенде: https://developer.paypal.com/demo/checkout/#/pattern/server