Przejdź do głównej zawartości

Zwroty

Dzięki PayU możesz łatwo dokonywać zwrotów za pomyślnie zakończone płatności. Po zainicjowaniu zwrotu system zapewnia sprawny transfer zwróconej kwoty bezpośrednio na konto kupującego.

Tworzenie zwrotu

PayU | Płacę później

W przypadku metody płatności PayU | Płacę później środki są przekazywane do dostawcy usług kredytowych.

W PayU transakcje możesz tworzyć dwa rodzaje zwrotów: pełne i częściowe.

Aby utworzyć zwrot, musisz wywołać endpoint /api/v2_1/orders/{orderId}/refunds używając metody POST.

Panel menedżerski

Transakcje możesz również zwracać z poziomu panelu menedżerskiego. Wystarczy że znajdziesz transakcję na liście i wybierzesz Zwróć w kolumnie Akcja.

Zwrot pełny

Pełny zwrot polega na zwróceniu całej kwoty transakcji. Jeśli nie określisz parametru amount w żądaniu, zwrot zostanie potraktowany jako pełny.

Przykład żądania pełnego zwrotu
curl -X POST https://secure.payu.com/api/v2_1/orders/H9LL64F37H160126GUEST000P01/refunds \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd" \
-d '{
"refund": {
"description": "Refund"
}
}'

Szczegółowe informacje na temat parametrów znajdziesz w sekcji Create a Refund w naszej referencji API.

Zwrot częściowy

Aby wykonać zwrot częściowy musisz zamieścić w żądaniu parametr amount z kwotą zwrotu. Kwota zwrotu powinna być podana w najniższej jednostce danej waluty, która musi być tą samą walutą, co początkowe zamówienie (np. dla Polski najniższą jednostką waluty jest grosz (1/100PLN), więc 10PLN powinno być podane jako 1000).

Dla każdego pojedynczego zamówienia możesz wysłać kilka żądań częściowego zwrotu środków. Łączna wartość zwrotów nie może przekraczać wartości zamówienia.

System payu umożliwia wykonanie wielu zwrotów częściowych w tym samym czasie. Aby to zrobić, musisz wysłać parametr extRefundId w żądaniu. W sytuacjach, w których częściowe zwroty nie będą wykonywane częściej niż raz na sekundę, parametr extRefundId nie jest wymagany.

Przykład częściowego zwrotu środków
curl -X POST https://secure.payu.com/api/v2_1/orders/H9LL64F37H160126GUEST000P01/refunds \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd" \
-d '{
"refund": {
"description": "Refund",
"amount": 1000
}
}'

Szczegółowe informacje na temat parametrów znajdziesz w sekcji Create a Refund w naszej referencji API.

Gdy tylko system PayU otrzyma żądanie, potwierdzi ten fakt komunikatem zawierającym odpowiedni status.

Przykład odpowiedzi na wykonany zwrot

Zaakceptowane żądanie zostanie potwierdzone odpowiedzią zawierającą odpowiedni status:

Przykład odpowiedzi dla pomyślnie utworzonego zwrotu
{
"orderId": "ZXWZ53KQQM200702GUEST000P01",
"refund": {
"refundId": "5000009987",
"extRefundId": "20200702091903",
"amount": "21000",
"currencyCode": "PLN",
"description": "5000009987 Refund Accepted",
"creationDateTime": "2020-07-02T09:19:03.896+02:00",
"status": "PENDING",
"statusDateTime": "2020-07-02T09:19:04.013+02:00"
},
"status": {
"statusCode": "SUCCESS",
"statusDesc": "Refund queued for processing"
}
}
Notatka
refundId

Zaznaczony w ciele odpowiedzi jest parametr refundId, którego możesz użyć do pobrania informacji o konkretnym zwrocie.

Notatka

Żądanie zwrotu, które zostało zaakceptowane przez system PayU, może zostać anulowane w Panelu menedżerskim.

Kody błędów

Pole status przesyłane w każdej odpowiedzi zawiera status zwrotu. Nieprawidłowo utworzony zwrot spowoduje wyświetlenie odpowiedzi o błędzie, która zawiera informacje o problemie. Poniżej znajduje się lista możliwych kodów błędów.

Refund Creation Error Codes
Kod statusuCodeLiteralKodOpis
ERROR_VALUE_MISSING
MISSING_REFUND_SECTION
8300
Żądanie nie zawiera obiektu refund.
OPENPAYU_BUSINESS_ERROR
TRANS_NOT_ENDED
9101
Transakcja nie jest zakończona.
OPENPAYU_BUSINESS_ERROR
NO_BALANCE
9102
Brak środków na koncie do zwrotu.
OPENPAYU_ERROR_VALUE_INVALID
AMOUNT_TO_BIG
9103
Kwota zwrotu przekracza kwotę transakcji.
OPENPAYU_ERROR_VALUE_INVALID
AMOUNT_TO_SMALL
9104
Wartość zwrotu jest zbyt mała.
OPENPAYU_BUSINESS_ERROR
REFUND_DISABLED
9105
Zwroty zostały wyłączone.
OPENPAYU_BUSINESS_ERROR
REFUND_TO_OFTEN
9106
Podjęto zbyt wiele prób zwrotu środków.
OPENPAYU_ERROR_VALUE_INVALID
PAID
9108
Zwrot został już utworzony.
OPENPAYU_ERROR_INTERNAL
UNKNOWN_ERROR
9111
Nieznany błąd.
OPENPAYU_BUSINESS_​ERROR
REFUND_IDEMPOTENCY_MISMATCH
9112
Użyto ponownie tę samą wartość parametru extRefundId, ale inne parametry żądania się różnią.
OPENPAYU_BUSINESS_​ERROR
TRANS_BILLING_ENTRIES_NOT_COMPLETED
9113
Billing sklepu nie jest jeszcze kompletny.
OPENPAYU_BUSINESS_​ERROR
TRANS_TOO_​OLD
9114
Dostępny czas na zwrot minął.
OPENPAYU_ERROR_VALUE_​INVALID
REMAINING_TRANS_​AMOUNT_TOO_SMALL
9115
Kwota transakcji pozostała po wykonaniu zwrotu będzie za mała, żeby wykonać kolejny zwrot.

Pobieranie danych zwrotu

Możesz pobrać listę zwrotów dla określonego orderId lub możesz pobrać dane konkretnego zwrotu używając refundId zwróconego w odpowiedzi na żądanie utworzenia zwrotu.

Ciało żądania metody GET

Wysyłając żądania z metodą GET upewnij się, że w ciele żądania nie przesyłasz żadnych danych. Zgodnie ze standardem RFC 9110 żądania, które nie spełniają tego wymogu, zostaną odrzucone przez PayU i zwrócony zostanie kod HTTP 403.

Pobieranie listy zwrotów

Możesz pobrać listę zwrotów utworzonych dla określonego orderId. W tym celu wywołaj endpoint /api/v2_1/orders/<orderId>/refunds używając metody GET. W odpowiedzi otrzymasz listę zwrotów utworzonych dla określonego zamówienia:

Przykładowa lista pobranych zwrotów dla konkretnego orderId
{
"refunds": [
{
"refundId": "5000000142",
"extRefundId": "postman_refund1_QX9ZR7M6QP200601GUEST000P01",
"amount": "400",
"currencyCode": "EUR",
"description": "Order refund",
"creationDateTime": "2020-06-01T13:05:39.489+02:00",
"statusDateTime": "2020-06-01T13:06:03.530+02:00",
"status": "FINALIZED"
},
{
"refundId": "5000000143",
"extRefundId": "postman_refund2_QX9ZR7M6QP200601GUEST000P01",
"amount": "400",
"currencyCode": "EUR",
"description": "Order refund",
"creationDateTime": "2020-06-01T13:18:03.648+02:00",
"statusDateTime": "2020-06-01T13:18:33.661+02:00",
"status": "FINALIZED"
}
]
}

Pobieranie danych konkretnego zwrotu

Możesz również pobrać dane dotyczące konkretnego zwrotu. W tym celu musisz wywołać endpoint /api/v2_1/orders/<orderId>/refunds/<refundId> przy użyciu metody GET. W odpowiedzi otrzymasz dane dotyczące zwrotu z podanym refundId:

Przykład odpowiedzi na pobranie danych konkretnego refundId
{
"refundId": "5000000143",
"extRefundId": "postman_refund2_QX9ZR7M6QP200601GUEST000P01",
"amount": "400",
"currencyCode": "EUR",
"description": "Order refund",
"creationDateTime": "2020-06-01T13:18:03.648+02:00",
"statusDateTime": "2020-06-01T13:18:33.661+02:00",
"status": "FINALIZED"
}

Kody błędów przetwarzania zwrotów

Jeśli zwrot zostanie przetworzony nieprawidłowo, tj. autoryzacja zwrotu nie powiedzie się u dostawcy, po przesłaniu żądania otrzymasz odpowiedź z danymi zwrotu, z dodatkowym polem statusError:

Przykład pola statusError
{
...
"statusError": {
"code": "PROVIDER_TECHNICAL_ERROR",
"description": "Temporary problem on Provider Side"
}
}

W poniższej tabeli wymieniono kody błędów, które mogą wystąpić podczas przetwarzania zwrotu i co należy zrobić w każdym przypadku:

Kody błędów przetwarzania zwrotów
Kod błęduOpisPostępowanie w przypadku zaistnienia
BANK_DECLINED
Bank odrzucił zwrot.
Ponownie wyślij żądanie zwrotu. Jeżeli wystąpi ten sam błąd, skontaktuj się z PayU w celu wykonania zwrotu na rachunek kupującego.
PROVIDER_DECLINED
Dostawca odrzucił zwrot.
Ponownie wyślij żądanie zwrotu. Jeżeli wystąpi ten sam błąd, skontaktuj się z PayU w celu wykonania zwrotu na rachunek kupującego.
PROVIDER_LIMIT_ERROR
Przekroczono limit zwrotu po stronie dostawcy.
Ponownie wyślij żądanie zwrotu. Jeżeli wystąpi ten sam błąd, skontaktuj się z PayU.
PROVIDER_SECURITY_ERROR
Naruszono zasadę bezpieczeństwa.
Ponownie wyślij żądanie zwrotu. Jeżeli wystąpi ten sam błąd, skontaktuj się z PayU.
PROVIDER_TECHNICAL_ERROR
Tymczasowy problem po stronie dostawcy.
Ponownie wyślij żądanie zwrotu. Jeżeli wystąpi ten sam błąd, skontaktuj się z PayU.
BANK_UNAVAILABLE_ERROR
Tymczasowa niedostępność banku dostawcy.
Ponownie wyślij żądanie zwrotu w terminie późniejszym.
REFUND_TOO_LATE
Przekroczono limit czasu na rejestrację zwrotu.
Skontaktuj się z PayU w celu wykonania zwrotu na rachunek kupującego.
TECHNICAL_ERROR
Wystąpił problem techniczny.
Skontaktuj się z PayU.
REFUND_TOO_FAST
Przekroczono limit rejestracji liczby zwrotów w danym czasie.
Ponownie wyślij żądanie zwrotu w terminie późniejszym.
REFUND_IMPOSSIBLE
Dostawca odrzucił zwrot.
Skontaktuj się z PayU w celu wykonania zwrotu na rachunek kupującego.