الرئيسية / المطورون
توثيق تكامل التجار

واجهة برمجية للتحصيل والدفع، تكامل في خطوات قليلة

واجهة موحدة عبر HTTP وJSON، مع توقيع والتحقق عبر SHA-256، وإشعارات غير متزامنة، وإمكانية الاستعلام اليدوي عن الطلبات. يغطي هذا الدليل قواعد التوقيع وجميع حقول الواجهة وأمثلة الطلبات.

نظرة عامة

تقدّم India Payme للتجار قدرتين أساسيتين في المعاملات: التحصيل (Payin) — تحصيل المبالغ من المستخدم النهائي نيابة عن التاجر؛ والدفع (Payout) — تحويل الأموال إلى حساب محدد نيابة عن التاجر. جميع الواجهات الخارجية تُستدعى عبر POST بصيغة JSON، ويجب أن تتضمن توقيعًا للواجهة البرمجية (API). بعد معالجة الطلب، تُرسل المنصة إشعارًا غير متزامن إلى التاجر، كما تتيح إمكانية الاستعلام اليدوي عن حالة الطلب.

الوظيفةالطريقةالمسار
إنشاء طلب تحصيلPOST/transaction/payin/v1/apply
الاستعلام عن طلب تحصيلPOST/transaction/payin/v1/query
إنشاء طلب دفعPOST/transaction/payout/v1/apply
الاستعلام عن طلب دفعPOST/transaction/payout/v1/query
الاستعلام عن الرصيدPOST/transaction/payout/v1/balance

العنوان الأساسي (يُرجى الاعتماد على نطاق بوابة الإنتاج الذي تقدّمه المنصة بعد فتح الحساب):

https://{نطاق البوابة}

التحضير للتكامل

سجّل الدخول إلى لوحة تحكم التاجر ← مفاتيح التطبيق، حيث يمتلك كل تطبيق زوجًا من بيانات الاعتماد: appKey وappSecret. علمًا بأن appKey هو نفسه ترويسة الطلب appId؛ أما appSecret فهو مفتاح التوقيع، ويُستخدم فقط لحساب التوقيع محليًا، ولا يُرسل ضمن الطلب.

يجب أن تحتوي جميع الطلبات على ترويسات HTTP التالية، مع تعيين Content-Type إلى application/json:

Headerإلزاميالوصف
appIdنعممعرّف تطبيق التاجر (وهو appKey)
timestampنعمطابع زمني Unix بالمللي ثانية
nonceنعمسلسلة عشوائية، لا تقل عن 10 خانات، تُستخدم مرة واحدة فقط ولا يمكن إعادة استخدامها
signنعمالتوقيع المحسوب وفق القواعد الموضحة في القسم التالي

قواعد التوقيع

خوارزمية التوقيع هي SHA-256 مباشرةً (بصيغة سداسية عشرية بأحرف صغيرة)، وليست HMAC. يُضاف appSecret مباشرة في نهاية السلسلة المراد توقيعها، ثم تُحسب قيمة SHA-256 للسلسلة الناتجة. الخطوات:

  1. اجمع «الحقول العلوية من جسم الطلب (غير الفارغة فقط)» مع «ترويسات التوقيع appId وtimestamp وnonce» في خريطة (Map) واحدة (لا يشارك sign نفسه في هذه العملية)؛
  2. رتّب أسماء المعاملات تصاعديًا وفق ترميز ASCII، وادمجها بصيغة key1=value1&key2=value2…؛
  3. أضف appSecret مباشرة في النهاية (دون أي فاصل)، ثم احسب SHA-256 بصيغة سداسية عشرية بأحرف صغيرة للسلسلة الكاملة للحصول على sign.
# السلسلة المراد توقيعها signString = "key1=value1&key2=value2…&keyN=valueN" + appSecret sign = SHA256_HEX(signString) // سداسي عشري بأحرف صغيرة

مدة الصلاحية ومنع إعادة التشغيل:

  • صلاحية الطابع الزمني 30 ثانية: |وقت الخادم − timestamp| ≤ 30s، وفي حال التجاوز يُعاد timestamp has expired. يُرجى التأكد من مزامنة الساعة (NTP) بين العميل والبوابة.
  • منع إعادة التشغيل عبر nonce: لا يمكن استخدام نفس الـ nonce إلا مرة واحدة، وتكراره يؤدي إلى الخطأ nonce has been used (رمز الخطأ 900).
  • الحقول ذات القيمة الفارغة لا تشارك في التوقيع — يجب أن تتطابق «مجموعة الحقول المشمولة بالتوقيع» تمامًا مع «حقول JSON المُرسلة فعليًا».

مثال على التوقيع بلغة Node.js:

const crypto = require('crypto'); function buildSign(appId, appSecret, timestamp, nonce, body) { const params = { ...body, appId, timestamp, nonce }; const signString = Object.keys(params) .filter(k => params[k] !== null && params[k] !== undefined) .sort() .map(k => `${k}=${params[k]}`) .join('&') + appSecret; return crypto.createHash('sha256').update(signString, 'utf8').digest('hex'); }

إنشاء طلب تحصيل POST

POST /transaction/payin/v1/apply — ينشئ طلب تحصيل ويعيد رابط صفحة الدفع payUrl لتوجيه المستخدم لإتمام عملية الدفع.

الحقلالنوعإلزاميالوصف
merchantOrderNostringنعمرقم طلب التاجر، ويجب ألا يتكرر
amountnumberنعممبلغ الطلب، رقم عشري (مثل 100.02)
namestringنعماسم المستخدم. بأحرف إنجليزية فقط، لا يقل عن 3 أحرف، يمكن أن يحتوي على مسافات، دون رموز أو أرقام
phonestringنعمرقم الجوال
emailstringنعمالبريد الإلكتروني
currencystringنعمالعملة: INR / PKR / USDT / BDT
productstringنعمرمز منتج الدفع، تُصدره المنصة وفق اتفاقية التعاقد
notifyUrlstringلاعنوان الإشعار غير المتزامن؛ في حال عدم إرساله تُستخدم عنوان الإشعار الافتراضي للتاجر
returnUrlstringلاصفحة إعادة التوجيه بعد نجاح الدفع
payTypestringلاطريقة الدفع المباشر عبر المحفظة: JAZZCASH / EASYPAISA / BKASH / NAGAD
POST /transaction/payin/v1/apply { "merchantOrderNo": "ORD1751731200123", "amount": "600.00", "currency": "INR", "product": "{رمز المنتج}", "name": "John Doe", "phone": "9910099100", "email": "john@example.com", "notifyUrl": "https://shop.example/pay/notify" }
// الاستجابة { "code": 0, "msg": "Success", "data": { "orderNo": "P1751731200999", "merchantOrderNo": "ORD1751731200123", "amount": 600, "currency": "INR", "payUrl": "https://{نطاق صفحة الدفع}/cashier/xxxx", "payStatus": 0 } }

بعد الحصول على payUrl، وجّه المستخدم للانتقال إليه لإتمام الدفع، وتُعتمد الإشعارات غير المتزامنة كمرجع نهائي للنتيجة.

إنشاء طلب دفع POST

POST /transaction/payout/v1/apply — يبدأ عملية دفع إلى حساب محدد. معالجة غير متزامنة: تقوم الواجهة أولًا بالتحقق من الحساب وتجميد المبلغ، ثم تُطابق القناة المناسبة للدفع بشكل غير متزامن، وعادة ما تكون الاستجابة الأولية payStatus=0 (تم القبول)، وتُعتمد نتيجة الاستعلام أو الإشعار كحالة نهائية.

الحقلالنوعإلزاميالوصف
merchantOrderNostringنعمرقم طلب التاجر
amountnumberنعممبلغ الدفع، الحد الأدنى 100.00
accountNamestringنعماسم المستفيد. بأحرف إنجليزية فقط، لا يقل عن 3 أحرف، يمكن أن يحتوي على مسافات
accountstringنعمرقم حساب المستفيد
phonestringنعمرقم الجوال
emailstringنعمالبريد الإلكتروني
currencystringنعمالعملة: INR / PKR / USDT / BDT
bizCodestringنعمنوع عملية الدفع: IMPS / UPI / BANK / JAZZCASH / EASYPAISA / BKASH / NAGAD / ECARD
payCodestringنعمطريقة الدفع: CARD / WALLET / NBK / ITT / VC
branchCodestringنعمرمز التسوية: بالنسبة للهند أدخل IFSC؛ ولباكستان أدخل bankcode؛ ولبنغلاديش يُحدَّد وفق bizCode
productstringنعمرمز منتج الدفع، تُصدره المنصة
bankNamestringلااسم البنك
swiftCodestringلارمز SWIFT (يُستخدم مع التحويل البرقي الدولي ITT)
POST /transaction/payout/v1/apply { "merchantOrderNo": "PO1751731200123", "amount": "1500.00", "currency": "INR", "product": "{رمز المنتج}", "accountName": "John Doe", "account": "1234567890", "bizCode": "IMPS", "payCode": "NBK", "branchCode": "HDFC0000001", "bankName": "HDFC", "phone": "9910099100", "email": "john@example.com" }

الاستعلام عن الطلبات POST

للتحصيل POST /transaction/payin/v1/query، وللدفع POST /transaction/payout/v1/query. مرِّر merchantOrderNo أو orderNo لتحديد الطلب. الحد الأقصى 5 طلبات/ثانية.

POST /transaction/payin/v1/query { "merchantOrderNo": "ORD1751731200123" }
// بيانات الاستجابة (data) { "orderNo": "P1751731200999", "merchantOrderNo": "ORD1751731200123", "amount": 600, "realAmount": 600, "currency": "INR", "payStatus": 1 // 0 قيد المعالجة / 1 تم التحصيل / -1 ملغى }

الاستعلام عن الرصيد POST

POST /transaction/payout/v1/balance — للاستعلام عن رصيد حساب التاجر. الحد الأقصى 5 طلبات/ثانية.

POST /transaction/payout/v1/balance { "currency": "INR" }
// بيانات الاستجابة (data) { "accountNo": "ACC0001", "currency": "INR", "balance": 100000.00, // الرصيد الإجمالي "balanceActive": 98500.00, // الرصيد المتاح "balanceFreeze": 1500.00 // الرصيد المجمَّد }

الإشعارات غير المتزامنة

عند وصول الطلب إلى حالته النهائية، تُرسل المنصة إشعارًا عبر POST (بصيغة JSON) إلى notifyUrl الخاص بالتاجر (وفي حال عدم إرساله يُستخدم العنوان الافتراضي للتاجر)، مصحوبًا بنفس ترويسات التوقيع (appId/timestamp/nonce/sign). ويجب على التاجر إعادة حساب التوقيع بنفس القواعد باستخدام appSecret الخاص به ومطابقته للتحقق من صحة الإشعار.

رسالة إشعار التحصيل تتضمن: merchantOrderNo، orderNo، currency، product، amount، realAmount، status (القيمة "1" تعني نجاح التحصيل). أما إشعار الدفع فيتضمن إضافة إلى ذلك utr (الرقم المرجعي المصرفي) وstatusDes (وصف الحالة)، حيث تكون status إما "1" للنجاح أو "2" للفشل.

// مثال على جسم إشعار التحصيل { "merchantOrderNo": "ORD1751731200123", "orderNo": "P1751731200999", "currency": "INR", "product": "{رمز المنتج}", "amount": "600.00", "realAmount": "600.00", "status": "1" }

يجب أن يُعيد التاجر نصًا صرفًا يحتوي على OK أو success (دون تمييز حالة الأحرف). وإلا تدخل المنصة في طابور إعادة المحاولة: بحد أقصى 5 مرات، بفواصل زمنية متزايدة بالدقائق (1 / 2 / 5 / 10 / 30 / 60 / 120). لذلك يجب أن تضمن واجهة التاجر خاصية الاتساق عند التكرار (idempotency) (قد يُرسل نفس orderNo أكثر من مرة).

حالات الطلب

يعتمد تكامل التاجر على الحالات الخارجية التالية (بينما آلة الحالة الداخلية أكثر تفصيلًا ولا تُعرض مباشرة):

السيناريوالحقلالقيم الممكنة
استجابة قبول الطلبpayStatus0 تم الإنشاء / 1 ناجح / 2 فاشل / 3 ملغى
الاستعلام عن طلب تحصيلpayStatus0 قيد المعالجة / 1 تم التحصيل / -1 ملغى
الاستعلام عن طلب دفعpayStatus0 بانتظار الدفع / 1 تم الدفع / -1 ملغى
الإشعار غير المتزامنstatusنجاح التحصيل "1"؛ الدفع: "1" نجاح / "2" فشل

رموز الأخطاء

عندما يكون code != 0 في نص الاستجابة فهذا يعني الفشل، وتوضّح msg رسالة الخطأ. أشيع رموز الأخطاء التجارية:

codeالوصف
0نجاح
400خطأ في المعاملات / فشل التحقق من التوقيع (Sign invalid)
900طلب مكرر / إعادة استخدام nonce
10000 / 10001التطبيق غير موجود / التطبيق غير متاح
10002العملة غير مدعومة
10003 / 10007التاجر غير متاح / حساب التاجر غير متاح
10004المنتج غير مفعّل أو انتهت صلاحية الاتفاقية
10005 / 10009لا توجد قناة متاحة حاليًا / القناة غير متاحة مؤقتًا
10008رصيد الحساب غير كافٍ
10010عنوان IP غير مدرج في القائمة البيضاء
10011 / 10012المنتج غير صالح / طريقة الدفع غير صالحة
10020رقم طلب التاجر مكرر
30001 / 30002رقم الطلب غير صحيح / العملة غير صحيحة أو الحساب غير مفعّل

مثال كامل لسير التكامل

على سبيل المثال، عملية التحصيل:

  1. جهّز جسم الطلب التجاري (راجع حقول «إنشاء طلب تحصيل»).
  2. أنشئ timestamp (بالمللي ثانية) وnonce (سلسلة عشوائية لا تقل عن 10 خانات).
  3. احسب sign وفق «قواعد التوقيع».
  4. أرسل طلب POST /transaction/payin/v1/apply مع ترويسات التوقيع الأربع + جسم JSON.
  5. إذا كانت code==0 فاستخدم data.payUrl لتوجيه المستخدم لإتمام الدفع.
  6. استمع للإشعارات غير المتزامنة؛ ويمكن أيضًا الاستعلام يدويًا للتحقق من الحالة النهائية.
  7. عند استلام الإشعار، تحقق من التوقيع، ونفّذ المعالجة التجارية، ثم أعد نصًا صرفًا بقيمة OK.

ملاحظة: تتطابق مسارات الواجهات والحقول ورموز الحالة في هذا الدليل مع التطبيق الفعلي في الإنتاج؛ أما نطاق بوابة الإنتاج ورموز product المتاحة وسياسة القائمة البيضاء لعناوين IP وغيرها، فتُعتمد وفق ما تقدّمه المنصة بعد فتح الحساب.

احصل على المفاتيح وابدأ البناء

افتح حسابك أونلاين لتحصل على بيانات اعتماد الاختبار ورموز المنتجات، وبعد التأكد من عملها في البيئة التجريبية يمكنك التبديل إلى الإنتاج بنقرة واحدة.