Ugrás a tartalomhoz
← API-referencia

Gyorsindítás

Három lépés viszi el a webshopot a semmitől a biztonságos rendelésig: ágyazd be a konfigurátort, ellenőrizd az ajánlatot a szervereden a kosár előtt, és fogadd az aláírt webhookot. A beágyazás elvégzi helyetted a webshop-oldali hívásokat; a te kódodnak csak a szerveroldal a dolga.

Alap URL https://cfg.cutoptim.com · Szerződés verziója v1 · OpenAPI 3.1 dokumentum

Korai hozzáférés: a kereskedői API elkészült, és sandbox webshopban kipróbálható; a webshop-platformok pluginjai még fejlesztés alatt állnak. A CutOptim nem szed be fizetést: a kosár, a pénztár és a fizetés a te webshopodban marad.

Az elérési utak, mezőnevek, hibakódok, fejlécnevek és kódpéldák angolul maradnak: ezek jelentik a szerződést.

1. A konfigurátor beágyazása

Add hozzá a szkriptet és az elemet a termékoldalhoz a publikus kulcsoddal (pk_live_…, vagy fejlesztés közben egy pk_test_… teszt kulccsal). Az oldal originjének szerepelnie kell a kulcs engedélyezett originjei között. A beágyazás ezután maga hívja a GET /cfg/v1/config/public, a POST /cfg/v1/preview, a POST /cfg/v1/quote és a POST /cfg/v1/order végpontot.

Amikor a vásárló rendel, a szolgáltatás eltárolja az aláírt rendelést, az elem pedig kiváltja a cutoptim:order böngészőeseményt a { orderId, order, idempotencyKey } adatokkal. Ezt az eseményt az oldalad számára szóló jelzésként kezeld, soha nem az ár bizonyítékaként.

<script type="module" src="https://cfg.cutoptim.com/embed/assets/cutoptim-configurator.js"></script>

<button data-cutoptim-open="#cut">…</button>
<cutoptim-configurator id="cut" mode="modal" key="pk_live_your_publishable_key" lang="hu">
</cutoptim-configurator>

<script>
  document.getElementById('cut').addEventListener('cutoptim:order', (e) => {
    // e.detail = { orderId, order, idempotencyKey } - send it to YOUR server, which verifies it
  });
</script>

2. Ellenőrzés a szervereden a kosár előtt

A szervered elküldi az ajánlattokent a titkos kulccsal a POST /cfg/v1/quote/verify végpontra. A válasz valid és redeemed; az elutasítás is 200-as válasz valid: false értékkel és egy reason mezővel. Ezután a GET /cfg/v1/orders/{id} hívással lekérdezi a böngésző által megnevezett rendelést, és összeveti a tervhasht, az ajánlathasht, a pénznemet és az összegeket az ellenőrzött tokennel. Csak ezután hozza létre a kosártételt az ellenőrzött áron.

curl -X POST https://cfg.cutoptim.com/cfg/v1/quote/verify \
  -H "Authorization: Bearer $CUTOPTIM_API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"quoteToken":"<order.quote.quoteToken>"}'
# {"valid":true,"redeemed":true,"claims":{…},"test":false}

curl https://cfg.cutoptim.com/cfg/v1/orders/<orderId> \
  -H "Authorization: Bearer $CUTOPTIM_API_SECRET"
# {"orderId":"…","status":"received","priced":true,"planHash":"…","quoteHash":"…","totals":{…}}

3. Az aláírt webhook fogadása

Tegyél közzé egy webhook végpontot a webshop konfigurációjában. Minden éles rendelés order.created eseményt küld, minden státuszváltozás order.status_changed eseményt. Olvasd be a nyers törzset, ellenőrizd a CutOptim-Signature fejlécet, majd tárold el a rendelést CutOptim-Event-Id értékenként egyszer. Az alábbi fogadó a változatlan referenciapélda.

// example-server.mjs - a webhook endpoint on node:http, to read and adapt.   CUTOPTIM_WEBHOOK_SIGNING=whsec_... node example-server.mjs
// (whsec_REPLACE_ME is a placeholder: the real secret comes from the CutOptim admin route.)
import { createServer } from 'node:http';
import { createWebhookReceiver } from './cutoptim-verify.mjs';

const secret = process.env.CUTOPTIM_WEBHOOK_SIGNING;
if (!secret) { console.error('set CUTOPTIM_WEBHOOK_SIGNING (whsec_REPLACE_ME is a placeholder)'); process.exit(1); }

const receive = createWebhookReceiver({
  secrets: [secret],
  async onEvent(event) {
    // event.type === 'order.created'; event.data.order is the signed order document. Store it in YOUR order table here,
    // keyed by event.data.orderId, in the same transaction that records the event id as seen.
    console.log('order.created', event.data.orderId);
  },
});

createServer(async (req, res) => {
  if (req.method !== 'POST') { res.writeHead(405).end(); return; }
  const chunks = []; let size = 0;
  for await (const c of req) { size += c.length; if (size > 2_000_000) { res.writeHead(413).end(); return; } chunks.push(c); }
  const out = await receive({ rawBody: Buffer.concat(chunks), headers: req.headers });   // the RAW bytes, not parsed JSON
  res.writeHead(out.status, { 'Content-Type': 'application/json' }).end(JSON.stringify({ result: out.reason }));
}).listen(Number(process.env.PORT ?? 8787));

Tovább

Kulcsok, teszt kulcsok és originek: Kulcsok és hitelesítés. A teljes fogadó, a PHP-változat és az újrapróbálkozási ütemezés: Webhookok. Lépésről lépésre a saját platformodhoz: Egyedi webshop vagy ERP.

Szándékosan nincs itt "kipróbálom" gomb: a titkos kulcs a szerveredre való, soha nem a böngészőbe. A demó webshop elejétől végéig megmutatja a beágyazást és a rendelés átadását.

Jogi tudnivalókKonfigurátor feltételek (EN) ·Adatfeldolgozási szerződés (EN) ·Vásárlói adatvédelmi tájékoztató ·Harmadik féltől származó licencek (EN)