API peman Konbit
Ankese yon peman depi wallet Konbit kliyan ou yo. Entegre l ak kèk liy, sandbox gratis.
Kijan sa mache
Sèvè ou kreye yon entansyon peman. Kliyan an peye l nan app Konbit li ak PIN li. Ou resevwa yon webhook siyen epi ou livre sèvis dijital ou.
1. Kreye yon entansyon
Yon apèl sèvè ak montan an. Ou resevwa yon lyen peman ak yon id.
2. Kliyan an peye
Li ouvri lyen an, konfime ak PIN li. Pa gen frè pou li: li peye montan ki parèt la.
3. Yo notifye w
Yon webhook siyen konfime peman an. Ou livre sèvis la. Lajan an rive sou balans Konbit ou.
amountMinor se yon antye nan pi piti inite a : 10000 = 100,00 DOP. Pa janm mete desimal.
Kòmanse nan 5 minit
Twa etap: sèvè ou kreye yon entansyon, kliyan an peye l nan Konbit, sèvè ou konfime peman an anvan ou livre. Men apèl konplè a ak repons reyèl la, ak anotasyon.
curl -X POST https://app.getkonbit.com/api/v1/payment_intents \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: order-123" \
-H "Content-Type: application/json" \
-d '{"amountMinor":10000,"description":"Order 123","metadata":{"orderId":"order-123"},"returnUrl":"https://mon-site.com/merci"}'
{
"id": "5Qx0u5gexpnqsw6qQhks", // konbitRef — gardez-le
"status": "REQUIRES_PAYMENT",
"amountMinor": 10000, // 100,00 DOP
"currency": "DOP",
"feeMinor": 200, // notre commission
"code": "562183", // saisie manuelle / QR
"checkoutUrl": "https://app.getkonbit.com/pay/5Qx0u5gexpnqsw6qQhks",
"expiresAtMs": 1783710307539 // millisecondes
}
checkoutUrl: paj kote kliyan an peye. code: antre alamen / QR. feeMinor: komisyon nou, deja retire sou balans ou (kliyan an peye amountMinor). expiresAtMs: apre sa entansyon an vin EXPIRED.
Redireksyon sou returnUrl fèt nan navigatè kliyan an epi yo ka fo l (se annik louvri URL la). PA JANM livre sèvis ou sou baz retou a sèlman. Toujou konfime bò sèvè a: webhook siyen oswa yon GET sou estati a.
Jwenn aksè ou
De nivo, prezante ak onètte.
Kle tès — imedya
Jenere yon kle sk_test_ anwo: valab 7 jou, sandbox, SAN webhook. Pafè pou eksplore API a ak polling. Pa gen lajan reyèl k ap deplase.
Kle machann — anndan 24 è
Ekri nou ak konpayi ou ak ka itilizasyon ou. Nou kreye yon machann dedye: kle pèsistan + webhook siyen. Nou reponn anjeneral anndan 24 è travay. (Machann ap ka fè l poukont yo pita; jodi a se nou ki louvri l, pou konfòmite.)
Kenbe sekrè a sekrè
Kle sk_ la parèt YON sèl fwa epi li viv sèlman bò sèvè a: pa janm nan yon navigatè, yon app mobil, yon depo Git oswa yon URL. Sere l nan yon jesyonè sekrè. Konpwomèt? Mande yon wotasyon: ansyen an revoke lapoula.
Jenere yon kle tès
Eseye kounye a, san kont. Yon kle tès ki valab 7 jou, an mòd sandbox.
Valab 7 jou. Mòd tès sèlman.
Nou pa ka jenere yon kle kounye a. Eseye ankò.
Peye yon entansyon tès (sandbox)
Pa bezwen kont Konbit: rele POST /v1/test/pay ak id entansyon an. Konbit similye yon peyè sandbox, mete entansyon an SUCCEEDED, voye webhook siyen an (si ou bay yon URL) epi kredite balans machann ou. Konsa ou teste tout sik la poukont ou.
curl -X POST https://app.getkonbit.com/api/v1/test/pay \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{"intentId":"<id renvoyé par /payment_intents>"}'
# -> l'intention passe à SUCCEEDED, le webhook signé part (si configuré),
# et ton solde marchand augmente (testable par GET /balance + payouts).
Kle ou jenere isit la efemè (7 jou), sandbox: pa gen lajan reyèl. Li ase pou fè create → pay → webhook → payout poukont ou. Pou yon kle ki DIRE ak vrè pwodiksyon, kontakte nou — yon machann dedye + konfòmite vini nan go-live. Poukisa « test » nan kle a (sk_test_) ? Se prefiks sandbox la : okenn lajan reyèl pa ka deplase. Nan sandbox, « kat tès » = POST /v1/test/pay (peyè sintetik) ; chak paj peman montre yon bandwòl « SANDBOX ». Kle pwodiksyon (sk_live_) se Konbit ki bay yo apre validasyon.
Entansyon peman
REQUIRES_PAYMENT: ap tann · SUCCEEDED: peye · EXPIRED: ekspire · CANCELED: ou anile l · REFUNDED: ranbouse.
Montan
amountMinor se yon antye an inite minè (10000 = 100,00 DOP). Limit: 1 000 rive 5 000 000, sa vle di 10 rive 50 000 DOP. DOP sèlman nan V1 (poko gen HTG sou API a).
Idempotency-Key (obligatwa)
Obligatwa lè w ap kreye. Verifye: MENM kle a (pou chak machann) TOUJOU voye menm entansyon an, san doublon ni doub debi. Sèvi ak id kòmand ou — konsa yon retès rezo pa gen danje.
Rekonsilyasyon ak metadata
Mete idantifyan ou (orderId, userId…) nan metadata (20 kle maksimòm). Yo retounen menm jan nan webhook la ak GET la, pou matche yon peman ak kòmand ou. PA mete okenn sekrè la: moun k ap peye a ak webhook ou wè yo.
Referans API a
Otantifye chak demann ak kle sekrè ou nan antèt Authorization.
/v1/payment_intentsKreye yon entansyon peman
curl -X POST https://app.getkonbit.com/api/v1/payment_intents \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: order-123" \
-H "Content-Type: application/json" \
-d '{"amountMinor":10000,"description":"Order 123","returnUrl":"https://mon-site.com/merci"}'
{
"id": "5Qx0u5gexpnqsw6qQhks",
"status": "REQUIRES_PAYMENT",
"amountMinor": 10000,
"currency": "DOP",
"feeMinor": 200,
"code": "562183",
"checkoutUrl": "https://app.getkonbit.com/pay/5Qx0u5gexpnqsw6qQhks",
"expiresAtMs": 1783710307539
}
Voye kliyan ou sou checkoutUrl (oswa montre QR a) pou li peye.
/v1/payment_intents/{id}Gade estati yon peman
{ "id": "5Qx0...", "status": "SUCCEEDED", "amountMinor": 10000, "feeMinor": 200 }
/v1/refundsRanbouse yon peman
curl -X POST https://app.getkonbit.com/api/v1/refunds \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{"payment_intent":"5Qx0u5gexpnqsw6qQhks"}'
/v1/balanceGade balans ou
{ "object": "balance", "balanceMinor": 9800, "totalFeesMinor": 200, "currency": "DOP" }
/v1/payoutsVoye yon pati nan balans ou nan wallet yon chofè / benefisyè, ak kòd Konbit li (9 karaktè). Idempotency-Key obligatwa.
Kle machann obligatwa (kontra Konbit): kle tès pòtal yo pa ka peye yon vrè wallet — balans sandbox yo a fiktif.
curl -X POST https://app.getkonbit.com/api/v1/payouts \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: driver-42-2026-W27" \
-H "Content-Type: application/json" \
-d '{"konbitCode":"K7M2P9QRS","amountMinor":85000,"metadata":{"driverId":"drv_42"}}'
{ "id":"p_8Kd...", "object":"payout", "status":"SUCCEEDED", "amountMinor":85000, "feeMinor":0, "currency":"DOP", "konbitCode":"K7M2P9QRS" }
/v1/payoutsLis vèsman ou yo, pou rekonsilyasyon.
Estati yon peman
REQUIRES_PAYMENT: ap tann · SUCCEEDED: peye · EXPIRED: ekspire · CANCELED: ou anile l · REFUNDED: ranbouse.
Kòd erè
Chak erè voye menm objè a: yon kòd ki estab (pou teste) ak yon mesaj lizib.
{ "error": { "code": "amount_out_of_bounds", "message": "..." } }
| Kòd | Kilè |
|---|---|
401 unauthorized | Kle absan, envalid oswa revoke. |
400 idempotency_key_required | Antèt Idempotency-Key manke lè w ap kreye. |
400 amount_out_of_bounds / invalid_amount | Montan andeyò limit yo, oswa se pa yon antye. |
400 invalid_return_url | returnUrl bay men li pa an https. |
404 not_found | Entansyon enkoni oswa ki pou yon lòt machann. |
404 code_not_found | Kòd Konbit benefisyè a pa jwenn (payout). |
409 not_cancelable / not_refundable | Estati enkonpatib (deja peye, deja ranbouse, pa ka anile…). |
409 insufficient_balance | Balans machann pa ase pou ranbousman an oswa payout la. |
429 quota_exceeded | Twòp demann. |
503 service_unavailable | Konbit Pay dezaktive pou yon moman. |
Webhooks
Chak chanjman estati deklanche yon POST JSON siyen sou webhookUrl ou (https obligatwa). Antèt Konbit-Signature: t=
POST (votre webhookUrl)
Konbit-Signature: t=1720000000000,v1=<hmac_sha256>
{
"id": "evt_9f2c...", // id de l'ÉVÉNEMENT — dédup
"type": "payment_intent.succeeded", // .refunded · .canceled · .expired · .payment_failed (data.failureCode)
"createdAtMs": 1720000000000, // millisecondes
"data": {
"id": "5Qx0...", // id de l'intention (= konbitRef)
"status": "SUCCEEDED",
"amountMinor": 10000,
"currency": "DOP",
"feeMinor": 200,
"metadata": { "orderId": "order-123" }
}
}
t siyati a AK createdAtMs se an milisgonn depi epòk la (13 chif). Pyèj nimewo 1: trete yo tankou segonn fè fenèt 5 minit la echwe epi ou rejte webhook ki valab.
Verifye siyati a, etap pa etap
1. Li kò a BRUT (san parse). 2. Retire t ak v1 nan antèt la. 3. Rejte si |kounye a − t| > 5 min. 4. Kalkile HMAC-SHA256(sekrè_webhook, "
Verifikasyon — moso pou kopye
const crypto = require("crypto");
// IMPORTANT: raw body, pas express.json() sur cette route
app.post("/konbit/webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const raw = req.body; // Buffer brut
const sig = req.get("Konbit-Signature") || "";
const parts = Object.fromEntries(sig.split(",").map(p => p.split("=")));
const t = Number(parts.t); // MILLISECONDES
if (!t || Math.abs(Date.now() - t) > 5 * 60 * 1000) return res.sendStatus(401);
const expected = crypto.createHmac("sha256", process.env.KONBIT_WEBHOOK_SECRET)
.update(t + "." + raw.toString("utf8")).digest("hex");
const a = Buffer.from(expected), b = Buffer.from(parts.v1 || "");
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.sendStatus(401);
const event = JSON.parse(raw.toString("utf8"));
if (alreadyProcessed(event.id)) return res.sendStatus(200); // dédup sur event.id
// re-vérifiez event.data.amountMinor + currency contre VOTRE commande
markProcessed(event.id);
fulfill(event.data.metadata.orderId);
res.sendStatus(200);
});
<?php
$raw = file_get_contents("php://input"); // corps brut
$sig = $_SERVER["HTTP_KONBIT_SIGNATURE"] ?? "";
parse_str(str_replace(",", "&", $sig), $p); // t=...&v1=...
$t = (int)($p["t"] ?? 0); // MILLISECONDES
if (!$t || abs(round(microtime(true)*1000) - $t) > 300000) { http_response_code(401); exit; }
$expected = hash_hmac("sha256", $t . "." . $raw, getenv("KONBIT_WEBHOOK_SECRET"));
if (!hash_equals($expected, $p["v1"] ?? "")) { http_response_code(401); exit; }
$event = json_decode($raw, true);
if (already_processed($event["id"])) { http_response_code(200); exit; } // dédup
// re-vérifiez amountMinor + currency contre votre commande
mark_processed($event["id"]);
fulfill($event["data"]["metadata"]["orderId"]);
http_response_code(200);
import hmac, hashlib, time, os
from flask import request, abort
@app.post("/konbit/webhook")
def konbit_webhook():
raw = request.get_data() # bytes bruts
parts = dict(p.split("=", 1) for p in request.headers.get("Konbit-Signature", "").split(","))
t = int(parts.get("t", 0)) # MILLISECONDES
if not t or abs(time.time() * 1000 - t) > 300000:
abort(401)
expected = hmac.new(os.environ["KONBIT_WEBHOOK_SECRET"].encode(),
f"{t}.".encode() + raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, parts.get("v1", "")):
abort(401)
event = request.get_json()
if already_processed(event["id"]): # dédup sur event.id
return "", 200
# re-vérifiez amountMinor + currency contre votre commande
mark_processed(event["id"])
fulfill(event["data"]["metadata"]["orderId"])
return "", 200
Règ reeseye
Livrezon imedya sou evènman an. Si l echwe (repons ki pa 2xx, oswa depase 10 s), Konbit reeseye 5 fwa, ak yon backoff 1, 5, 30, 120 answit 720 minit — 6 tantativ antou sou anviwon 14,5 è anvan li abandone (estati «dead», vizib pou dyagnostik). Chak tantativ RESIYEN ak yon t aktyèl: donk fenèt 5 min ou aksepte reeseye yo. id evènman an rete menm ant reeseye yo — dedouble sou li.
Oswa pa mande (polling)
De fason pou konnen yon peman reyisi : resevwa webhook la, oswa mande estati entansyon an jiskaske li SUCCEEDED.
curl https://app.getkonbit.com/api/v1/payment_intents/{id} \
-H "Authorization: Bearer sk_test_..."
# répétez jusqu'à "status": "SUCCEEDED"
Webhook AK polling rekonsilyasyon, pa janm youn san lòt. Webhook la avèti ou vit; yon GET peryodik sou entansyon resan yo rekipere nenpòt livrezon ki manke (endpoint ki tonbe yon moman, evènman «dead»). Pa janm depann sou yon sèl chemen.
Peye yon entansyon tès
Pou rive nan peman an, ou bezwen yon kont Konbit ak balans. Nan sandbox: ouvri checkoutUrl la konekte sou yon kont Konbit tès, oswa mande nou yon kont peyè tès ak lajan. San sa ou ka kreye entansyon men ou pa ka peye yo. Yon fwa ankesman pa kat aktive pou kont ou (gade anba a), menm checkoutUrl la ofri tou « Peye ak kat » (san kont Konbit): entansyon an make paidViaCard, li kredite sou balans USD ou, epi ou resevwa card_payment.succeeded + payment_intent.succeeded (dedipe pa id).
Lis kontwòl pou pwodiksyon
Onz pwen anvan ou chanje. Twa ki an gra yo se sa 90 % entegratè bliye — epi ki koute lajan oswa louvri yon twou.
- Kle sk_ machann jwenn epi sere bò sèvè a (jesyonè sekrè), pa janm bò kliyan.
- Idempotency-Key mete sou chak kreyasyon (orderId ou).
- Montan an inite minè, anndan limit yo; lajan DOP.
- Kò BRUT konsève pou verifikasyon HMAC (pa parse anvan siyati a).
- Endpoint webhook an https, reponn 2xx an mwens pase 10 s, travay lou an asenkwòn.
- Siyati verifye an tan konstan, t trete kòm milisgonn, demann ki gen plis pase 5 min rejte.
- Polling rekonsilyasyon kòm filè sekirite, anplis webhook la.
- Estati EXPIRED / CANCELED / REFUNDED ak kòd erè jere pwòp.
- Dedoublaj sou id EVÈNMAN an (livrezon omwen-yon-fwa).
- Reverifye montan AN ak lajan webhook la kont kòmand ou — pa fè konfyans nan tip evènman an sèlman.
- Okenn chemen bò kliyan pa make «peye»: returnUrl pa yon prèv, se sèlman konfimasyon sèvè a ki prèv.
Ray USD: ankese ak kat, peye ak Zelle
Pou platfòm k ap travay an dola (envestisman, peman salè, marketplaces): kliyan ou peye ak kat sou yon checkout Konbit — san kont Konbit — epi ou distribye USD ak Zelle, pa lo, ak konfimasyon webhook liy pa liy.
1. Ankesman ak kat
Sèvè ou kreye entansyon an (montan fikse sou sèvè a), moun k ap peye a antre kat li sou /cpay. Frè Konbit ajoute sou montan an; balans USD ou resevwa nèt la.
2. Lajan sekirize
Chak peman pase nan yon peryòd sekirite anti-fwod anvan li ka distribye. Balans nan twa eta: annatant, disponib, rezève.
3. Vèsman Zelle
Ou soumèt lis la (jiska 200 benefisyè pa lo). Konbit egzekite chak transfè epi li fè w konnen ak webhook siyen: peye oswa echwe, liy pa liy.
Ankesman pa kat (ray USD) se yon aktivasyon PA MACHANN, Konbit apwouve li (konfòmite, kloz chargeback) — jamè sou yon kle tès. Yon fwa li aktive, lyen peman DOP ou yo ofri opsyon kat la tou bay moun k ap peye a, san kont Konbit. Ekri nou pou aktive li.