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
W przypadku metody płatności PayU | Płacę później środki są przekazywane do dostawcy usług kredytowych.
W PayU dostępne są dwa rodzaje zwrotów: pełny i częściowy.
Aby utworzyć zwrot, musisz wywołać endpoint /api/v2_1/orders/{orderId}/refunds, używając metody POST.
Transakcje możesz również zwracać z poziomu panelu menedżerskiego. Wystarczy, że znajdziesz transakcję na liście i wybierzesz Zwróć w kolumnie Akcja.
Wszystkie kwoty należy podawać w najmniejszej jednostce walutowej, np. najniższą jednostką walutową dla PLN jest grosz (1/100 PLN), więc 1000 jest równe 10 PLN. HUF jest wyjątkiem - należy go pomnożyć przez 100.
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.
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 waluty użytej w pierwotnym zamówieniu (np. dla Polski najniższą jednostką waluty jest grosz (1/100 PLN), więc 10 PLN 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.
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:
- SUCCESS
- ERROR
{
"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"
}
}
refundIdParametr refundId, wyróżniony w ciele odpowiedzi, możesz wykorzystać do pobrania informacji o konkretnym zwrocie.
{
"status": {
"statusCode": "ERROR_VALUE_MISSING",
"severity": "ERROR",
"code": "8300",
"codeLiteral": "MISSING_REFUND_SECTION",
"statusDesc": "Missing required field"
}
}
Żą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.
| Kod statusu | CodeLiteral | Kod | Opis |
|---|---|---|---|
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. |
Powiadomienie o zwrocie
Po przetworzeniu zwrotu PayU wyśle Ci powiadomienie ze szczegółowymi informacjami dotyczącymi zwrotu, w tym jego obecny status.
{
"orderId": "2DVZMPMFPN140219GUEST000P01",
"extOrderId": "Id zamówienia w Twoim sklepie",
"refund": {
"refundId": "912128",
"extRefundId": "123456",
"amount": "15516",
"currencyCode": "PLN",
"status": "FINALIZED", // FINALIZED lub CANCELED
"statusDateTime": "2014-08-20T19:43:31.418+02:00",
"reason": "refund",
"reasonDescription": "na życzenie klienta",
"refundDate": "2014-08-20T19:43:30.150+02:00"
}
}
W powiadomieniu możesz otrzymać następujące statusy zwrotu:
- FINALIZED - zwrot został dokonany pomyślnie,
- CANCELED - zwrot został anulowany.
Pobieranie danych zwrotu
Możesz pobrać listę zwrotów dla określonego orderId albo dane konkretnego zwrotu, używając refundId zwróconego w odpowiedzi na żądanie utworzenia zwrotu.
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:
{
"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",
"providerPublicId": "091434767430"
},
{
"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",
"providerPublicId": "625707966433"
}
]
}
Szczegółowe informacje na temat pól odpowiedzi znajdziesz w sekcji Retrieve all Refunds Data w naszej referencji API.
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:
{
"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",
"providerPublicId": "091434767430"
}
Szczegółowe informacje na temat pól odpowiedzi znajdziesz w sekcji Retrieve Specific Refund Data w naszej referencji API.
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:
- Provider Technical Error
- Card Refund - Invalid amount
{
...
"statusError": {
"code": "PROVIDER_TECHNICAL_ERROR",
"description": "Temporary problem on Provider Side"
}
}
{
...
"statusError": {
"code": "S13",
"description": "S13 - Invalid amount"
}
}
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:
| Kod błędu | Opis | Postę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. |
S01 - SP9 | Dostawca schematu kartowego odrzucił autoryzację zwrotu. | Zapoznaj się ze stroną kodów statusów kart, na której znajdziesz kody zwracane zarówno dla autoryzacji transakcji, jak i zwrotu. |