RugWard Pay
مرجع REST API
كل نقاط نهاية التاجر في RugWard Pay مع أمثلة الطلبات والاستجابات، والمصادقة بمفتاح API، والأخطاء، والحدود، وأكواد بلغات curl وNode.js وPython وPHP.
في هذه الصفحة
الأساسيات#
| العنوان الأساسي | https://rugward.com |
| الصيغة | JSON في الطلب والاستجابة. أرسل Content-Type: application/json مع كل جسم طلب (وإلا 415). حجم الجسم محدود ببضعة كيلوبايتات. |
| المصادقة | مفتاح API في Authorization: Bearer rwp_… أو x-api-key: rwp_… |
| المبالغ | الدولار كنص بحدّ أقصى منزلتين عشريتين ("25"، "25.50")؛ ومبالغ العملات نصوص عشرية |
| الأوقات | ميلي ثانية بتوقيت Unix (createdAt، expiresAt، paidAt) |
| الأخطاء | {"error": "رسالة مقروءة"}، وأحيانًا مع "retry": true |
من خادم إلى خادم فقط. احتفظ بمفتاح API على خادمك. لا تستطيع المتصفحات استدعاء واجهة التاجر بمفتاح (الطلبات عبر النطاقات غير مسموحة)، والمفتاح الموضوع في صفحة ويب يصبح علنيًا.
مفاتيح API#
أنشئ المفاتيح في اللوحة تحت API keys (يتطلب تسجيل الدخول). يبدو المفتاح هكذا: rwp_ متبوعًا بـ 40 حرفًا ورقمًا، ويظهر مرة واحدة فقط: انسخه فورًا إلى مخزن الأسرار على خادمك. لا يحتفظ RugWard إلا ببصمة SHA-256، فلا يمكن عرض مفتاح مفقود مرة أخرى: أنشئ مفتاحًا جديدًا وألغِ القديم. حتى 10 مفاتيح لكل تاجر؛ وتعرض اللوحة بادئة كل مفتاح وآخر استخدام له.

ما يستطيع المفتاح فعله وما لا يستطيعه:
| المفتاح يستطيع | المفتاح لا يستطيع |
|---|---|
| إنشاء الفواتير وسردها وقراءتها وإلغاؤها | تغيير الإعدادات أو عناوين الاستلام |
| إنشاء روابط الدفع وسردها وإيقافها | إنشاء مفاتيح API أو سردها أو إلغاؤها |
| تغيير إشعار Webhook أو قراءته أو قراءة سرّه | |
| إنشاء فواتير تجريبية |
لذلك لا يستطيع مفتاحٌ مسرَّب إعادة توجيه أموالك: لا تتغير عناوين الاستلام إلا بتسجيل الدخول بمحفظتك.
نقاط النهاية#
| الطريقة والمسار | المصادقة | الغرض |
|---|---|---|
POST /api/pay/merchant/invoices | مفتاح أو جلسة | إنشاء فاتورة |
GET /api/pay/merchant/invoices | مفتاح أو جلسة | سرد الفواتير، الأحدث أولًا، 50 في الصفحة |
GET /api/pay/merchant/invoices/:id | مفتاح أو جلسة | قراءة فاتورة مع عروض الأسعار والمدفوعات (ويعيد فحص السلسلة أيضًا) |
POST /api/pay/merchant/invoices/:id/cancel | مفتاح أو جلسة | إلغاء فاتورة مفتوحة بلا مدفوعات |
GET /api/pay/merchant/links | مفتاح أو جلسة | سرد روابط الدفع |
POST /api/pay/merchant/links | مفتاح أو جلسة | إنشاء رابط دفع أو إيقافه |
GET /api/pay/proof/:id | عام | إثبات الدفع (للفواتير paid أو overpaid فقط) |
تُدار الإعدادات ومفاتيح API وإشعار Webhook والمدفوعات غير المطابقة من اللوحة (بجلسة المحفظة فقط).
إنشاء فاتورة#
POST /api/pay/merchant/invoices
| الحقل | النوع | إلزامي | القواعد |
|---|---|---|---|
amountUsd | نص أو رقم | نعم | من 1 إلى 50000، بحدّ أقصى منزلتين عشريتين |
orderId | نص | لا | من 1 إلى 64 محرفًا: أحرف وأرقام و. _ - : # / |
description | نص | لا | حتى 200 محرف، ويظهر للمشتري |
redirectUrl | نص | لا | رابط https:// (حتى 500 محرف)، ويظهر بعد الدفع |
expiresMin | عدد صحيح | لا | من 15 إلى 10080 (7 أيام)؛ الافتراضي 60 |
curl -X POST https://rugward.com/api/pay/merchant/invoices \
-H "Authorization: Bearer $RUGWARD_PAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"amountUsd": "25.00",
"orderId": "1234",
"description": "1 x T-shirt, size M",
"redirectUrl": "https://shop.example/thanks?order=1234",
"expiresMin": 60
}'{
"id": "Zx3kQ8pL2mN7vR1tY5wB9c",
"url": "https://rugward.com/pay/i/Zx3kQ8pL2mN7vR1tY5wB9c",
"status": "open",
"expiresAt": 1793326882069,
"assets": ["BTC", "ETH-8453", "USDC-8453", "USDT-56", "SOL", "USDC-SOL"]
}أرسل المشتري إلى url. وتسرد assets معرّفات الأصول التي يستطيع المشتري الاختيار منها (عملاتك المفعّلة التي لها عنوان استلام).
الطلب نفسه بلغات أخرى:
// Never put the API key in a browser page: call RugWard Pay from your server.
const res = await fetch("https://rugward.com/api/pay/merchant/invoices", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RUGWARD_PAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ amountUsd: "25.00", orderId: "1234", expiresMin: 60 }),
});
const body = await res.json();
if (!res.ok) throw new Error(body.error);
// Save body.id with your order, then send the buyer to body.url
console.log(body.id, body.url);import os, requests
r = requests.post(
"https://rugward.com/api/pay/merchant/invoices",
headers={"Authorization": f"Bearer {os.environ['RUGWARD_PAY_KEY']}"},
json={"amountUsd": "25.00", "orderId": "1234", "expiresMin": 60},
timeout=15,
)
data = r.json()
if r.status_code != 201:
raise RuntimeError(data.get("error"))
print(data["id"], data["url"]) # store the id, redirect the buyer to the url<?php
$ch = curl_init("https://rugward.com/api/pay/merchant/invoices");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("RUGWARD_PAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["amountUsd" => "25.00", "orderId" => "1234", "expiresMin" => 60]),
]);
$data = json_decode(curl_exec($ch), true);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 201) { throw new Exception($data["error"] ?? "RugWard Pay error"); }
header("Location: " . $data["url"]); // send the buyer to the hosted checkoutقراءة فاتورة#
GET /api/pay/merchant/invoices/:id. قراءة الفاتورة تفحص البلوك تشين أيضًا بحثًا عن مدفوعات جديدة، لذا فهذا هو الاستدعاء المناسب لتأكيد الدفع قبل الشحن (إلى جانب إشعارات Webhook).
curl https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"{
"invoice": {
"id": "Zx3kQ8pL2mN7vR1tY5wB9c",
"status": "paid",
"amountUsd": "25.00",
"orderId": "1234",
"description": "1 x T-shirt, size M",
"redirectUrl": "https://shop.example/thanks?order=1234",
"createdAt": 1793323282069,
"expiresAt": 1793326882069,
"paidAt": 1793324100512,
"assets": ["BTC", "ETH-8453", "USDC-8453", "USDT-56", "SOL", "USDC-SOL"],
"test": false,
"quotes": [
{
"id": 4711,
"asset": "USDC-8453",
"amount": "25.000629",
"rateUsd": "1",
"address": "0xYourMerchantAddress…",
"expiresAt": 1793325082069
}
],
"payments": [
{
"txid": "0x…",
"asset": "USDC-8453",
"amount": "24.875626",
"confirmations": 30,
"required": 30,
"confirmed": true,
"seenAt": 1793324012000,
"explorer": "https://basescan.org/tx/0x…"
}
]
}
}quotes: إدخال لكل عملة اختارها المشتري (المبلغ والسعر وعنوان الاستلام وانتهاء تثبيت السعر).payments: كل معاملة رُصدت لهذه الفاتورة معconfirmationsوالعدد المطلوبrequiredوconfirmed.- في مدفوعات عقد التقسيم على Base تكون
amountهي ما وصل إليك (99.5%).
سرد الفواتير#
GET /api/pay/merchant/invoices?before=<createdAt>: 50 في الصفحة، الأحدث أولًا. للصفحة التالية مرّر قيمة createdAt لآخر فاتورة استلمتها.
curl "https://rugward.com/api/pay/merchant/invoices" \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"
# next page: pass the createdAt of the last invoice you received
curl "https://rugward.com/api/pay/merchant/invoices?before=1793323282069" \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"{
"invoices": [
{
"id": "Zx3kQ8pL2mN7vR1tY5wB9c",
"status": "open",
"amountUsd": "25.00",
"orderId": "1234",
"description": "1 x T-shirt, size M",
"createdAt": 1793323282069,
"expiresAt": 1793326882069,
"paidAt": null
}
]
}إلغاء فاتورة#
POST /api/pay/merchant/invoices/:id/cancel (بلا جسم). يعمل فقط ما دامت الفاتورة open ولم تُرصد أي دفعة؛ وإلا 409.
curl -X POST https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c/cancel \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"
# 200 {"ok":true}
# 409 {"error":"Only your open invoices without payments can be canceled."}روابط الدفع#
POST /api/pay/merchant/links مع {amountUsd, description?, redirectUrl?} يُنشئ رابطًا قابلًا لإعادة الاستخدام؛ و{"deactivate": "<link id>"} يوقف رابطًا. وGET يسرد حتى 100 رابط مع uses وactive وcreatedAt. يجب قبول شروط التاجر أولًا. راجع روابط الدفع.
curl -X POST https://rugward.com/api/pay/merchant/links \
-H "Authorization: Bearer $RUGWARD_PAY_KEY" \
-H "Content-Type: application/json" \
-d '{"amountUsd": "15", "description": "Monthly membership", "redirectUrl": "https://shop.example/welcome"}'
# 201 {"id":"k33JZ0ij5F2yLDprwrQgjN","url":"https://rugward.com/pay/l/k33JZ0ij5F2yLDprwrQgjN"}
# list your links
curl https://rugward.com/api/pay/merchant/links -H "Authorization: Bearer $RUGWARD_PAY_KEY"
# turn one off
curl -X POST https://rugward.com/api/pay/merchant/links \
-H "Authorization: Bearer $RUGWARD_PAY_KEY" -H "Content-Type: application/json" \
-d '{"deactivate": "k33JZ0ij5F2yLDprwrQgjN"}'الأخطاء#
{ "error": "Amount in USD, e.g. 25 or 25.50." }
// some temporary errors also carry "retry": true| HTTP | المعنى | ما يجب فعله |
|---|---|---|
| 400 | مدخلات غير صالحة (تذكر الرسالة الحقل) | صحّح الطلب |
| 401 | مفتاح API مفقود أو غير صالح | تحقّق من المفتاح؛ ربما أُلغي |
| 403 | طلب عبر نطاق آخر مرفوض، أو شروط التاجر غير مقبولة، أو الحساب معلّق، أو الإجراء غير مسموح للمفاتيح | اقرأ الرسالة |
| 404 | غير موجود أو لا يخصك | تحقّق من المعرّف |
| 409 | تعارض (مثل إلغاء فاتورة مدفوعة، أو وجود 100 رابط نشط) | اقرأ الرسالة |
| 415 | الجسم ليس JSON | أرسل Content-Type: application/json |
| 429 | تجاوز حد المعدل، أو 500 فاتورة في الساعة الأخيرة | انتظر وأعد المحاولة مع تأخير متزايد |
| 451 | غير متاح في منطقتك | — |
503 مع "retry": true | تعذّر الوصول مؤقتًا إلى بلوك تشين أو مصدر أسعار | أعد المحاولة بعد بضع ثوانٍ |
الحدود#
- معدل الطلبات: نحو 20 طلبًا في الدقيقة لكل عنوان IP عبر كل نقاط
/api/pay/*، إضافةً إلى سقف 30 في الدقيقة لكل مجموعة نقاط نهاية. استخدم إشعارات Webhook بدل الاستطلاع المتكرر؛ وإن استطلعت فمرة في الدقيقة لكل فاتورة مفتوحة تكفي. - الفواتير: 500 لكل تاجر في الساعة.
- روابط الدفع: 100 رابط نشط لكل تاجر؛ وكل رابط يُنشئ 100 فاتورة في الساعة كحد أقصى.
قائمة التحقق للتكامل#
- أنشئ الفاتورة من خادمك عندما يُتمّ العميل الطلب؛ واحفظ
idمع طلبك. - أعد توجيه العميل إلى
url. - عند
invoice.paidأوinvoice.overpaid(Webhook) تحقّق من التوقيع، ثم أعد قراءة الفاتورة عبرGET /api/pay/merchant/invoices/:idوتحقّق منstatusوamountUsdقبل الشحن. - تعامل مع
underpaidوlateوexpired(راجع الحالات). - اجعل معالجك متساوي الأثر (idempotent): قد يصل الحدث نفسه أكثر من مرة.
آخر تحديث: 30 أكتوبر 2026