توثيق API

كل الطلبات عبر HTTPS وبصيغة JSON. المصادقة بترويسة X-API-Key (تولّد مفتاحك من لوحة التحكم ← مفتاح API).

العنوان الأساسي: https://bakchich.ma

نقاط النهاية

الطريقةالمسارالوصف
GET/v1/pingفحص المفتاح
GET/v1/products?game=free-fireالكتالوج بأسعارك (مع kind=topup|giftcard أو all=true)
POST/v1/ordersإنشاء طلب
POST/v1/orders/batchحتى 25 طلباً دفعة واحدة
GET/v1/orders/{order_id}حالة طلب
GET/v1/orders?status=&ids=&buyer_ref=&since=&limit=قائمة طلباتك
GET/v1/balanceالرصيد وآخر 50 حركة
PUT/v1/webhookضبط عنوان الـ Webhook
POST/v1/webhook/testإرسال حدث تجريبي

إنشاء طلب

الحقلالوصف
product_keyمطلوب. من /v1/products
buyer_refمطلوب. معرّف طلبك لديك (حتى 200 حرف). فريد؛ إعادة إرسال نفس القيمة تعيد نفس الطلب (200) دون خصم مزدوج.
player_id / server_idبيانات اللاعب حسب نوع المنتج
quantity1 – 999 (الافتراضي 1)
note / extraاختياري
testtrue = طلب تجريبي بلا خصم
curl -X POST https://YOUR-DOMAIN/v1/orders \
  -H "X-API-Key: mk_live_..." -H "Content-Type: application/json" \
  -d '{"product_key":"topup/free-fire/brazil/100 Diamonds","player_id":"51234567","buyer_ref":"ORDER-1001"}'

الرد 201:

{
  "order_id": "RG-3F9A12BC7D",
  "buyer_ref": "ORDER-1001",
  "status": "pending",
  "product": "100 Diamonds",
  "quantity": 1,
  "price_usdt": "1.04",
  "delivery_note": null,
  "failure_reason": null
}

الحالات: pending ← delivered (الكود أو التأكيد في delivery_note) أو failed (يُرد المبلغ تلقائياً وسببه في failure_reason).

الأخطاء

الشكل: {"error":{"code":"...","message":"..."}}

HTTPcodeالمعنى
401missing_api_key / invalid_api_keyالمفتاح مفقود أو غير صالح
402insufficient_balanceرصيدك لا يكفي
409out_of_stockالباقة نفدت
422unknown_product / invalid_requestمنتج غير معروف أو بيانات ناقصة
429rate_limitedطلبات كثيرة؛ انتظر Retry-After
503service_unavailableمؤقت — أعد المحاولة بنفس buyer_ref

Webhooks

عيّن عنوان HTTPS عاماً من لوحة التحكم، فنرسل لك POST عند اكتمال كل طلب بصيغة Standard Webhooks. الأحداث: order.delivered، order.failed، webhook.test. أعد 2xx للتأكيد؛ تُعاد المحاولة بعد 1د، 5د، 30د، 2س، 6س.

الترويسات: webhook-id، webhook-timestamp، webhook-signature (قيمتها v1,<base64>). تحقق من التوقيع بالسر whsec_... الظاهر في صفحة مفتاح API:

// PHP
$raw = file_get_contents('php://input');
$key = base64_decode(substr($secret, 6));                       // بعد whsec_
$msg = $_SERVER['HTTP_WEBHOOK_ID'].'.'.$_SERVER['HTTP_WEBHOOK_TIMESTAMP'].'.'.$raw;
$expected = 'v1,'.base64_encode(hash_hmac('sha256', $msg, $key, true));
$ok = false;
foreach (explode(' ', $_SERVER['HTTP_WEBHOOK_SIGNATURE']) as $sig) $ok = $ok || hash_equals($expected, $sig);
if (!$ok || abs(time() - (int)$_SERVER['HTTP_WEBHOOK_TIMESTAMP']) > 300) { http_response_code(401); exit; }
# Python
import base64, hashlib, hmac
key = base64.b64decode(secret[6:])
msg = f"{webhook_id}.{timestamp}.{raw_body}".encode()
expected = "v1," + base64.b64encode(hmac.new(key, msg, hashlib.sha256).digest()).decode()
ok = any(hmac.compare_digest(expected, s) for s in signature_header.split())

لا تعتمد على الـ Webhook وحده: اجعل لديك استعلاماً دورياً بـ GET /v1/orders?status=pending كاحتياط.