التثبيت
npm install @xpayr/extension-kit
# or copy src/index.js into your extension —
# zero dependencies, no build step, MV3-ready
بِع إضافة متصفح أو ملحقًا أو تطبيق سطح مكتب مقابل العملات الرقمية دون نظام حسابات. يدفع المشتري من محفظته، وتلك المحفظة هي الترخيص — يفتح أي جهاز آخر بتوقيع رسالة مجانية. بلا بريد إلكتروني، بلا مفاتيح ترخيص تُفقد، بلا ردّ مدفوعات.
أُغلقت مدفوعات متجر Chrome في فبراير 2021، لذا صار كل مطوّر إضافات بحاجة إلى طبقة دفع خارجية. الخيار الأبرز يشترط حساب Stripe، وهو ما يستبعد تمامًا المطوّرين في تركيا وباكستان ونيجيريا وبنغلاديش وإندونيسيا ومصر ودول أخرى كثيرة.
بوابات الدفع بالعملات الرقمية تتوقف عند "تم استلام الدفعة". تمنحك خطّاف ويب لا ترخيصًا: بلا سجل استحقاقات، بلا SDK، بلا تحقق عبر الأجهزة. فينتهي بك الأمر ببناء النصف الصعب بنفسك. هذه العدّة هي ذلك النصف.
ExtensionPay Paddle / LS Bawwabat crypto XPayr Kit
rasm 5% + Stripe 5% + 50c 0.5-1% 2.9% flat
bidun Stripe la juzئiyan naam naam
tabaqat tarkhis naam juzئi la naam
radd madfuat naam naam la yujad la yujad
tajir musajjal la naam la la
لسنا تاجرًا مسجَّلًا: أنت من يقدّم إقراراتك الضريبية. هذا تحديدًا ما تشتريه العمولة الأعلى لدى Paddle وLemon Squeezy، وهي مقايضة حقيقية تستحق الفهم قبل الاختيار.
أنشئ منتجًا في لوحة التاجر للحصول على رمز المنتج، ثم اربط الـ SDK. لا حاجة إلى host_permissions، لذا لا يظهر أي تحذير بشأن الوصول إلى البيانات عند تثبيت إضافتك.
npm install @xpayr/extension-kit
# or copy src/index.js into your extension —
# zero dependencies, no build step, MV3-ready
{
"manifest_version": 3,
"permissions": ["storage", "alarms"],
"externally_connectable": { "matches": ["https://xpayr.com/*"] }
}
import XPayrKit from '@xpayr/extension-kit';
const xpayr = XPayrKit('prod_my_extension');
xpayr.startBackground(); // required: token delivery + daily refresh
xpayr.onLicenseChanged.addListener(user => {
console.log(user.licensed ? 'unlocked' : 'locked');
});
const user = await xpayr.getUser();
if (user.licensed) {
enableProFeatures();
} else {
showUpgradeButton(() => xpayr.openCheckout());
}
هذا هو التكامل بأكمله. أما رحلة المشتري — اختيار الشبكة، الدفع، التوقيع، فتح القفل — فنستضيفها نحن على xpayr.com/buy/{product_code}.
| الحقل | النوع | المعنى |
|---|---|---|
licensed |
boolean |
اجعل ميزاتك مشروطة بهذا الحقل. يجيب من رمز مُتحقَّق منه محليًا، فهو فوري ويعمل دون اتصال. |
plan |
'lifetime' | 'prepaid_year' | null |
الخطة التي اشتراها المشتري. |
wallet |
string | null |
المحفظة المرتبط بها الترخيص — أي المحفظة التي دفعت. |
paidAt |
Date | null |
وقت إصدار الترخيص. |
expiresAt |
Date | null |
تاريخ الانتهاء للخطط المحدودة زمنيًا؛ وnull للخطط مدى الحياة. |
source |
'cache' | 'network' |
من أين جاءت هذه الإجابة. |
staleSince |
Date | null |
يُضبَط أثناء العمل برمز قديم ضمن مهلة السماح دون اتصال البالغة 30 يومًا. |
| الدالة | الوصف |
|---|---|
startBackground() |
استدعِها مرة واحدة في service worker. تربط تسليم الرمز ومنبّه التجديد اليومي. |
getUser() |
فحص ترخيص يعمل دون اتصال أولًا. يتحقق محليًا من رمز ES256 المخزَّن — بلا رحلة شبكة في المسار الساخن. |
openCheckout() |
يفتح صفحة الدفع المستضافة في تبويب جديد. يختار المشتري أي شبكة ورمز فعّلتهما. |
openRestore() |
"لقد اشتريته بالفعل" — يفتح جهازًا آخر بتوقيع المحفظة. بلا بريد إلكتروني وبلا مفتاح ترخيص. |
refresh() |
يفرض إعادة تحقق عبر الإنترنت. يلتقط المستردات وعمليات الإلغاء فورًا. |
getPlans() |
معلومات المنتج العامة: السعر ونوع الخطة والشبكات المسموح بها. |
onLicenseChanged |
يُطلَق كلما تغيّرت حالة الترخيص. |
انقطع اتصالك فترة؟ يظل الترخيص فعّالًا 30 يومًا بعد انتهاء الرمز، ثم ينتقل إلى قفل ليّن مع دعوة لإعادة الاتصال — فلا يُقفل أحد في منتصف الطريق. هل رددت المبلغ لعميل؟ ألغِ الترخيص من اللوحة: يفشل التجديد فورًا ويموت الرمز خلال 7 أيام.
أول 300 دولار من مبيعات التراخيص بلا أي رسوم إطلاقًا. بعدها 2.9% ثابتة، تُقتطع ضمن معاملة السلسلة نفسها — بلا فاتورة وبلا شيء يُحصَّل لاحقًا. بلا رسم ثابت، بلا رسم شهري، بلا ردّ مدفوعات. رسوم غاز الشبكة منفصلة ويدفعها المشتري.
ترخيص بـ 14 دولارًا ضمن الشريحة المجانية -> تستلم 14.00 دولارًاترخيص بـ 14 دولارًا بعد الشريحة المجانية -> تستلم 13.59 دولارًا (الرسوم 0.41 دولار)
خطّافات الويب اختيارية — تُصدر العدّة التراخيص وتتحقق منها دون أي خادم من جهتك. وإن أردت أحداثًا على الخادم، فهي تستخدم مخطط التوقيع نفسه المستخدَم في كل خطّافات XPayr (انظر دليل التوقيع) ويُعاد إرسالها بتباعد متزايد. استخدم event_id لضمان عدم التكرار.
| الحدث | متى |
|---|---|
license.issued |
أنتجت دفعةٌ ترخيصًا. يحمل الحدث المحفظة ورمز المنتج والخطة وبصمة المعاملة. |
license.revoked |
ألغيتَ ترخيصًا من اللوحة، عادةً بعد استرداد مبلغ. |
payment.pending |
أُنشئت جلسة دفع. |
payment.processing |
الدفعة على السلسلة وتنتظر التأكيدات. |
payment.completed |
تم التحقق من الدفعة على السلسلة. |
payment.failed |
لم تُطابق المعاملة المُرسَلة الجلسةَ عند التحقق. |
payment.expired |
انتهت صلاحية الجلسة دون دفع. |
أصدر وأدِر تراخيص برمجيات المحفظة الموقّعة بـ ES256 مباشرةً من Claude Desktop أو Cursor أو VS Code Copilot أو وكلاء الدعم المستقلين بالذكاء الاصطناعي باستخدام خادم XPayr MCP الرسمي (`xpayr_issue_wallet_license`).
{
"name": "xpayr_issue_wallet_license",
"arguments": {
"product_id": "prod_my_extension",
"buyer_wallet": "0x71C...89A",
"plan": "lifetime",
"tx_hash": "0x9f8e...3b2a"
}
}
ضمِّن شارات الثقة الديناميكية بصيغة SVG (partner-badge.php) أو أداة حاسبة رسوم 0.5% والوفورات بدون اعتماديات (xpayr-fee-widget.js) داخل ملف README لإضافتك أو بوابة التوثيق أو صفحة الهبوط الخاصة بوكالتك.
<!-- Official Dynamic SVG Trust Badge -->
<a href="https://xpayr.com?utm_source=partner_badge" target="_blank" rel="noopener">
<img src="https://xpayr.com/partner-badge.php?type=powered_by&theme=dark" alt="Powered by XPayr — 0.5% Non-Custodial Crypto Checkout" height="28">
</a>
<!-- Interactive 0.5% Fee & Savings Calculator Widget -->
<div data-xpayr-fee-widget data-volume="100000" data-invoice="250" data-rate="1.0"></div>
<script src="https://xpayr.com/public/sdk/xpayr-fee-widget.js" async></script>
| ExtensionPay | حزمة XPayr Kit |
|---|---|
ExtPay('extension-id') |
XPayrKit('prod_code') |
extpay.startBackground() |
xpayr.startBackground() |
user.paid |
user.licensed |
user.email |
user.wallet |
openPaymentPage() |
openCheckout() |
openLoginPage() |
openRestore() |
onPaid.addListener |
onLicenseChanged.addListener |
getPlans() |
getPlans() |
الفارق البنيوي الوحيد هو الهوية: يعرّف ExtensionPay العميل بالبريد الإلكتروني، بينما تعرّفه العدّة بالمحفظة. هذا يلغي رحلة الرابط السحري، ويعني أن الترخيص لا يمكن مشاركته دون مشاركة المحفظة.
ثبّت @xpayr/node-sdk (v0.2.0), @xpayr/payment-evidence (v0.2.0), @xpayr/extension-kit (v0.2.0)أو @xpayr/mcp-server (v1.0.0) من NPM، أو نفّذ استدعاءات أدوات JSON-RPC 2.0 المباشرة عبر POST https://xpayr.com/api/mcp.