ConnectionResetError при использовании fetch API для передачи данных в представление Django, которое отправляет данные на внешний api
Я пытаюсь реализовать Opayo(Sagepay) с помощью Django. Я пытаюсь отправить переменную card_identifier из моего шаблона в представление, используя fetch API. Затем представление будет использовать пакет requests для отправки этого card_identifier вместе с другими данными в api для обработки платежа. В ответ api должен получить JsonResponse, который я хочу передать обратно в шаблон или использовать для перенаправления на страницу успеха или неудачи платежа.
async function processPayment() {
var card_identifier = document.querySelector('[name="card-identifier"]').value
var url = "{% url 'sagepay:processing_payment' %}"
await fetch(url, {
method: 'POST',
headers: { 'content-type': 'application/json', 'X-CSRFToken': csrftoken, },
body: JSON.stringify({ merchantSessionKey: merchantSessionKeyContext, card_identifier: card_identifier, })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log(error))
}
В представлении я собираю эту переменную card_identifier и использую ее для осуществления платежа через пост-запрос к sagepay api.
def process_payment(request):
body = json.loads(request.body)
card_identifier = body["card_identifier"]
merchantSessionKey = body["merchantSessionKey"]
basket = Basket(request)
total = str(basket.get_total_price())
total = total.replace(".", "")
amount = int(total)
headers = {
"Authorization": "my key goes here",
}
data = {
"transactionType": "Payment",
"paymentMethod": {"card": {"merchantSessionKey": merchantSessionKey, "cardIdentifier": card_identifier}},
"vendorTxCode": "ggmachiSnesdaqjcjjjhqsbxjka",
"amount": amount,
"currency": "EUR",
"description": "Demo transaction",
"apply3DSecure": "UseMSPSetting",
"customerFirstName": "Sam",
"customerLastName": "Jones",
"billingAddress": {
"address1": "407 St. John Street",
"city": "London",
"postalCode": "EC1V 4AB",
"country": "GB",
},
"entryMethod": "Ecommerce",
}
response = requests.post("https://pi-test.sagepay.com/api/v1/transactions", headers=headers, json=data)
jsonresponse = response.json()
print(jsonresponse)
return JsonResponse(jsonresponse)
Вот ошибка, которую я получаю:
Exception occurred during processing of request from ('127.0.0.1', 51080)
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/socketserver.py", line 650, in process_request_thread
self.finish_request(request, client_address)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/socketserver.py", line 720, in __init__
self.handle()
File "/Users/johndodd/Desktop/Programming/Professional/GGMachines/venv/lib/python3.9/site-packages/django/core/servers/basehttp.py", line 174, in handle
self.handle_one_request()
File "/Users/johndodd/Desktop/Programming/Professional/GGMachines/venv/lib/python3.9/site-packages/django/core/servers/basehttp.py", line 182, in handle_one_request
self.raw_requestline = self.rfile.readline(65537)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/socket.py", line 704, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [Errno 54] Connection reset by peer
enter code here
В консоли браузера у меня такая ошибка:
TypeError: Cannot read property 'requestContent' of undefined
Я протестировал часть Fetch API с базовым представлением django, и этот код работает, т.е. я могу вывести данные, которые передаются моему представлению django, и представление возвращает ответ на фронтенд.
Я также подключаюсь к sagepay api, и он возвращает ответ с подтверждением платежа. Так что, похоже, все правильно. Похоже, что проблема возникает, когда jsonresponse передается обратно из представления в шаблон. Есть ли у кого-нибудь идеи, почему это может происходить, или может быть есть лучший способ сделать это? Спасибо