Webhooky
Webhooky jsou způsob, jak získávat upozornění z Retina o různých událostech v reálném čase. Místo periodického dotazování API si můžete vytvořit webhook a Retino vám bude automaticky zasílat informace o změnách na vámi určenou URL adresu.
Poznámka: Webhooky jsou prémiová funkcionalita, která je součástí rozšíření "API & Webhooky". Pokud máte toto rozšíření aktivní, naleznete nastavení webhooků v Nastavení > API > Webhooky.
Pro informace o webhooku shipping.ordered
se podívejte na článek Webhook o objednání dopravy.
Vytvoření webhooku
- Připravte na vašem serveru URL endpoint pro příjem webhooků (např.
vas-eshop.cz/webhook-retino
) - Přejděte do Nastavení > API > Webhooky v Retinu
- Klikněte na "Vytvořit webhook"
- Zadejte URL adresu vašeho endpointu
- Vyberte události, které chcete odebírat
- Uložte nastavení
Webhooky se nastavují na úrovni celého účtu a nejsou omezeny na jednotlivé uživatele. Po vytvoření webhooku můžete odeslat testovací událost z detailu webhooku pro ověření správné konfigurace.
Zabezpečení
Každý webhook obsahuje v hlavičce požadavku autentifikační token pro ověření, že požadavek skutečně pochází z Retina:
X-Retino-Secret: <token>
Tento token naleznete v nastavení jednotlivých webhooků. Při příjmu webhooků byste měli vždy ověřit, že hlavička obsahuje správný token, který odpovídá vašemu webhooku.
Obnovení tajného tokenu
POZOR! Pokud obnovíte token webhooku, váš server nebude schopen přijímat webhooky, dokud nový token neimplementujete na vaší straně.
HTTPS
Důrazně doporučujeme, aby komunikace probíhala přes šifrovaný protokol HTTPS. Pokud váš webhook používá nezabezpečený protokol HTTP, Retino vás na toto riziko upozorní v nastavení.
Typy událostí pro případy
Webhook může být navázán na několik typů událostí zároveň. Každá z událostí odesílá informace o případu, produktech, dopravě a přidružené objednávce.
Událost | Popis |
---|---|
ticket.created |
Vytvoření nového případu |
ticket.updated |
Jakákoliv úprava případu |
ticket.product.created |
Vytvoření nového produktu v případu |
ticket.product.updated |
Úprava produktu v případu |
ticket.shipping.created |
Vytvoření nové dopravy v případu |
ticket.shipping.updated |
Úprava dopravy nebo aktualizace stavu |
ticket.refund.created |
Vytvoření refundace |
ticket.refund.updated |
Úprava refundace |
Vzorová data pro jednotlivé události
ticket.created / ticket.updated
Odesláno při vytvoření nebo změně případu.
{ "event_type": "ticket.created", "created_at": "2020-09-24T10:28:10.010Z", "ticket": { "id": "8fad1c8d-3740-4aab-a224-c0ef379ea216", "code": "20210001", "state": "4531636a-108f-4ae3-abff-367901418600", "tags": [ "3fa85f64-5717-4562-b3fc-2c963f66afa6" ], "type": "44c88eec-b995-4c84-b269-2ff06c8fe5d5", "owner": "e342f794-7b11-4acc-a46e-784a74a30af2", "bound_order": null, "customer": { "name": "Vladimír Remek", "email": "support@retino.com", "phone": "987654321" }, "currency": "CZK", "language": "cs", "country": "CZ", "order_id": "234567", "order_date": "2020-09-09T00:00:00.000Z", "customer_rating": null, "customer_rating_comment": null, "custom_fields": { "resolve_by": "2020-10-08" }, "verification_state": "VERIFIED_AUTOMATICALLY", "is_unread": false, "created_at": "2020-09-24T11:30:53.210107+02:00", "updated_at": "2020-09-24T11:30:53.525472+02:00", "closed_at": null } }
ticket.product.created / ticket.product.updated
Odesláno při přidání nebo úpravě produktu v případu.
{ "event_type": "ticket.product.created", "created_at": "2020-09-24T10:28:10.010Z", "ticket_id": "8fad1c8d-3740-4aab-a224-c0ef379ea216", "product": { "id": "09c69980-299d-4d37-81d5-ed18c9565856", "bound_order_item": null, "price": { "with_vat": "990000000.0000", "without_vat": null, "vat": null }, "files": [], "name": "Apollo 11", "manufacturer": "NASA", "category": "Rakety", "product_id": "#1", "variant": "XL", "ean": "", "serial": null, "amount": "1.0000", "custom_fields": { "1b8508b0-ba85-427c-b23c-ae739453b0cd": "74ea523e-ea95-44d4-85ff-758c485ff77d" } } }
ticket.shipping.created / ticket.shipping.updated
Odesláno při vytvoření nebo aktualizaci dopravy.
{ "event_type": "ticket.shipping.created", "created_at": "2020-09-24T10:28:10.010Z", "ticket_id": "8fad1c8d-3740-4aab-a224-c0ef379ea216", "shipping": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "vendor_id": "PPL", "shipping_type": "Parcel", "state": "WAITING_FOR_PICKUP", "trace_url": "http://example.com/tracking/123", "sender": { "name": "Vladimír Remek", "email": "support@retino.com", "phone": "987654321", "address": { "street": "Kosmonautů 10", "city": "Praha", "zip": "16000", "country": "CZ" } }, "recipient": { "name": "Váš e-shop", "email": "eshop@example.com", "phone": "123456789", "address": { "street": "Hlavní 123", "city": "Praha", "zip": "11000", "country": "CZ" } }, "created_at": "2020-09-24T10:28:10.010Z", "updated_at": "2020-09-24T10:28:10.010Z" } }
ticket.refund.created / ticket.refund.updated
Odesláno při vytvoření nebo aktualizaci refundace.
{ "event_type": "ticket.refund.created", "created_at": "2020-09-24T10:28:10.010Z", "ticket_id": "8fad1c8d-3740-4aab-a224-c0ef379ea216", "refund": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "amount": "990000000.0000", "currency": "CZK", "state": "WAITING_FOR_APPROVAL", "type": "BANK_ACCOUNT", "bank_account": { "account_number": "123456789/1010", "iban": "CZ1234567890123456789012", "bic": "GIBACZPX" }, "created_at": "2020-09-24T10:28:10.010Z", "updated_at": "2020-09-24T10:28:10.010Z" } }
Implementace příjmu webhooků
Pro příjem webhooků musíte na vašem serveru implementovat endpoint, který bude zpracovávat HTTP POST požadavky. Zde je jednoduchý příklad implementace v Node.js:
const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.json()); app.post('/webhook-retino', (req, res) => { // Kontrola tajného tokenu const token = req.headers['x-retino-secret']; if (token !== 'váš_tajný_token') { return res.status(403).send('Neplatný token'); } // Zpracování události const event = req.body; console.log(`Přijata událost: ${event.event_type}`); // Zde zpracujte data podle typu události switch (event.event_type) { case 'ticket.created': // Zpracování vytvoření případu console.log(`Vytvořen nový případ: ${event.ticket.code}`); break; case 'ticket.product.created': // Zpracování přidání produktu console.log(`Přidán produkt do případu: ${event.product.name}`); break; // další typy událostí... } // Odpověď serveru res.status(200).send('OK'); }); app.listen(3000, () => { console.log('Server pro příjem webhooků běží na portu 3000'); });
Osvědčené postupy
- Verifikace tokenu - Vždy ověřujte token v hlavičce X-Retino-Secret pro zajištění bezpečnosti
- Rychlá odpověď - Odpovídejte na webhook co nejrychleji (ideálně do 5 sekund) a složitější zpracování provádějte asynchronně
- Ošetření chyb - Implementujte robustní ošetření chyb, aby váš endpoint byl odolný vůči neplatným datům
- Logování - Zaznamenávejte přijaté webhooky pro pozdější analýzu a ladění
- Idempotence - Navrhněte zpracování webhooků tak, aby bylo idempotentní (opakované zpracování stejné události nezpůsobí problémy)
Testování webhooků
Pro testování webhooků můžete využít následující možnosti:
- Použít službu jako webhook.site nebo requestbin.com pro zachycení a inspekci webhook požadavků
- Využít lokální tunelování pomocí nástrojů jako ngrok pro testování webhooků na vašem lokálním vývojovém prostředí
- Odeslat testovací událost přímo z detailu webhooku v administraci Retina
Pro více informací o dalších možnostech integrace s Retinem navštivte dokumentaci Tickets API.