Marketplace
Program Partnerski to forma współpracy z firmami oferującymi różnorodne usługi, takie jak wdrożenia rozwiązań e-commerce u swoich klientów czy tworzenie własnych rozwiązań marketplace. W ramach programu Partner poleca usługi Tpay i zarabia określony procent od każdej faktury poleconego przez siebie klienta.
Aby korzystać z Marketplace Tpay, musisz być w Programie Partnerskim Tpay. Jeśli nie masz jeszcze statusu partnera – dowiedz się, jak dołączyć do Programu.
Instrukcję uruchamiania i obsługi płatności marketplace Tpay w Panelu Partnera znajdziesz tutaj.
Aby rozpocząć przyjmowanie płatności w modelu marketplace, musisz podpisać odpowiednią umowę. Skontaktuj się z Twoim opiekunem w Programie Partnerskim, który przeprowadzi Cię przez ten proces.
Autoryzacja
Jako Partner z poziomu swojego Panelu Partnera w zakładce API > Partner API możesz wygenerować dostępy do rejestracji sprzedawców po API.
Zakładka pozwoli Ci na wygenerowanie dostępów do komunikacji po API, pozwalające na dostęp do metod accounts
i marketplace
.
Aby wygenerować klucze dostępu do API, należy kliknąć przycisk Dodaj nowy klucz. Zostaną wygenerowane:
- Client ID.
- Secret.
W celu autoryzacji w API sprawdź instrukcję Pierwsze kroki > Autoryzacja
Transakcja
Po uruchomieniu funkcjonalności marketplace dla Twojego konta przygotuj dane do utworzenia transakcji:
- Identyfikatory ID sprzedawców.
- Identyfikator ID dodanego wcześniej POS.
Identyfikatory danych sprzedawców uzyskasz za pomocą metody listującej konta sprzedawców przypisanych do Twojego marketplace GET /accounts
. Natomiast identyfikator POS-a, na który chcesz założyć transakcję, znajdziesz za pomocą metody GET /accounts/pos
, która listuje POS-y Twojego marketplace.
Posiadając potrzebne identyfikatory, możesz wysłać żądanie metodą POST
na adres:
https://api.tpay.com/marketplace/v1/transaction
.
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/transaction
W zapytaniu określ następujące parametry:
currency | Waluta. |
description | Opis transakcji widoczny dla płatnika. |
hiddenDescription | Niestandardowa, unikalna wartość przypisana do transakcji, np. orderId. Ta wartość zostanie zwrócona w powiadomieniu webhook po pomyślnej płatności. |
languageCode | Język wyświetlania strony płatności i powiadomień e-mail. |
pos.id | Punkt sprzedaży – musi to być aktywny, zweryfikowany POS dodany do konta partnera. Wartość jest reprezentowana przez ULID zakodowany do formatu base32. Aby sprawdzić identyfikator POS, wywołaj punkt końcowy GET /accounts/pos. |
billingAddress.email | Adres e-mail płatnika. |
billingAddress.name | Imię i nazwisko płatnika. |
childTransactions[].amount | Wartość w groszach, np. 123,45 PLN, powinna być przekazana jako liczba całkowita: 12345. Suma transakcji podrzędnych musi być równa całkowitej wartości transakcji. Wymagana jest co najmniej jedna transakcja podrzędna. |
childTransactions[].description | Opis transakcji. |
childTransactions[].merchant.id | Jeden z identyfikatorów sprzedawców biorących udział w głównej transakcji, reprezentowany przez ULID zakodowany w formacie base32. |
Podstawowe body żądania powinno wyglądać następująco:
{ "currency": "PLN", "description": "Example description", "hiddenDescription": "Example hidden description", "languageCode": "PL", "pos": { "id": "01G6WAS5MNGQ2X728AW53D8JPR" }, "billingAddress": { "email": "[email protected]", "name": "Name" }, "childTransactions": [ { "amount": 1500, "description": "Item no1", "merchant": { "id": "01G6WAPZFNNX4CXBPKQH5MYD4R" } }, { "amount": 4000, "description": "Item no2", "merchant": { "id": "01GGA49YQ9NGN0YQV0HW1VHDV3" } } ] }
Po wysłaniu żądania otrzymasz w odpowiedzi schemat TransactionCreated
.
Najważniejsze parametry odpowiedzi:
transactionId | Identyfikator transakcji. |
title | Tytuł transakcji. |
paymentUrl | Adres URL, na który możesz przekierować płatnika. |
Po poprawnym przetworzeniu żądania, system wysyła na adres e-mail płatnika wiadomość o założeniu nowej transakcji.
Przekieruj płatnika na panel transakcyjny
Przekieruj płatnika na URL zawarty w odpowiedzi w polu paymentUrl
.
Następnie płatnik na panelu transakcyjnym wybiera formę, w jakiej chce opłacić transakcję, i ją realizuje.
Autoryzacja płatności
W niektórych formach płatności występują dodatkowe autoryzacje, które płatnik musi zatwierdzić lub zrealizować, takie jak:
- Autoryzacja kodu BLIK
- Autoryzacja 3D Secure
- Autoryzacja Visa Mobile
Więcej informacji znajdziesz w dokumentacji poszczególnych metod płatności.
Płatnik zostanie przekierowany na stronę sukcesu lub porażki
Gdy płatność zostanie zakończona, płatnik zostanie przekierowany na stronę sukcesu (success page) lub stronę porażki (error page) w zależności od tego, czy transakcja się udała.
Oczekuj notyfikacji o udanej transakcji
Płatność w naszym systemie odbywa się w pełni procesem asynchronicznym.
Asynchroniczność oznacza, że proces płatności nie jest wykonywany natychmiastowo ani w znanym z góry okresie. Mimo że większość metod płatności wystosowuje powiadomienia w ciągu kilku-kilkunastu minut po założeniu transakcji, status transakcji może zmienić się w każdej chwili do upływu miesiąca od założenia transakcji.
Gdy status transakcji zmieni się na opłaconą, poinformujemy Twój system o udanej płatności za pomocą notyfikacji. Więcej informacji o webhookach transakcji marketplace znajdziesz tutaj.
Transakcja on-site
W niektórych metodach płatności istnieje możliwość integracji on-site. W celu opłacenia transakcji on-site wykorzystaj endpoint tworzenia transakcji, a następnie, zamiast przekierować płatnika na panel transakcyjny, posłuż się parametrem transactionId
wysyłając żądanie POST
na adres:
https://api.tpay.com/marketplace/v1/transaction/{transactionId}/pay
Umieść {transactionId}
w adresie URL np.:
https://api.tpay.com/marketplace/v1/transaction/01GENKAM5WKYYDJQ929P7T1MXN/pay
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/transactions/{transactionId}/pay
W zapytaniu możesz określić następujące parametry:
blikPaymentData | Dane płatności BLIK. |
blikPaymentData.blikToken | Token BLIK. |
blikPaymentData.aliases | Alias BLIK. |
cardPaymentData | Dane płatności kartowej. |
cardPaymentData.card | Zaszyfrowane dane karty. |
cardPaymentData.token | Token karty. |
applePayPaymentData | Token płatniczy Apple Pay. |
W przypadku poprawnej odpowiedzi możesz uzyskać dane dodatkowe, np. dla kart płatniczych może być to link do 3DS, na który przekierujesz płatnika.
Poprawny rezultat nie gwarantuje właściwej realizacji transakcji: poczekaj na asynchroniczne powiadomienie otrzymane od Tpay – to ostateczne potwierdzenie płatności.
Transakcja zawierająca opis produktów
Opcjonalnie, razem z transakcją możesz przekazać krótką listę produktów z koszyka klienta, by ułatwić odróżnienie transakcji podczas zwrotu w Twojej implementacji.
Zawartość koszyka jest przyjmowana jedynie w celu pomocy w odróżnieniu transakcji i nie powinna być używana jako źródło prawdy w innych procesach Twojej implementacji.
Lista produktów powinna być przyporządkowana do dostarczającego je sprzedawcy i przekazana w kluczu products
transakcji podrzędnej.
childTransactions[].products[].name | (optional) Nazwa produktu w Twoim marketplace. |
childTransactions[].products[].externalId | Identyfikator produktu w Twoim marketplace; Nie jest unikalny w systemie Tpay, nawet w obrębie jednej transakcji, i nie podlega porównaniu z poprzednimi danymi. |
childTransactions[].products[].quantity | Ilość produktu sprzedana po cenie określonej w unitPrice . |
childTransactions[].products[].unitPrice | Cena jednostkowa tej grupy produktów. |
Suma wpisana jako wartość transakcji podrzędnej nie zostanie sprawdzona z sumą cen produktów. Jest to celowy zabieg w celu uelastycznienia implementacji po stronie marketplace w obszarze zastosowanego zaokrąglania, opłat i używania cen netto/brutto.
Jeśli wymaga tego Twoja implementacja, część transakcji podrzędnych może nie używać produktów – jeśli używasz ich tylko w niektórych transakcjach, prześlij nam wtedy pustą tablicę.
Podstawowe body żądania z listą produktów powinno wyglądać następująco:
{ "currency": "PLN", "description": "Example transaction with products", "hiddenDescription": "example_hidden_description", "languageCode": "PL", "pos": { "id": "01G6WAS5MNGQ2X728AW53D8JPR" }, "billingAddress": { "email": "[email protected]", "name": "Name" }, "childTransactions": [ { "amount": 1500, "description": "Item no1", "merchant": { "id": "01G6WAPZFNNX4CXBPKQH5MYD4R" }, "products": [ { "name": "Czereśnie (100g)", "externalId": "111.222.33.44", "quantity": 1.2, "unitPrice": 1250 } ] }, { "amount": 4000, "description": "Item no2", "merchant": { "id": "01GGA49YQ9NGN0YQV0HW1VHDV3" }, "products": [ { "name": "Zlew", "externalId": "Your.identifier.s1Nk", "quantity": 1, "unitPrice": 4000 } ] } ] }
Powiadomienia
Podczas tworzenia transakcji możesz przekazać w parametrze transactionCallbacks
, różne typy powiadomień:
1 | Adres URL przekierowania płatnika w przypadku sukcesu. |
2 | Adres URL przekierowania płatnika w przypadku porażki. |
3 | Adres URL powiadomienia POST po pomyślnej płatności. |
4 | E-mail z powiadomieniem dla sprzedawcy. |
Zwroty
Zwrot możesz zlecić, przesyłając listę kwot per konto sprzedawcy, listę produktów zwracanych od konkretnego sprzedawcy (przesyłając identyfikator sprzedawcy, analogicznie do danych użytych przy tworzeniu transakcji) przesyłając listę kwot lub listę produktów zwracanych z konkretnej transakcji podrzędnej, przesyłając jej identyfikator, lub bez danych – zwrócisz wówczas całą transakcję.
Podczas transakcji wykonujemy odpowiednie walidacje, np. czy nie przekroczono maksymalnej kwoty zwrotu, która wynosi 100% wpłaconej kwoty, w całości zwrotu, czy też w podziale na poszczególnych sprzedawców.
Obciążenie sald sprzedawców, dla których zlecany jest zwrot, działa tak samo, jak w przypadku pojedynczych transakcji.
Kwotę potrzebną na pokrycie zwrotu oraz prowizję za operację pobieramy z salda sprzedawcy. Jeśli sprzedawca nie ma wystarczających środków na saldzie, odrzucimy zlecenie zwrotu.
Realizacja zwrotu całkowitego
Aby zrealizować zwrot całkowity, wyślij żądanie POST
na endpoint:
https://api.tpay.com/marketplace/v1/transaction/{transactionId}/refund
Zastąp {transactionId}
identyfikatorem transakcji, którą chcesz zwrócić.
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/transaction/{transactionId}/refund
Przykładowy URL: https://api.tpay.com/marketplace/v1/transaction/01GENKAM5WKYYDJQ929P7T1MXN/refund
Body żądania powinno być pustym obiektem JSON:
Realizacja zwrotu częściowego poprzez podanie kwoty
Aby zrealizować zwrot częściowy, wyślij żądanie POST
na endpoint:
https://api.tpay.com/marketplace/v1/transaction/{transactionId}/refund
Zastąp {transactionId}
identyfikatorem transakcji, którą chcesz zwrócić.
https://api.tpay.com/marketplace/v1/transaction/01GENKAM5WKYYDJQ929P7T1MXN/refund
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/transaction/{transactionId}/refund
W zapytaniu określ następujące parametry:
childTransactions[].amount | Wartość w groszach, np. 123,45 PLN, powinna być przekazana jako liczba całkowita: 12345. |
childTransactions[].merchant.id | (jeden z dwóch parametrów: merchantId albo id jest wymagany) Jeden z identyfikatorów sprzedawców biorących udział w głównej transakcji, reprezentowany przez ULID zakodowany w formacie base32. |
childTransactions[].id | (jeden z dwóch parametrów: merchantId albo id jest wymagany) Jeden z identyfikatorów transakcji podrzędnych należących do głównej transakcji, reprezentowany przez ULID zakodowany w formacie base32. |
Podstawowe body żądania powinno wyglądać jak jeden z poniższych przykładów:
Realizacja zwrotu częściowego poprzez podanie listy produktów
Aby zrealizować zwrot częściowy, wyślij żądanie POST
na endpoint:
https://api.tpay.com/marketplace/v1/transaction/{transactionId}/refund
Zastąp {transactionId}
identyfikatorem transakcji, którą chcesz zwrócić:
https://api.tpay.com/marketplace/v1/transaction/01GENKAM5WKYYDJQ929P7T1MXN/refund
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/transaction/{transactionId}/refund
W zapytaniu określ następujące parametry:
childTransactions[].products[].name | (optional) Nazwa zwracanego produktu. |
childTransactions[].products[].externalId | (required) externalId produktu, taki sam jak w oryginalnej transakcji. |
childTransactions[].products[].quantity | (required) zwracana ilość produktu, nie większa niż w oryginalnej transakcji. |
childTransactions[].products[].unitPrice | (required) wartość jednostki zwracanego produktu. |
childTransactions[].merchant.id | (jeden z dwóch parametrów: merchantId albo id jest wymagany) Jeden z identyfikatorów sprzedawców biorących udział w głównej transakcji, reprezentowany przez ULID zakodowany w formacie base32. |
childTransactions[].id | (jeden z dwóch parametrów: merchantId albo id jest wymagany) Jeden z identyfikatorów transakcji podrzędnych należących do głównej transakcji, reprezentowany przez ULID zakodowany w formacie base32. |
Podstawowe body żądania powinno wyglądać jak jeden z poniższych przykładów:
{ "childTransactions": [ { "merchantId": "01G6QRHEBPFAECEWRWVEEPM9WY", "products": [ { "externalId": "111.222.33.44", "quantity": 1.0, "unitPrice": 1250 }, { "externalId": "111.222.33.44", "quantity": 0.2, "unitPrice": 500 } ] }, { "merchantId": "01G6WAPZFNNX4CXBPKQH5MYD4R", "products": [ { "externalId": "Your.identifier.s1Nk", "quantity": 1, "unitPrice": 4000 } ] } ] }
{ "childTransactions": [ { "id": "01JENG92HA094GVX7QT60EP0K9", "products": [ { "externalId": "111.222.33.44", "quantity": 1.0, "unitPrice": 1250 }, { "externalId": "111.222.33.44", "quantity": 0.2, "unitPrice": 500 } ] }, { "id": "01JENG98VYHM1YF0SBDCM66AH9", "products": [ { "externalId": "Your.identifier.s1Nk", "quantity": 1, "unitPrice": 4000 } ] } ] }
Lista dostępnych metod płatniczych
Dostępne metody płatności zależą od ustawień sprzedawców przypisanych do Twojego marketplace. Dostępne są tylko te metody płatności, które są wspólne dla wszystkich sprzedawców w ramach danej transakcji.
Możesz pobrać listę kanałów, które są włączone dla wszystkich merchantów, aby wyświetlić je podczas podsumowania zakupów.
Aby pobrać listę metod płatniczych dla marketplace, wyślij żadanie GET
na endpoint:
https://api.tpay.com/marketplace/v1/bank-groups
W zapytaniu określ następujące parametry:
merchantId[] | Identyfikator sprzedawcy. Aby dodać kolejnych sprzedawców, użyj parametru ponownie. |
Przykład:
https://api.tpay.com/marketplace/v1/bank-groups?merchantId[]=01G6WAPZFNNX4CXBPKQH5MYD4R&merchantId[]=01G6QRHEBPFAECEWRWVEEPM9WY
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/bank-groups
Metoda wymaga podania identyfikatorów wszystkich sprzedawców, którzy biorą udział w opłacanym koszyku, w jednym wywołaniu, ponieważ ogranicza zbiór zwracanych metod do ich części wspólnej. Przykładowo, gdy sprzedawca 1 nie ma uruchomionych płatności ratalnych, to nie można wybrać tej metody, mimo że pozostali sprzedawcy mają ją włączoną.
Anulowanie transakcji
Transakcję marketplace możesz anulować pod warunkiem, że płatnik nie dokonał już płatności.
Aby anulować transakcję marketplace, wyślij żądanie POST
na endpoint:
https://api.tpay.com/marketplace/v1/transaction/{transactionId}/cancel
Zastąp {transactionId}
identyfikatorem transakcji, którą chcesz zwrócić:
https://api.tpay.com/marketplace/v1/transaction/01GENKAM5WKYYDJQ929P7T1MXN/cancel
Sprawdź szczegóły w dokumentacji API Reference: POST /marketplace/v1/transaction/{transactionId}/cancel
Poprawna odpowiedź na żądanie anulowania gwarantuje uniemożliwienie jej opłacenia.
W przypadku gdy dokonałeś anulowania transakcji w czasie trwającego procesu opłacania przez płatnika z wykorzystaniem metody z asynchronicznym powiadomieniem o realizacji – anulujemy płatność i zwrócimy pieniądze na konto płatnika.