Brzi početak
Tri koraka vode web shop od nule do sigurne narudžbe: ugraditi konfigurator, provjeriti ponudu na svom poslužitelju prije košarice i primiti potpisani webhook. Ugrađeni konfigurator umjesto vas upućuje pozive sa stranice web shopa; vaš kôd radi samo stranu poslužitelja.
Osnovni URL https://cfg.cutoptim.com · Verzija ugovora v1 · Dokument OpenAPI 3.1
Rani pristup: API za trgovce je izrađen i može se isprobati u sandbox web shopu; dodaci za platforme web shopova još su u razvoju. CutOptim ne naplaćuje plaćanja: košarica, blagajna i plaćanje ostaju u vašem web shopu.
Putanje, nazivi polja, kodovi pogrešaka, nazivi zaglavlja i primjeri kôda ostaju na engleskom: oni su ugovor.
1. Ugradite konfigurator
Dodajte skriptu i element na stranicu proizvoda, s vašim javnim ključem (pk_live_…, ili testnim ključem pk_test_… dok razvijate). Podrijetlo stranice mora biti među dopuštenim podrijetlima ključa. Ugrađeni konfigurator zatim sam poziva GET /cfg/v1/config/public, POST /cfg/v1/preview, POST /cfg/v1/quote i POST /cfg/v1/order.
Kad kupac naruči, servis sprema potpisanu narudžbu, a element pokreće događaj preglednika cutoptim:order s { orderId, order, idempotencyKey }. Taj događaj shvatite kao naznaku za svoju stranicu, nikad kao dokaz cijene.
<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="hr">
</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. Provjerite na svom poslužitelju prije košarice
Vaš poslužitelj šalje token ponude na POST /cfg/v1/quote/verify s tajnim ključem. Odgovor je valid plus redeemed; odbijanje je i dalje 200 s valid: false i reason. Zatim pronalazi narudžbu koju je naveo preglednik pomoću GET /cfg/v1/orders/{id} i uspoređuje hash plana, hash ponude, valutu i ukupne iznose s provjerenim tokenom. Tek tada stvara stavku u košarici, po provjerenoj cijeni.
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. Primite potpisani webhook
Objavite krajnju točku webhooka u konfiguraciji svog web shopa. Svaka stvarna narudžba šalje order.created, svaka promjena statusa order.status_changed. Pročitajte sirovo tijelo, provjerite zaglavlje CutOptim-Signature, a zatim spremite narudžbu jednom po CutOptim-Event-Id. Prijamnik ispod referentni je primjer, nepromijenjen.
// 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));
Dalje
Ključevi, testni ključevi i podrijetla: Ključevi i autentikacija. Cjeloviti prijamnik, verzija u PHP-u i raspored ponovnih pokušaja: Webhookovi. Verzija korak po korak za vašu platformu: Vlastiti web shop ili ERP.
Gumba „isprobaj“ ovdje namjerno nema: tajni ključ pripada vašem poslužitelju, nikad pregledniku. Demo web shop prikazuje ugradnju i predaju narudžbe u radu od početka do kraja.
Pravne informacijeUvjeti konfiguratora (EN) ·Ugovor o obradi podataka (EN) ·Obavijest o privatnosti za kupce ·Licencije trećih strana (EN)