ما يمكنك استقباله
استخدم شبكة Ethereum الرئيسية. تحتاج رموز ERC-20 الموثّقة مثل USDC وUSDT إلى ETH في كل عنوان إرسال عند نقلها لاحقًا. قد يعرض استيراد عبارة الاسترداد في MetaMask الحساب الأول فقط.
أعدّ متجرك
- ثبّت Wholly Crypto وأنشئ مشروعًا ومتجرًا واحتفظ بنسخة محفظة احتياطية خاصة.
- افحص الاتصالات المتوافقة مع الماسح وفعّل الشبكة والأصول المطلوبة في المتجر ← طرق الدفع.
- اضبط التأكيدات والانتهاء. جرّب فاتورة صغيرة وتحقّق من التسوية قبل تنفيذ الطلبات.
أين تصل مدفوعاتك
تحصل كل فاتورة على عنوان استقبال جديد. تغطي نسختك الاحتياطية المفاتيح المشتقة، لكن استيراد كلمات الاسترداد في MetaMask قد يعرض الحساب الأول فقط. احتفظ بتفاصيل العناوين والاشتقاق أيضًا.
دليل إعداد المحفظةانقل الأموال عندما تكون جاهزًا
استخدم التجميع التلقائي لنقل المدفوعات الواردة إلى وجهة واحدة. يحتاج كل عنوان يحتوي رموزًا إلى ETH للإرسال. يمكن لتمويل الغاز من المشروع تزويد العناوين المؤهلة ضمن حدودك؛ لا تُموّل عناوين الفواتير الفارغة غير المدفوعة.
دليل التجميع التلقائيهل يمكن استقبال USDT وUSDC على العنوان نفسه؟
يمكن للمحفظة الاحتفاظ بكليهما، لكن لكل فاتورة وسائل دفع ومبلغ خاصان بها. فعّل عقود Ethereum المحددة في المتجر. لا تستبدل رمزًا بآخر يحمل الاختصار نفسه على شبكة أخرى.
استكشاف مشكلات الدفع
افحص هذه الشبكة أولًا
تحقق من شبكة Ethereum الرئيسية وعقد الرمز الدقيق. لا يستطيع رصيد الرمز دفع غازه بنفسه؛ يحتاج كل عنوان إرسال إلى ETH على Ethereum.
دفعة مفقودة أومتأخرة
طابق الشبكة والعنوان والأصل وأي مرجع مطلوب مع الفاتورة. افحص جاهزية الماسح وتقدم التأكيد. لا تطلب دفعة ثانية قبل فحص المعاملة الأولى.
دليل الاستقبالاستعادة المحافظ أوتجميعها
احتفظ بنسختك الخاصة وتفاصيل الاشتقاق. قد لا يعرض تطبيق محفظة آخر كل عناوين الاستقبال. يعتمد الإرسال والاسترداد على الشبكة وتنسيق المحفظة؛ ولا يضمن استيراد كلمات الاسترداد وحده أيًا منهما.
النسخ الاحتياطي والاستعادةالرسوم والتحقّق
رسوم المعالجة الافتراضية 1% من قيمة الفاتورة النقدية، تُدفع من رصيد منفصل. تنطبق النسبة المحددة لك. رسوم الشبكة وتكاليف الخادم منفصلة.
قد تتعرض المزوّدات العامة لانقطاعات أوحدود طلبات. ليست المعاملة المُرسلة أوإعادة التوجيه للعودة إثبات دفع. استخدم حالة الفاتورة المتحقّق منها والإشعارات الموقّعة.
رصيد المعالجة API وIPN وwebhooksحاسبة أسعار الصرف
حوّل مبلغًا
تقدير، وليس عرض دفع. لا يشمل رسوم الشبكة أو منصة التداول أو هوامش التاجر.
من أين تأتي الأسعار؟
تستخدم تقديرات العملات المشفّرة أسعار Kraken العامة المخزّنة مؤقتًا، مع Binance حيث تتوفر. تستخدم بعض أسعار Binance عملة USDT مرجعًا للدولار. تأتي أسعار العملات النقدية من Frankfurter، وهي أسعار مرجعية يومية وليست عروض تداول مباشرة.
تتحدث البيانات تلقائيًا. راجع تواريخ المصادر أسفل النتيجة. يبقى المبلغ المُدخل في متصفحك. إدراج أصل لا يضمن دعمه للدفع.
Kraken · Binance · Frankfurter · أسماء الأصول وأيقوناتها: CoinGecko
أنشئ فاتورة عبر API
شغّل هذه الأمثلة على خادمك. استبدل مضيف API ومعرّف المشروع والمتجر، واحتفظ ببيانات الاعتماد خاصة. المبالغ نصوص عشرية.
فعّل الطريقة في المتجر أولًا. يضيّق الاختيار الطرق المفعّلة ولا يضيف أصولًا. إذا لم يطابق شيء تُطبّق افتراضيات المتجر. افحص الطرق المرتجعة قبل عرض الدفع.
: "${WHOLLY_TOKEN:?Set WHOLLY_TOKEN to your server-side API token}"
# Keep this key and the exact body for retries; use a new key for each new invoice.
curl --fail-with-body --max-time 30 \
--request POST \
--url "https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices" \
--header "Authorization: Bearer $WHOLLY_TOKEN" \
--header 'Idempotency-Key: order-1042-attempt-1' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}'// Node.js 18+ · run on your server, never in browser code.
const token = process.env.WHOLLY_TOKEN;
if (!token) throw new Error("Set WHOLLY_TOKEN");
// Keep this key and the exact body for retries; use a new key for each new invoice.
const body = `{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}`;
const response = await fetch("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices", {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
},
body,
redirect: "error",
signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());<?php
// PHP 8+ with the cURL extension; run on your server.
$token = getenv('WHOLLY_TOKEN');
if (!$token) { throw new RuntimeException('Set WHOLLY_TOKEN'); }
// Keep this key and the exact body for retries; use a new key for each new invoice.
$body = <<<'JSON'
{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}
JSON;
$ch = curl_init("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, "Idempotency-Key: order-1042-attempt-1", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
if ($status < 200 || $status >= 300) { throw new RuntimeException("HTTP $status: $response"); }
print_r(json_decode($response, true, 512, JSON_THROW_ON_ERROR));# Python 3 · standard library; run on your server.
import json
import os
from urllib.request import Request, build_opener, HTTPRedirectHandler
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
# Keep this key and the exact body for retries; use a new key for each new invoice.
headers = {
"Idempotency-Key": "order-1042-attempt-1",
"Content-Type": "application/json"
}
headers["Authorization"] = "Bearer " + os.environ["WHOLLY_TOKEN"]
body = """{
"amount": "25.00",
"currency": "EUR",
"order_id": "order-1042",
"payment_methods": [
{
"chain_slug": "ethereum",
"asset_tickers": [
"ETH"
]
}
]
}""".encode("utf-8")
request = Request("https://api.example.com/v1/projects/YOUR_PROJECT_ID/stores/YOUR_STORE_ID/invoices",
method="POST", headers=headers, data=body)
# Non-2xx responses raise HTTPError. Do not retry writes with a new key.
with build_opener(NoRedirect()).open(request, timeout=30) as response:
print(json.load(response))