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 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.
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.
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.
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"
}
}
refundId
Zaznaczony w ciele odpowiedzi jest parametr refundId
, którego możesz użyć 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. |
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.
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"
},
{
"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
:
{
"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
:
{
...
"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:
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. |