WateenPlus RESTful API V1

دليل مطوري وتين بلس

تتيح لك واجهتنا البرمجية المتقدمة ربط أنظمتك بمنصتنا بشكل مباشر. يعتمد نظامنا على خوارزميات دقيقة لحماية الأسعار وتوجيه الطلبات جغرافياً (بوابة شمال/جنوب) لضمان تنفيذ آمن وخالي من الأخطاء المحاسبية.

1. المصادقة الآمنة (HMAC Auth)

نحن لا نستخدم نظام التوكن التقليدي، بل نستخدم توقيعاً مشفراً يتغير مع كل طلب لضمان أقصى درجات الأمان. للاتصال بنا، تحتاج إلى 3 عناصر تجدها في حسابك:

  • Username: معرف التاجر الخاص بك (مثال: WTN-XXXX).
  • API Key: المفتاح العام للسيرفر.
  • API Secret: مفتاح سري جداً يستخدم لتشفير الطلبات (لا ترسله أبداً في الطلب بل استخدمه لتوليد التوقيع).
// Base URL
https://wateenplus.com/api/v1

إعداد الترويسات (Headers) الإجبارية:

الحقل (Header)الوصفطريقة التوليد
X-WTN-Usernameمعرف التاجرمن صفحة حسابك
X-WTN-ApiKeyالمفتاح العاممن صفحة حسابك
X-WTN-Timestampوقت الإرسال الحاليبصيغة Unix Timestamp (بالثواني)
X-WTN-Signatureالتوقيع المشفرتشفير (Timestamp + Body) باستخدام Secret بخوارزمية HMAC-SHA256
Idempotency-Keyمنع التكرار (مطلوب لطلبات POST)معرف فريد (UUID) لكل عملية لمنع الخصم المزدوج إذا انقطع الاتصال
Content-Typeنوع البياناتapplication/json

2. بيئة الاختبار (Sandbox Mode)

لضمان راحة المطورين وتسهيل عملية الربط دون المخاطرة بالرصيد الحقيقي، نوفر بيئة اختبار متكاملة (Sandbox).

كيف تعمل بيئة الاختبار؟

  • قم بإنشاء مفتاح من نوع تجريبي (Sandbox) من لوحة تحكم حسابك.
  • المفاتيح التجريبية تبدأ دائماً بالبادئة pk_test_ و sk_test_.
  • عند استخدام هذا المفتاح في أي طلب، سيقوم النظام بـ محاكاة نجاح العملية وإرجاع رد وهمي (Mock Response) مطابق للرد الحقيقي.
  • لن يتم خصم أي مبلغ من رصيدك الحقيقي.

3. خوارزميات الاتصالات (WateenTelecom API)

لقد قمنا بتطوير خوارزميات دقيقة للتعامل مع الشحن، التسعير الجغرافي، والاستعلام المتقدم في اليمن.

أ. خوارزمية التسعير والتوجيه الجغرافي (Gateway & Pricing)

يعتمد نظام وتين بلس على تحديد مسار التنفيذ (بوابة عدن أو بوابة صنعاء). عند طلبك للكتالوج وتمرير gateway=north، يقوم النظام تلقائياً بتطبيق (نسبة هامش بوابة الشمال) المحفوظة في الإعدادات على السعر الأساسي.

GET /telecom/packages/{network_code}?gateway=south

أكواد الشبكات المدعومة: YM, YOU, SABAFON, Y, YEMEN_FORGY, ADEN_NET, YEMEN_NET, LANDLINE

ب. خوارزمية الاستعلام وتنسيق الرصيد (Inquiry)

النظام قادر على استخراج تفاصيل باقات يمن نت والثابت، ومعرفة حالة سلفة يمن موبايل. ملاحظة: خوارزمية النظام ترفض مسبقاً أي محاولة استعلام لشبكة "عدن نت" (ADEN_NET) لأنها باقات فقط ولا تدعم الاستعلام.

POST/telecom/inquiry
{
  "network": "YEMEN_NET", 
  "phone": "04241980",
  "type": "query" // استخدم "solfa" لاستعلام سلفة يمن موبايل، أو اتركه فارغاً للرصيد العادي
}

يقوم النظام بإرجاع النص منسقاً ويستخرج لك المتغير min_amount (أقل مبلغ سداد) لتطبيقه في واجهاتك.

ج. تنفيذ الشحن وحماية التسعير (Recharge & Idempotency)

لتنفيذ عملية الشحن، نستخدم خوارزمية حماية ترفض الطلب فوراً إذا كان expected_price المرسل منك لا يتطابق تماماً مع السعر الفعلي في النظام للحظة الحالية، وذلك لحمايتك من تقلبات صرف العملة أو رسوم البوابات.

POST/telecom/recharge
{
  "service_id": 15,
  "phone": "770000000",
  "amount": 1000, // مطلوب للشحن المفتوح فقط، اتركه فارغاً للباقات
  "expected_price": 1000, // إجباري للمطابقة والتأكيد بالريال اليمني الجديد
  "reference_id": "REC-12345",
  "gateway": "south" // "south" أو "north"
}

القاعدة المالية: عمليات الاتصالات تُخصم حصراً من محفظة الريال اليمني الجديد (YER_NEW). إذا فشل المزود في الشحن، تعمل خوارزمية (Rollback) على إعادة الرصيد لمحفظتك في نفس أجزاء الثانية.

4. نظام الألعاب والبطاقات (Store API)

يقوم النظام هنا بتسعير الكتالوج والخصم بعملة التاجر الأساسية المحددة في الإعدادات (USD, SAR, YER_OLD, YER_NEW).

أ. جلب الكتالوج

GET /store/catalog

ب. تقديم طلب شراء ألعاب/بطاقات

POST /store/order
{
  "sku": "PUBG-60",
  "reference_id": "ORD-998877", 
  "expected_price": 0.95, // السعر المتوقع لضمان عدم الخصم بزيادة
  "player_id": "512345678" // مطلوب لخدمات الشحن المباشر
}

5. نظام الاستعلامات والحساب (System API)

استعلام عن حالة النظام (System Status):

يُنصح بطلبه قبل إرسال كميات كبيرة للتأكد من عمل المزودين.

GET/system/status

استعلام الرصيد (محفظة الدولار محولة لعملتك):

GET/system/balance

استعلام حالة طلب مفرد:

GET/system/orders/{reference_id}

الاستعلام الجماعي (Batch Query):

للاستعلام عن أكثر من طلب دفعة واحدة (أقصى حد 50 طلب).

POST/system/orders/batch
{ "reference_ids": ["ORD-1", "ORD-2"] }

6. إعدادات الويب هوك (Webhooks)

يتيح لك هذا النظام تسجيل رابط (URL) لكي نقوم نحن بإرسال حالة الطلب إليه فور اكتماله أو رفضه بشكل آلي دون الحاجة للاستعلام المتكرر.

أ. تسجيل رابط الويب هوك الخاص بك:

POST/finance/webhook
{ "webhook_url": "https://your-domain.com/api/wateen-callback" }

ب. شكل البيانات التي سنرسلها لك (Payload):

{
  "reference_id": "ORD-12345",
  "wateen_order_id": 98765,
  "status": "completed", // أو "failed"
  "delivered_code": "XXXX-YYYY-ZZZZ",
  "message": "تم التنفيذ بنجاح"
}

ج. حماية الويب هوك (Signature Verification):

للتحقق من أن الطلب قادم من سيرفرات "وتين بلس" فعلياً ولم يتم التلاعب به، سنرسل توقيعاً مشفراً في ترويسة X-Wateen-Signature. يتم توليد هذا التوقيع عبر تشفير نص الطلب (Raw JSON Body) بخوارزمية HMAC-SHA256 باستخدام الـ API Secret الخاص بك.

د. الرد المتوقع من سيرفرك (Expected Response):

يجب أن يرد سيرفرك (الـ Endpoint الخاص بك) بكود HTTP 200 OK فور استلامه للإشعار، كدليل على أنك استلمت البيانات بنجاح.

هـ. سياسة إعادة الإرسال (Retry Policy):

إذا كان سيرفرك لا يستجيب (Timeout) أو رد بكود خطأ (مثل 500 أو 404 أو 401)، سيقوم نظامنا بمحاولة إعادة الإرسال 4 مرات كحد أقصى وفقاً للجدول الزمني التالي:

1
فوراً (عند تغير حالة الطلب)
2
بعد دقيقة واحدة (1 Minute)
3
بعد 5 دقائق (5 Minutes)
4
بعد 30 دقيقة (30 Minutes)

7. جدول رموز الأخطاء (HTTP Status Codes)

الكودرسالة الخطأالوصف
200Successتمت العملية أو الاستعلام بنجاح.
400Bad Requestخطأ في المدخلات. ستجد سبب الفشل مبيناً في حقل provider_message.
401Unauthorizedالتوقيع خاطئ، أو انتهت صلاحية الزمن، أو حسابك موقوف.
403IP Blockedتم رفض الوصول. عنوان الـ IP غير مدرج في القائمة البيضاء.
409Duplicate Referenceتم إرسال رقم المرجع (reference_id) مسبقاً، أو يوجد اختلاف في التسعيرة المتوقعة (expected_price) لمنع الخسارة.
422Insufficient Balanceرصيد الوكيل لا يكفي لتنفيذ الطلب أو فشل التنفيذ في المزود.

8. أمثلة الربط البرمجي (توليد الـ HMAC والـ Idempotency)

توضح هذه الأمثلة كيفية إنشاء التوقيع ومفتاح منع التكرار وإرسالهما بشكل آمن لتنفيذ طلبات شحن الاتصالات المطابقة لمعمارية "وتين بلس".

<?php
$url = "https://wateenplus.com/api/v1/telecom/recharge";
$username = "WTN-XXXXXX";
$apiKey = "pk_live_xxxx";
$apiSecret = "sk_live_xxxx";

// 1. تحضير بيانات الطلب بدقة (مثال شحن اتصالات)
$payload = json_encode([
    "service_id" => 15,
    "reference_id" => "REQ-" . time(),
    "phone" => "770000000",
    "expected_price" => 1000, // إجباري لحماية أموالك من تغير السعر بالموقع
    "gateway" => "north"  // يتم هنا إضافة هامش بوابة الشمال تلقائياً
]);

// 2. جلب الوقت وتوليد التوقيع ومفتاح التكرار
$timestamp = time();
$stringToSign = $timestamp . '.' . $payload;
$signature = hash_hmac('sha256', $stringToSign, $apiSecret);
$idempotencyKey = bin2hex(random_bytes(16)); // مفتاح فريد

// 3. إرسال الطلب مع الترويسات الأمنية
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "X-WTN-Username: " . $username,
    "X-WTN-ApiKey: " . $apiKey,
    "X-WTN-Timestamp: " . $timestamp,
    "X-WTN-Signature: " . $signature,
    "Idempotency-Key: " . $idempotencyKey,
    "Content-Type: application/json",
    "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>
const axios = require('axios');
const crypto = require('crypto');

async function placeOrder() {
  const url = 'https://wateenplus.com/api/v1/telecom/recharge';
  const username = 'WTN-XXXXXX';
  const apiKey = 'pk_live_xxxx';
  const apiSecret = 'sk_live_xxxx';

  // 1. تحضير البيانات كنص JSON
  const payload = JSON.stringify({
    service_id: 15,
    reference_id: 'REQ-' + Date.now(),
    phone: '770000000',
    expected_price: 1000,
    gateway: 'north'
  });

  // 2. توليد الوقت والتوقيع ومفتاح التكرار
  const timestamp = Math.floor(Date.now() / 1000).toString();
  const stringToSign = timestamp + '.' + payload;
  const signature = crypto.createHmac('sha256', apiSecret).update(stringToSign).digest('hex');
  const idempotencyKey = crypto.randomUUID();

  try {
    const response = await axios.post(url, payload, {
      headers: {
        'X-WTN-Username': username,
        'X-WTN-ApiKey': apiKey,
        'X-WTN-Timestamp': timestamp,
        'X-WTN-Signature': signature,
        'Idempotency-Key': idempotencyKey,
        'Content-Type': 'application/json'
      }
    });
    console.log("Success:", response.data);
  } catch (error) {
    console.error("Error:", error.response ? error.response.data : error.message);
  }
}

placeOrder();
import requests
import time
import hmac
import hashlib
import json
import uuid

url = "https://wateenplus.com/api/v1/telecom/recharge"
username = "WTN-XXXXXX"
api_key = "pk_live_xxxx"
api_secret = "sk_live_xxxx"

# 1. تحضير البيانات
payload_dict = {
    "service_id": 15,
    "reference_id": f"REQ-{int(time.time())}",
    "phone": "770000000",
    "expected_price": 1000,
    "gateway": "north"
}
payload = json.dumps(payload_dict, separators=(',', ':'))

# 2. توليد الوقت والتوقيع ومفتاح التكرار
timestamp = str(int(time.time()))
string_to_sign = f"{timestamp}.{payload}"
signature = hmac.new(api_secret.encode(), string_to_sign.encode(), hashlib.sha256).hexdigest()
idempotency_key = str(uuid.uuid4())

# 3. إرسال الطلب
headers = {
    "X-WTN-Username": username,
    "X-WTN-ApiKey": api_key,
    "X-WTN-Timestamp": timestamp,
    "X-WTN-Signature": signature,
    "Idempotency-Key": idempotency_key,
    "Content-Type": "application/json",
    "Accept": "application/json"
}

response = requests.post(url, data=payload, headers=headers)

if response.status_code == 200:
    print("Success:", response.json())
else:
    print("Error:", response.text)