الدفع يتم على صفحة WHGPG الآمنة، ولا يخزن الموقع بيانات البطاقة.
BHD EN

توثيق API

اربط موقعك مع WHGPG باستخدام Unique ID وAPI Hash الخاصين بك.

المصادقة

أرسل بيانات WHGPG الخاصة بك مع كل طلب API باستخدام الترويسات التالية.

X-WHGPG-Unique-ID: WHGPG-U-... X-WHGPG-API-Hash: whgpg_hash_...

لا تعرض API Hash داخل JavaScript في المتصفح أو في كود عام.

تتضمن كل استجابة API ترويسة X-WHGPG-Request-ID لتتبع الطلب عند الدعم أو داخل سجل التاجر.

X-WHGPG-Request-ID: 550e8400-e29b-41d4-a716-446655440000

إنشاء عملية دفع

POST https://www.whgpg.odwyah.com/api/v1/payments

curl -X POST https://www.whgpg.odwyah.com/api/v1/payments \ -H "Accept: application/json" \ -H "X-WHGPG-Unique-ID: WHGPG-U-2608-XXXXXXXXXX" \ -H "X-WHGPG-API-Hash: whgpg_hash_YOUR_SECRET" \ -H "Idempotency-Key: ORDER-1001" \ -d "amount=1.000" \ -d "reference=ORDER-1001" \ -d "return_url=https://merchant.example/payment/return"

حقول اختيارية

الحقلالوصف
descriptionوصف يظهر مع عملية الدفع.
webhook_urlرابط HTTPS خاص بهذه العملية. إذا ترك فارغاً يستخدم رابط Webhook المسجل للتاجر.
payment_methodbenefitpay, benefit, card, apple_pay
customer[name]بيانات العميل اختيارية، كما يدعم email وmobile وcountry وcity وaddress.

الاستجابة

{ "success": true, "request_id": "550e8400-e29b-41d4-a716-446655440000", "id": "PAY-20260830-XXXXXXX", "status": "pending", "amount": "1.000", "currency": "BHD", "payment_url": "https://whgpg.odwyah.com/sandbox/payment/SBX-...", "idempotent_replay": false }

وجّه العميل إلى payment_url ولا تعتبر الطلب مدفوعاً اعتماداً على رجوع المتصفح وحده.

Idempotency

أرسل Idempotency-Key فريداً لكل طلب لدى التاجر. إعادة نفس الطلب بنفس المفتاح تعيد نفس عملية WHGPG ولا تنشئ خصماً جديداً.

Idempotency-Key: ORDER-1001

إعادة المحاولة الآمنة ترجع idempotent_replay=true مع نفس رقم ورابط الدفع.

{ "success": true, "id": "PAY-20260830-XXXXXXX", "status": "pending", "idempotent_replay": true }

إذا استُخدم نفس المفتاح مع بيانات دفع مختلفة يرفض WHGPG الطلب برمز HTTP 409.

الاستعلام عن حالة الدفع

GET https://www.whgpg.odwyah.com/api/v1/payments/PAY-20260830-XXXXXXX

curl https://www.whgpg.odwyah.com/api/v1/payments/PAY-20260830-XXXXXXX \ -H "Accept: application/json" \ -H "X-WHGPG-Unique-ID: YOUR_UNIQUE_ID" \ -H "X-WHGPG-API-Hash: YOUR_API_HASH"

الاستجابة

{ "success": true, "id": "PAY-20260830-XXXXXXX", "status": "completed", "amount": "1.000", "currency": "BHD", "processor": "sandbox", "processor_environment": "test", "settlement_status": "settled", "refunded_amount": "0.000" }

Webhooks

يرسل WHGPG طلب JSON موقعاً بعد وصول دفعة API إلى حالة نهائية.

{ "event": "payment.completed", "merchant_id": "WHGPG-M-2608-XXXXXX", "payment_id": "PAY-20260830-XXXXXXX", "reference": "ORDER-1001", "status": "completed", "amount": "1.000", "currency": "BHD", "payment_method": "benefitpay", "transaction_id": "SBX-TXN-...", "invoice_id": "SBX-INV-...", "processor": "sandbox", "settlement_status": "settled", "refunded_amount": "0.000", "paid_at": "2026-08-30T15:54:54+03:00" }

ترويسات Webhook

X-WHGPG-Event: payment.completed X-WHGPG-Delivery-ID: 550e8400-e29b-41d4-a716-446655440000 X-WHGPG-Timestamp: 1788094494 X-WHGPG-Signature: sha256=...

تحقق من توقيع HMAC-SHA256 على timestamp ثم نقطة ثم نص الطلب الخام كما استلمته تماماً.

$signed = $timestamp . '.' . $rawRequestBody; $expected = 'sha256=' . hash_hmac('sha256', $signed, $webhookSecret); $valid = hash_equals($expected, $_SERVER['HTTP_X_WHGPG_SIGNATURE'] ?? '');

لمنع إعادة الإرسال، ارفض التوقيتات القديمة واحفظ Delivery ID للطلبات التي تمت معالجتها.

أمثلة الربط

نزّل نموذج PHP مستقل لموقع التاجر أو استخدم أمثلة الربط من الخادم أدناه.

تنزيل نموذج تاجر PHP

Laravel / PHP

$response = Http::withHeaders([ 'X-WHGPG-Unique-ID' => env('WHGPG_UNIQUE_ID'), 'X-WHGPG-API-Hash' => env('WHGPG_API_HASH'), 'Idempotency-Key' => 'ORDER-1001', ])->post('https://www.whgpg.odwyah.com/api/v1/payments', [ 'amount' => '10.000', 'reference' => 'ORDER-1001', 'return_url' => 'https://merchant.example/payment/return', ]); return redirect()->away($response['payment_url']);

JavaScript

احتفظ بـ Unique ID وAPI Hash في خادمك فقط ولا تعرضهما في JavaScript داخل المتصفح.

// Run this on your server, not in browser JavaScript. const response = await fetch('https://www.whgpg.odwyah.com/api/v1/payments', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'X-WHGPG-Unique-ID': process.env.WHGPG_UNIQUE_ID, 'X-WHGPG-API-Hash': process.env.WHGPG_API_HASH, 'Idempotency-Key': 'ORDER-1001' }, body: JSON.stringify({amount:'10.000',reference:'ORDER-1001',return_url:'https://merchant.example/payment/return'}) });

Sandbox

يستخدم Sandbox نفس API ومسار الدفع بدون نقل أموال حقيقية.

BenefitPayBenefit debitVisa / MastercardApple Pay

طرق الدفع في Sandbox محاكاة فقط ولا يتم الاتصال ببنك أو شبكة بطاقات حقيقية.

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

CompletedFailedCancelledWebhook retryIdempotency replay

حدود الاستخدام

يطبق WHGPG حدوداً منفصلة لكل تاجر في الدقيقة واليوم، وتوضح ترويسات الاستجابة المتبقي في حد الدقيقة.

X-RateLimit-Limit: 60 X-RateLimit-Remaining: 59 Retry-After: 42

يمكن للإدارة تحديد الحدود لكل تاجر، ويحتوي HTTP 429 على Retry-After.

رموز حالة HTTP

{ "success": false, "code": "INVALID_API_CREDENTIALS", "message": "Invalid WHGPG API credentials.", "request_id": "550e8400-e29b-41d4-a716-446655440000" }
HTTPCodeالمعنى
201-تم إنشاء عملية الدفع بنجاح.
401INVALID_API_CREDENTIALSبيانات WHGPG مفقودة أو غير صحيحة.
403MERCHANT_API_INACTIVEAPI التاجر أو بوابة الدفع غير مفعلة.
404PAYMENT_NOT_FOUNDعملية الدفع المطلوبة غير موجودة لهذا التاجر.
409IDEMPOTENCY_KEY_REUSEDتم استخدام Idempotency-Key نفسه مع بيانات دفع مختلفة.
422VALIDATION_ERRORخطأ في البيانات أو وسيلة الدفع المطلوبة غير متاحة.
429RATE_LIMIT_EXCEEDEDتم تجاوز حد استخدام API الخاص بالتاجر.
502PROCESSOR_ERRORتعذر على WHGPG إنشاء أو التحقق من الدفعة عبر المعالج المهيأ.