Django i przelewy24

0

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?

0

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

0

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

0
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[]

0

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

0
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

0

Odświeżę, bo temat ten sam.
Ktoś instalował może przelewy z django-scar do swoje app? Bez django-scar to będzie działać?
Osatni update "5 years ago". Korzystać czy pisać swoje?

0

Zainstalowałem getpaid, ale naturalnie, że nie działa. ;D

0

Dzięki. Chociaż jeszcze walcze z getpaid, bo jestem pewien, ze to jest kilka razy lepsze niż ja będę w stanie sam napisać.

0

@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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1