دليل مطوري وتين بلس
تتيح لك واجهتنا البرمجية المتقدمة ربط أنظمتك بمنصتنا بشكل مباشر. يعتمد نظامنا على خوارزميات دقيقة لحماية الأسعار وتوجيه الطلبات جغرافياً (بوابة شمال/جنوب) لضمان تنفيذ آمن وخالي من الأخطاء المحاسبية.
1. المصادقة الآمنة (HMAC Auth)
نحن لا نستخدم نظام التوكن التقليدي، بل نستخدم توقيعاً مشفراً يتغير مع كل طلب لضمان أقصى درجات الأمان. للاتصال بنا، تحتاج إلى 3 عناصر تجدها في حسابك:
- Username: معرف التاجر الخاص بك (مثال: WTN-XXXX).
- API Key: المفتاح العام للسيرفر.
- API Secret: مفتاح سري جداً يستخدم لتشفير الطلبات (لا ترسله أبداً في الطلب بل استخدمه لتوليد التوقيع).
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، يقوم النظام تلقائياً بتطبيق (نسبة هامش بوابة الشمال) المحفوظة في الإعدادات على السعر الأساسي.
أكواد الشبكات المدعومة: YM, YOU, SABAFON, Y, YEMEN_FORGY, ADEN_NET, YEMEN_NET, LANDLINE
ب. خوارزمية الاستعلام وتنسيق الرصيد (Inquiry)
النظام قادر على استخراج تفاصيل باقات يمن نت والثابت، ومعرفة حالة سلفة يمن موبايل. ملاحظة: خوارزمية النظام ترفض مسبقاً أي محاولة استعلام لشبكة "عدن نت" (ADEN_NET) لأنها باقات فقط ولا تدعم الاستعلام.
{
"network": "YEMEN_NET",
"phone": "04241980",
"type": "query" // استخدم "solfa" لاستعلام سلفة يمن موبايل، أو اتركه فارغاً للرصيد العادي
}
يقوم النظام بإرجاع النص منسقاً ويستخرج لك المتغير min_amount (أقل مبلغ سداد) لتطبيقه في واجهاتك.
ج. تنفيذ الشحن وحماية التسعير (Recharge & Idempotency)
لتنفيذ عملية الشحن، نستخدم خوارزمية حماية ترفض الطلب فوراً إذا كان expected_price المرسل منك لا يتطابق تماماً مع السعر الفعلي في النظام للحظة الحالية، وذلك لحمايتك من تقلبات صرف العملة أو رسوم البوابات.
{
"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).
أ. جلب الكتالوج
ب. تقديم طلب شراء ألعاب/بطاقات
{
"sku": "PUBG-60",
"reference_id": "ORD-998877",
"expected_price": 0.95, // السعر المتوقع لضمان عدم الخصم بزيادة
"player_id": "512345678" // مطلوب لخدمات الشحن المباشر
}
5. نظام الاستعلامات والحساب (System API)
استعلام عن حالة النظام (System Status):
يُنصح بطلبه قبل إرسال كميات كبيرة للتأكد من عمل المزودين.
استعلام الرصيد (محفظة الدولار محولة لعملتك):
استعلام حالة طلب مفرد:
الاستعلام الجماعي (Batch Query):
للاستعلام عن أكثر من طلب دفعة واحدة (أقصى حد 50 طلب).
{ "reference_ids": ["ORD-1", "ORD-2"] }6. إعدادات الويب هوك (Webhooks)
يتيح لك هذا النظام تسجيل رابط (URL) لكي نقوم نحن بإرسال حالة الطلب إليه فور اكتماله أو رفضه بشكل آلي دون الحاجة للاستعلام المتكرر.
أ. تسجيل رابط الويب هوك الخاص بك:
{ "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 مرات كحد أقصى وفقاً للجدول الزمني التالي:
7. جدول رموز الأخطاء (HTTP Status Codes)
| الكود | رسالة الخطأ | الوصف |
|---|---|---|
| 200 | Success | تمت العملية أو الاستعلام بنجاح. |
| 400 | Bad Request | خطأ في المدخلات. ستجد سبب الفشل مبيناً في حقل provider_message. |
| 401 | Unauthorized | التوقيع خاطئ، أو انتهت صلاحية الزمن، أو حسابك موقوف. |
| 403 | IP Blocked | تم رفض الوصول. عنوان الـ IP غير مدرج في القائمة البيضاء. |
| 409 | Duplicate Reference | تم إرسال رقم المرجع (reference_id) مسبقاً، أو يوجد اختلاف في التسعيرة المتوقعة (expected_price) لمنع الخسارة. |
| 422 | Insufficient 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)