Tapaya
Prijímanie platieb v predajniSprievodca integráciouCloud Accept APIBeta

Cloud Accept API

Beta

Spúšťajte platby v predajni na spárovanom zariadení Tapaya zo svojho ECR alebo backendu POS.

Cloud Accept API umožňuje vašej elektronickej registračnej pokladnici (ECR) alebo backendu POS spustiť platbu na zariadení Tapaya cez cloud. Váš systém nikdy nekomunikuje so zariadením priamo: odošle požiadavku na platbu do Tapaya, Tapaya upozorní spárované zariadenie a zariadenie zobrazí zákazníkovi platobnú obrazovku. Informácie o priebehu k vám prichádzajú ako webhooky, prípadne si ich zisťujete dopytovaním (pollingom).

Výber spôsobu párovania zariadení

Každé zariadenie, na ktoré posielate platby, potrebuje externalDeviceId: názov, pod ktorým ho pozná váš systém, napríklad till-01. Priradiť ho môžete jedným z dvoch spôsobov:

Skôr než začnete

  1. Získajte svoj Server Secret Token na stránke API Keys. Nižšie ho vymeníte za prístupový token obmedzený na obchodníka (pozrite autentifikácia v Platform API).
  2. Zaregistrujte obchodníka a uchovajte si jeho merchantToken. Pozrite Registrácia nového obchodníka.
  3. Pripravte každé zariadenie s aplikáciou Tapaya prihlásenou za daného obchodníka, aby ho bolo možné spárovať a mohlo prijímať požiadavky.

Jeden token, jeden obchodník

Každé volanie Cloud Accept API je obmedzené práve na jedného obchodníka. Ak chcete obsluhovať viacerých obchodníkov, získajte výmenou samostatný prístupový token pre každého z nich.

Spárovanie zariadenia

Párovanie priradí zariadeniu Tapaya externalDeviceId, takže ho môžete nájsť pri výpise zariadení a zacieliť naň pri spustení platby.

Priradenie z vašej aplikácie

Vaša aplikácia zavolá na zariadení funkciu Accept SDK, ktorá mu priradí externalDeviceId. Vo všetkých volaniach Cloud Accept API pre toto zariadenie používajte rovnaký identifikátor.

Naskenovanie QR kódu

Obchodník otvorí v Tapaya Platform postup párovania, ktorý zobrazí QR kód pre priraďované externalDeviceId. Obchodník ho naskenuje aplikáciou Tapaya pre obchodníkov na cieľovom zariadení a aplikácia párovanie dokončí.

Výmena za prístupový token

Vymeňte svoj Server Secret Token a merchantToken obchodníka za prístupový token pomocou POST /ecr/auth. merchantToken sa odosiela len tu; všetky ďalšie volania odosielajú iba Authorization: Bearer <accessToken>.

curl -X 'POST' 'https://api.tapaya.com/ecr/auth' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer REPLACE_ME' \
-d '{
        "merchantToken": "unique_merchant_id_from_your_db"
    }'
200 OK
{
    "accessToken": "...",
    "tokenType": "Bearer",
    "expiresAt": "2026-01-13T16:30:59Z"
}
KódPopis
401Neplatný API token alebo API token s uplynutou platnosťou.
403Prístup k obchodníkovi nie je povolený.

Obnovte token pred expiresAt. Zavolajte POST /ecr/auth/refresh s aktuálnym, stále platným accessToken v hlavičke Authorization. Endpoint vráti rovnaké telo s novým tokenom; uložte si ho a odvtedy používajte už len ten nový.

curl -X 'POST' 'https://api.tapaya.com/ecr/auth/refresh' \
-H 'Authorization: Bearer ACCESS_TOKEN'
KódPopis
401Prístupový token je neplatný, vypršal alebo bol zneplatnený. Získajte nový výmenou cez POST /ecr/auth.
403K obchodníkovi už nemáte prístup. Nový token sa nevydá.

Vyhľadanie pripraveného zariadenia

Zariadenia obchodníka vypíšte pomocou GET /ecr/devices. Pridaním ?connected=true vynecháte odpojené zariadenia; jedno konkrétne zariadenie načítate pomocou GET /ecr/devices/{externalDeviceId}.

curl 'https://api.tapaya.com/ecr/devices/till-01' \
-H 'Authorization: Bearer ACCESS_TOKEN'
200 OK
{
    "externalDeviceId": "till-01",
    "name": "Front counter",
    "connected": true,
    "availability": "ready",
    "lastSeenAt": "2026-01-13T16:30:59Z",
    "updatedAt": "2026-01-13T16:30:59Z"
}

Platby posielajte len na zariadenie, ktorého availability je ready. Výpis je len momentálny snímok: dostupnosť sa znova overuje pri odoslaní, takže aj zariadenie v stave ready môže požiadavku odmietnuť. Pozrite Dostupnosť zariadenia.

Odoslanie požiadavky na platbu

Sumu odošlite na zariadenie pomocou POST /ecr/payment-requests. Tapaya požiadavku uloží a upozorní zariadenie, ktoré zobrazí platobnú obrazovku.

curl -X 'POST' 'https://api.tapaya.com/ecr/payment-requests' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Idempotency-Key: order-1042-attempt-1' \
-d '{
        "externalDeviceId": "till-01",
        "amount": 12500,
        "tipAmount": 500,
        "currency": "CZK"
    }'

Parametre:

PoleTypPovinnéPopis
externalDeviceIdstring✓Spárované zariadenie, ktoré má platbu zobraziť.
amountinteger✓Suma v najmenšej jednotke meny (12500 je 125,00 Kč).
tipAmountintegerPrepitné v najmenšej jednotke meny.
currencystring✓Kód meny podľa ISO 4217.
paymentTokenstringExistujúca platba, ku ktorej sa má požiadavka pripojiť.
202 Accepted
{
    "requestId": "...",
    "status": "pending",
    "paymentToken": null,
    "expiresAt": "2026-01-13T16:30:59Z"
}

202 nie je výsledok platby

202 Accepted znamená, že Tapaya požiadavku uložila. Neznamená to, že ju zariadenie zaznamenalo, ani že zákazník zaplatil. Čokoľvek, čo zlyhá neskôr, sa k vám dostane ako zmena stavu.

Zabezpečte bezpečné opakovanie požiadaviek. Hlavička Idempotency-Key je povinná. Opätovné použitie kľúča s rovnakým telom vráti pôvodnú požiadavku namiesto spustenia druhej platby; opätovné použitie s iným telom vráti 409 idempotency_conflict. Naviažte kľúč na predaj a pokus, napríklad order-1042-attempt-1.

Sledovanie výsledku

Sledujte požiadavku cez jej stavy pomocou webhookov, alebo pravidelne volajte GET /ecr/payment-requests/{requestId}. Keď požiadavka dosiahne stav payment_created, odpoveď obsahuje paymentToken a priebeh samotnej platby hlásia udalosti payment.updated.

Ak chcete prijímať webhooky, zaregistrujte svoj HTTPS endpoint pomocou POST /ecr/webhook-subscriptions, alebo pre obchodníka nastavte callback URL a typy udalostí v Tapaya Platform.

curl -X 'POST' 'https://api.tapaya.com/ecr/webhook-subscriptions' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-d '{
        "url": "https://integrator.example.com/webhooks/tapaya",
        "events": ["payment_request.updated", "payment.updated"]
    }'
201 Created
{
    "subscriptionId": "...",
    "url": "https://integrator.example.com/webhooks/tapaya",
    "events": ["payment_request.updated", "payment.updated"],
    "signingSecret": "..."
}

Uložte si signing secret

signingSecret sa vracia len pri vytvorení odberu. Bezpečne si ho uložte; budete ho potrebovať na overenie podpisu prichádzajúcich webhookov.

Odber patrí integrátorovi a obchodníkovi, nie prístupovému tokenu, takže pri obnovení tokenu zostáva zachovaný. Na každú udalosť odpovedzte kódom 2xx, hneď ako ju prijmete.

Pred uzavretím predaja overte výsledok

Webhooky sú oznámenia, nie doklad o platbe, a niektorý môže doraziť neskoro alebo nemusí doraziť vôbec. Nikdy neuzatvárajte predaj len na základe webhooku:

  • Keď webhook dorazí, overte konečný výsledok cez API, napríklad pomocou Načítanie podrobností platby.
  • Keď webhook nedorazí v časovom limite vhodnom pre váš pokladničný proces, najneskôr však do expiresAt požiadavky, zavolajte GET /ecr/payment-requests/{requestId}, aby ste zistili jej aktuálny stav, a potom overte platbu cez API, ako je uvedené vyššie.

Referencia

Endpointy

MetódaEndpointPopis
POST/ecr/authVymení váš API token a merchantToken za prístupový token.
POST/ecr/auth/refreshObnoví stále platný prístupový token.
GET/ecr/devicesVypíše zariadenia obchodníka. Voliteľný filter connected=true.
GET/ecr/devices/{externalDeviceId}Vráti jedno zariadenie a jeho aktuálnu dostupnosť.
POST/ecr/payment-requestsUloží požiadavku na platbu a upozorní zariadenie. Vyžaduje Idempotency-Key.
GET/ecr/payment-requests/{requestId}Vráti stav požiadavky, prípadný dôvod odmietnutia a paymentToken.
POST/ecr/webhook-subscriptionsZaregistruje HTTPS URL a typy udalostí. Signing secret (podpisový kľúč) vráti len raz.
GET/ecr/webhook-subscriptionsVypíše vaše odbery pre obchodníka, bez signing secretov.
DELETE/ecr/webhook-subscriptions/{subscriptionId}Odstráni odber.

Dostupnosť zariadenia

Oba endpointy pre zariadenia vracajú externalDeviceId, name, connected, availability, lastSeenAt a updatedAt.

HodnotaPopis
readyPripojené a schopné prijať a zobraziť požiadavku.
busySpracúva platbu alebo má aktívnu požiadavku.
unavailableOdpojené, bez platnej relácie alebo neschopné zobraziť platobnú obrazovku.

Stavy požiadavky

StavPopis
pendingUložená a čaká, kým ju zariadenie prijme.
acknowledgedZariadenie ju dostalo; platba ešte nemusí existovať.
payment_createdPlatba a jej paymentToken existujú. Ďalší priebeh sledujte na platbe.
rejectedZariadenie alebo Tapaya požiadavku odmietli.

Chyby

KódDôvodPopis
403 / 404Objekt nie je dostupnýNemáte oprávnenie alebo objekt neexistuje.
409device_busyZariadenie už má aktívnu požiadavku alebo platbu.
409device_unavailableZariadenie je pripojené, ale nie je pripravené.
409idempotency_conflictKľúč už bol použitý s iným telom.
503device_offlineZariadenie nie je pripojené.

Chyby validácie sumy a meny sa riadia rovnakými konvenciami ako zvyšok Platform API.

Udalosti webhookov

UdalosťOdosiela sa, keďObsah data
device.connectedZariadenie nadviaže nové aktívne spojenie.externalDeviceId, connected, availability, lastSeenAt
device.disconnectedSpojenie sa uzavrie alebo vyprší časový limit kontroly aktivity spojenia.externalDeviceId, connected, availability, lastSeenAt
device.availability_changedDostupnosť sa zmení medzi ready, busy a unavailable.externalDeviceId, availability, voliteľne reason
payment_request.updatedPožiadavka je uložená, potvrdená, odmietnutá, vyprší alebo k nej vznikne platba.requestId, externalDeviceId, status, paymentToken, reference, reason, expiresAt
payment.updatedZmení sa stav platby.paymentToken, requestId, externalDeviceId, status, reference, amount, currency, voliteľne receiptUrl

Každá udalosť prichádza ako HTTP POST v rovnakej obálke:

{
    "eventId": "...",
    "type": "payment_request.updated",
    "occurredAt": "2026-01-13T16:30:59Z",
    "data": {
        "requestId": "...",
        "externalDeviceId": "till-01",
        "status": "acknowledged",
        "paymentToken": null,
        "reference": "ORDER-1042",
        "reason": null,
        "expiresAt": "2026-01-13T16:30:59Z"
    }
}
Chýba vám niečo na tejto stránke?Navrhnite funkciu. Pripojíme túto stránku, aby tím videl súvislosti.