Marketplace API
Integracja marketplace opiera się na standardowej integracji, ale została rozszerzona o dodatkowe elementy unikalne dla platform marketplace. Rozszerzenia integracji zostały opisane w tej sekcji.
Uwierzytelnienie żądania
Aby móc komunikować się z systemem PayU, musisz uwierzytelnić żądanie za pomocą tokenu OAuth wygenerowanego w trybie client_credentials
. Informacje na temat uwierzytelniania żądań znajdziesz w sekcji Uwierzytelnianie żądań.
Tworzenie nowego zamówienia
Rozszerzenia standardowego zamówienia
Podczas tworzenia nowego zamówienia dla marketplace, musisz dodać sekcję shoppingCarts
do swojego żądania. Ta sekcja definiuje dystrybucję środków do poszczególnych submerchantów.
Kolejną ważną różnicą w stosunku do standardowego zamówienia jest parametr extCustomerId
dodany do sekcji buyer
. Ten parametr identyfikuje submerchanta uczestniczącego w transakcji.
Dodatkowo jeżeli oferujesz rozwiązanie white label musisz dodać do żądania sekcję payMethods
, precyzującą wybraną metodę płatności.
- shoppingCarts
- buyer
- payMethods
...
"shoppingCarts": [
{
"extCustomerId": "ext-customer-1",
"amount": 1800,
"fee": 20,
"shippingMethods": [
{
"country": "EN",
"price": 1500,
"name": "Shipping Method 1"
}
],
"products": [
{
"name": "product-x",
"unitPrice": 100,
"quantity": 3,
"virtual": false,
"listingDate": "2020-09-28T08:17:52Z"
}
]
},
{
"extCustomerId": "ext-customer-2",
"amount": 2700,
"fee": 27,
"shippingMethods": [
{
"country": "EN",
"price": 2000,
"name": "Shipping Method 2"
}
],
"products": [
{
"name": "product-y",
"unitPrice": 700,
"quantity": 1,
"virtual": false,
"listingDate": "2018-02-28T09:28:52Z"
}
]
}
]
...
extCustomerId
z sekcji shoppingCarts
i buyer
różnią się i nie są tym samym bytem. W sekcji shoppingCarts
, parametr ten określa submerchanta uczęstniczącego w transakcji. W sekcji buyer
identyfikuje płatnika.
Suma parametrów price
i iloczynu parametrów unitPrice
i quantity
musi być równa wartości parametru amount
w zakresie submerchanta.
Suma wszystkich parametrów amount
w zakresie żądania musi być równa wartości parametru totalAmount
.
Do żądania musisz dodać sekcję buyer
rozszerzoną o parametr extCustomerId
, który jest identyfikatorem submerchanta nadanym przez marketplace:
...
"buyer": {
"email": "john.doe@email.com",
"phone": "(012)1234567",
"firstName": "John",
"lastName": "Doe",
"language": "pl",
"extCustomerId": "john-doe-12345"
},
...
Jeżeli korzystasz z rozwiązania white label, musisz dodać do żądania sekcję payMethods
, w której zawarta będzie wybrana przez kupującego metoda płatności.
...
"currencyCode": "PLN",
"totalAmount": 5000,
...
"payMethods": {
"payMethod": {
"type": "PBL",
"value": "m",
"amount": 5000
}
}
...
Szczegóły parametrów, znajdziesz w sekcji Create an Order w naszej referencji API.
Przykłady zamówienia marketplace
- Standardowe
- white label
Poniżej znajdziesz przykład żądania zamówienia marketplace, w którym klient kupuje wiele produktów od trzech submerchantów w ramach jednej transakcji.
curl -v -X POST https://secure.payu.com/api/v2_1/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <AUTH_TOKEN>" \
-d '{
"merchantPosId":"341009",
"customerIp": "127.0.0.1",
"continueUrl": "http://your.eshop.com/continue",
"notifyUrl": "https://your.eshop.com/notify",
"currencyCode": "PLN",
"totalAmount": 5000,
"extOrderId": "marketplace-order-xyz-123",
"description": "order XYZ-123",
"additionalDescription": "additional description",
"buyer": {
"email": "john.doe@email.com",
"phone": "(012)1234567",
"firstName": "John",
"lastName": "Doe",
"language": "pl",
"extCustomerId": "john-doe-12345"
},
"shoppingCarts": [
{
"extCustomerId": "marketplace-submerchant-1",
"amount": 200,
"fee": 20,
"products": [
{
"name": "product A",
"quantity": 2,
"unitPrice": 100,
"virtual": false,
"listingDate": "2018-01-28T07:17:52Z"
}
]
},
{
"extCustomerId": "marketplace-submerchant-2",
"amount": 1300,
"products": [
{
"name": "product B",
"quantity": 2,
"unitPrice": 200,
"virtual": false,
"listingDate": "2021-02-09T12:17:52Z"
},
{
"name": "product C",
"quantity": 3,
"unitPrice": 300,
"virtual": false,
"listingDate": "2017-09-15T08:15:52Z"
}
]
},
{
"extCustomerId": "marketplace-submerchant-3",
"amount": 3500,
"fee":350,
"products": [
{
"name": "product D",
"quantity": 1,
"unitPrice": 3500,
"virtual": false,
"listingDate": "2020-09-28T08:17:52Z"
}
]
}
]
}'
Gdy zamówienie zostanie pomyślnie uwierzytelnione, środki mogą zostać przydzielone właściwym odbiorcom. W powyższym przykładzie podział wygląda następująco:
- marketplace-submerchant-1: +1.80 PLN
- marketplace-submerchant-2: +13.00 PLN
- marketplace-submerchant-3: +31.50 PLN
- marketplace fee: +3.70 PLN
Poniżej znajduje się przykład zamówienia white label z sekcją payMethods
, z wybraną metodą płatności.
curl -v -X POST https://secure.payu.com/api/v2_1/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <AUTH_TOKEN>" \
-d '{
"merchantPosId":"341009",
"customerIp": "127.0.0.1",
"continueUrl": "http://your.eshop.com/continue",
"notifyUrl": "https://your.eshop.com/notify",
"currencyCode": "PLN",
"totalAmount": 5000,
"extOrderId": "marketplace-order-xyz-123",
"description": "order XYZ-123",
"additionalDescription": "additional description",
"buyer": {
"email": "john.doe@email.com",
"phone": "(012)1234567",
"firstName": "John",
"lastName": "Doe",
"language": "pl",
"extCustomerId": "john-doe-12345"
},
"shoppingCarts": [
{
"extCustomerId": "marketplace-submerchant-1",
"amount": 200,
"fee": 20,
"products": [
{
"name": "product A",
"quantity": 2,
"unitPrice": 100,
"virtual": false,
"listingDate": "2020-09-28T08:17:52Z"
}
]
},
{
"extCustomerId": "marketplace-submerchant-2",
"amount": 1300,
"products": [
{
"name": "product B",
"quantity": 2,
"unitPrice": 200,
"virtual": false,
"listingDate": "2018-09-28T08:17:52Z"
},
{
"name": "product C",
"quantity": 3,
"unitPrice": 300,
"virtual": false,
"listingDate": "2019-09-04T08:19:30Z"
}
]
},
{
"extCustomerId": "marketplace-submerchant-3",
"amount": 3500,
"fee":350,
"products": [
{
"name": "product D",
"quantity": 1,
"unitPrice": 3500,
"virtual": false,
"listingDate": "2020-09-28T08:17:52Z"
}
]
}
],
"payMethods": {
"payMethod":{
"type":"PBL",
"value":"m",
"amount":5000
}
}
}'
Szczegóły parametrów, znajdziesz w sekcji Create an Order w naszej referencji API.
Dodatkowe kody błedów dla marketplace
Poniżej znajdują się kody błędów dla zamówień specyficznych dla marketplace, więcej kodów błędów znajdziesz w sekcji Kody statusów.
Kod statusu | Kod | CodeLiteral | Opis |
---|---|---|---|
DATA_NOT_FOUND | DATA_NOT_FOUND | 9999 | Sprzedający nie istnieje w systemie PayU. Sprawdź czy użyłeś poprawnego parametru extCustomerId w sekcji shoppingCarts . |
Przykład powiadomienia dla zakończonej transakcji marketplace
Po złożeniu zamówienia otrzymasz powiadomienie o jego statusie. Więcej informacji znajdziesz w sekcji Powiadomienia.
{
"order": {
"orderId": "V6V7HHL1H9230518GUEST000P01",
"extOrderId": "Marketplace Standard Order",
"orderCreateDate": "2023-05-18T16:04:35.660+02:00",
"notifyUrl": "https://notifyurl.com",
"customerIp": "127.0.0.1",
"merchantPosId": "199022",
"description": "Marketplace Standard Order",
"currencyCode": "PLN",
"totalAmount": "5000",
"buyer": {
"customerId": "guest",
"email": "john.doe@email.com",
"phone": "654111654",
"firstName": "John",
"lastName": "Doe"
},
"payMethod": {
"amount": "5000",
"type": "PBL"
},
"status": "COMPLETED",
"shoppingCarts": [
{
"extCustomerId": "customer1",
"amount": "5000",
"fee": "1000",
"shippingMethods": [
{
"country": "PL",
"price": "0",
"name": "Shipping Method 1"
}
],
"products": [
{
"name": "product-x",
"unitPrice": "5000",
"quantity": "1"
}
]
}
]
},
"localReceiptDateTime": "2023-05-18T16:04:47.102+02:00",
"properties": [
{
"name": "PAYMENT_ID",
"value": "5007331705"
}
]
}
Pobieranie salda submerchanta
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.
Saldo submerchanta możesz pobrać wysyłając żądanie HTTP GET na endpoint /api/v2_1/customers/ext/<EXT_CUSTOMER_ID>/balances
, określająć walutę salda w parametrze currencyCode
.
curl -v -X GET https://secure.payu.com/api/v2_1/customers/ext/<EXT_CUSTOMER_ID>/balances?currencyCode=PLN \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <AUTH_TOKEN>"
EXT_CUSTOMER_ID
jest identyfikatorem submerchanta.
Szczegółowy parametrów znajdziesz w sekcji Retrieve Seller Balance w naszej referencji API.
{
"balance": {
"availableAmount": "5494",
"totalAmount": "5500"
},
"status": {
"statusCode": "SUCCESS"
}
}
Wypłacanie środków
Tworzenie wypłaty dla marketplace opiera się na standardowym sposobie tworzenia wypłat za pomocą REST API. Żądanie należy jednak rozszerzyć o odpowiednie parametry.
Ponieważ parametr extPayoutId
musi być unikalny w zakresie danego sklepu, po napotkaniu błędu musisz użyć dla niego innej wartości.
Możliwe jest wypłacanie środków na konta sprzedawców marketplace w walucie innej niż waluta sklepu. Więcej informacji znajdziesz na stronie wypłaty wielowalutowe.
Standardowe żądanie wypłaty powinno zostać rozszerzone o sekcję account
zawierającą parametr extCustomerId
.
curl -X POST https://secure.payu.com/api/v2_1/payouts \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <AUTH_TOKEN>" \
-d '{
"shopId":"shop-id",
"payout": {
"amount": "1000",
"currencyCode": "PLN",
"description": "Some payout",
"extPayoutId": "my_payout_id_123"
},
"account": {
"extCustomerId": "ext-customer-id-1"
}
}'
Aby wykonać wypłatę dla marketplace na środowisku sandbox musisz użyć parametru extCustomerId
ustawionego na MARKETPLACE_K2_FEE.
Szczegóły parametrów znajdziesz w sekcji Create a Payout w naszej referencji API.
{
"payout": {
"payoutId": "b3e4fc98c6894239864a9d6941f0fe76",
"extPayoutId": "PAYOUT23423423423",
"extCustomerId": "12345678",
"status": "PENDING"
},
"status": {
"statusCode": "SUCCESS"
}
}
Dodatkowe kody błędów dla wypłat
Poniżej znajdują się kody błędów dla żądań wypłat specyficznych dla marketplace, więcej kodów błędów dla wypłat znajdziesz na stronie przeznaczonej wypłatom.
Kod statusu | CodeLiteral | Kod | Opis |
---|---|---|---|
ERROR_VALUE_INVALID | AMOUNT_TO_BIG | 9103 | Zbyt duża kwota wypłaty. |
BUSINESS_ERROR | MARKETPLACE_CUSTOMER_IS_NOT_ACTIVE | 9104 | Sprzedawca jest nieaktywny. |
BUSINESS_ERROR | MARKETPLACE_CUSTOMER_IS_LOCKED | 9106 | Sprzedawca jest zablokowany. |
ERROR_VALUE_INVALID | MARKETPLACE_CUSTOMER_NOT_VERIFIED | 9132 | Sprzedający nie został jeszcze zweryfikowany przez PayU. |
ERROR_VALUE_INVALID | PROVIDING_BANK_ACCOUNT_IS_FORBIDDEN | 9133 | Podanie numeru konta do wypłaty jest zabronione. |
DATA_NOT_FOUND | CUSTOMER_NOT_FOUND | 9999 | Sprzedający nie istnieje w systemie PayU. |