Cześć,
Chcę zaimplementować Przelewy24 w moim sklepie w Django.
Potrafię zarejestrować transakcję, ale wciąż nie udaje mi się odebrać jej potwierdzenia, które przychodzi mi na adres p24_url_status. Nie wiem co i jak powinienem zrobić by zweryfikować iż transakcja przebiegła pomyślnie.
Wiem, że są wysyłane metodą POST dane o transakcji na pewien adres, ale jak je stamtąd wydobyć?
Jest tutaj ktoś kto wie?

- Rejestracja:ponad 6 lat
- Ostatnio:ponad 6 lat
- Postów:1
- Rejestracja:ponad 7 lat
- Ostatnio:prawie 2 lata
Cześć,
osobiście za bardzo ci nie pomogę, ale zobacz integrację Przelewy24 z django-oscar, może coś ci się przyda: https://github.com/kisiel/django-oscar-przelewy24
BartekN napisał(a):
Zapoznaj się też z django_getpaid które pozwala na wybór oraz integrację z czołowymi polskimi bramkami płatności, w tym z Przelewy24
https://django-getpaid.readthedocs.io/en/przelewy24/#contents[]
- Rejestracja:ponad 6 lat
- Ostatnio:ponad 6 lat
- Postów:1
Poniżej przykładowa, dość prymitywna implementacja pozwalająca potwierdzić transakcję Przelewy24.
Należy wprowadzić poprawki zgodnie z kometnarzami - w przeciwnym razie kod potwierdzi każdą transakcję, oraz nie zmieni statusu zamówienia w sklepie !!!
endpoint kierujący do metody Przelewy24.p24status() należy podać podczas rejestracji transakcji do Przelewy24 w parametrze p24_url_status.
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import hashlib
import urllib
import requests
class Przelewy24:
id = "XXXXX" #id nadane przez P24
crcKey = "XXXXXXXXXXXXXXXX" #klucz CRC z panelu P24
@csrf_exempt
def p24status(request):
if request.method == "POST":
order = Przelewy24.getOrder(request)
if order is not None:
receivedSign = request.POST.get("p24_sign", "")
result = Przelewy24.confirmPayment(order, receivedSign)
if result == 'error=0':
status = Przelewy24.setOrderAsPayd(order)
return HttpResponse(status)
else:
return HttpResponse("None of orders fit!")
else:
return HttpResponse("No Post Data!")
# zamiast tworzyć obiekt z danych z requestu. weź tylko
# znajdź zamówienie na podstawie p24_session_id z własnej bazy
# z requesta pobierz dodatkowo tylko p24_order_id
def getOrder(request):
orderId = request.POST.get('p24_order_id', "")
sessionId = request.POST.get('p24_session_id', "")
amount = request.POST.get('p24_amount', "")
currency = request.POST.get('p24_currency', "")
order = Order(sessionId, orderId, amount, currency)
order.getOrderSign(Przelewy24.crcKey)
return order
def confirmPayment(order, receivedSign):
if order.sign == receivedSign:
url = "https://secure.przelewy24.pl/trnVerify"
data = {
"p24_session_id" : order.sessionId,
"p24_order_id" : order.orderId,
"p24_amount" : order.amount,
"p24_currency" : order.currency,
"p24_sign" : order.sign,
"p24_pos_id": Przelewy24.id,
"p24_merchant_id": Przelewy24.id
}
r = requests.post(url, data)
return r.text
else:
return "Wrong sign!!!"
# Tutaj ustaw odniesienie do zamówienia w bazie
# i zmiana jego statusu
def setOrderAsPayd(order):
return "OK"
class Order:
sessionId = ""
orderId = ""
amount = ""
currency = ""
sign = ""
def __init__(self, sessionId, orderId, amount, currency):
self.sessionId = sessionId
self.orderId = orderId
self.amount = amount
self.currency = currency
def getOrderSign(self, crcKey):
toMd5 = self.sessionId + "|"
toMd5 += self.orderId + "|"
toMd5 += self.amount + "|"
toMd5 += self.currency + "|"
toMd5 += crcKey
self.sign = hashlib.md5(bytes(toMd5,"UTF-8")).hexdigest()
return toMd5
- Rejestracja:ponad 9 lat
- Ostatnio:prawie 4 lata
- Postów:47
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import hashlib
import urllib
import requests
class Przelewy24:
id = "XXXXX" #id nadane przez P24
crcKey = "XXXXXXXXXXXXXXXX" #klucz CRC z panelu P24
@csrf_exempt
def p24status(request):
if request.method == "POST":
order = Przelewy24.getOrder(request)
if order is not None:
receivedSign = request.POST.get("p24_sign", "")
result = Przelewy24.confirmPayment(order, receivedSign)
if result == 'error=0':
status = Przelewy24.setOrderAsPayd(order)
return HttpResponse(status)
else:
return HttpResponse("None of orders fit!")
else:
return HttpResponse("No Post Data!")
# tą funkcje mozesz zapisać lepiej np.
def p24status(request):
if request.method == "POST":
order = Przelewy24.getOrder(request)
else:
return HttpResponse("No Post Data!")
if order is not None:
receivedSign = request.POST.get("p24_sign", "")
result = Przelewy24.confirmPayment(order, receivedSign)
else:
return HttpResponse("None of orders fit!")
if result == 'error=0':
status = Przelewy24.setOrderAsPayd(order)
return HttpResponse(status)
# nie jest to o wiele lepiej ale jest lepiej.
# zamiast tworzyć obiekt z danych z requestu. weź tylko
# znajdź zamówienie na podstawie p24_session_id z własnej bazy
# z requesta pobierz dodatkowo tylko p24_order_id
def getOrder(request):
orderId = request.POST.get('p24_order_id', "")
sessionId = request.POST.get('p24_session_id', "")
amount = request.POST.get('p24_amount', "")
currency = request.POST.get('p24_currency', "")
order = Order(sessionId, orderId, amount, currency)
order.getOrderSign(Przelewy24.crcKey)
return order
def confirmPayment(order, receivedSign):
if order.sign == receivedSign:
url = "https://secure.przelewy24.pl/trnVerify"
data = {
"p24_session_id" : order.sessionId,
"p24_order_id" : order.orderId,
"p24_amount" : order.amount,
"p24_currency" : order.currency,
"p24_sign" : order.sign,
"p24_pos_id": Przelewy24.id,
"p24_merchant_id": Przelewy24.id
}
r = requests.post(url, data)
return r.text
else:
return "Wrong sign!!!"
# Tutaj ustaw odniesienie do zamówienia w bazie
# i zmiana jego statusu
def setOrderAsPayd(order):
return "OK"
class Order:
sign = "" # po co to?
def __init__(self, sessionId=None, orderId=None, amount=None, currency=None):
self.sessionId = sessionId
self.orderId = orderId
self.amount = amount
self.currency = currency
self.sign = None # o tak
def getOrderSign(self, crcKey):
toMd5 = self.sessionId + "|"
toMd5 += self.orderId + "|"
toMd5 += self.amount + "|"
toMd5 += self.currency + "|"
toMd5 += crcKey
self.sign = hashlib.md5(bytes(toMd5,"UTF-8")).hexdigest() # zmienne tworzymy w innicie nie w funkcji
return toMd5
- Rejestracja:ponad 4 lata
- Ostatnio:ponad 3 lata
- Postów:245
Tu masz specyfikację gdybyś to próbował zaklepać: https://www.przelewy24.pl/storage/app/media/pobierz/Instalacja/przelewy24_specyfikacja_3_2.pdf

- Rejestracja:prawie 4 lata
- Ostatnio:prawie 4 lata
- Postów:1
@vitz666: Udało się? Walczyłem dzisiaj z django-getpaid/django-getpaid i nic produktywnego nie zrobiłem. Podzielisz się wskazówkami jak zaimplementować płatność p24 w django?
PerlMonkbool notWorking = !isWorking()