الأدلة
وصفة: رصيد API
بِع رصيدًا مدفوعًا مسبقًا لواجهة API أو ميزة ذكاء اصطناعي واخصم وحدة لكل طلب. حين لا يكفي الرصيد — استجابة 402 مع رابط الشحن.
يدفع المشترون مقدمًا ثمن باقة رصيد؛ وكل طلب يستهلك بضع وحدات. يتولى Perly Pay الحساب: الاستهلاك استدعاء ذرّي واحد لا يسمح بالرصيد السالب، ولكل مشترٍ صفحة شحن خاصة. لا يُخصم شيء تلقائيًا — حين ينفد الرصيد يشحن المشتري. كل ما يخص الرصيد في Sell credits؛ وهنا الوصفة حوله.
sell-credits من إضافة Perly Pay. المثال القابل للتشغيل هو examples/api-credits (MIT) في مستودع الإضافة.كيف يعمل
- 1
باقة رصيد
منتج وسعر مع
model: "credit_pack"، وunit_amountبالسنتات، وcredits. مرة لكل وضع. - 2
مستخدموك عملاء
يُنشؤون مرة مع
external_id(معرّف المستخدم لديك)؛ وبعدها تقبلcredits.*هذا المعرّف. - 3
الشحن
credits.topUpUrl(userId)صفحة المشتري الخاصة: يختار باقة ويدفع. كل باقة مدفوعة تضيف رصيدًا. - 4
الاستهلاك لكل طلب
أولًا
credits.consume(userId, cost, { idempotencyKey })، ثم العمل. الإعادة بالمفتاح نفسه تعيد الخصم الأول، لذا يُنشئ خادمك المفتاح لكل طلب ولا يأخذه أبدًا من المستدعي. - 5
لا يكفي؟
insufficient_credits(409) لا يخصم شيئًا: أجب بـ402مع صفحة الشحن، لا بـ 500.
شغّل المثال
- 1
ثبّت
npm installفيexamples/api-credits(Node 20.12+). - 2
المفتاح
انسخ
.env.exampleإلى.envواكتب مفتاح الاختبار (sk_test_…) فيPERLY_PAY_SECRET_KEY. - 3
حضّر
npm run setupينشئ المنتج والسعر بمفتاحك ويطبع معرّفاتهما لـ.env. - 4
شغّل
npm start(أوnpm run dev)، كما يقول ملف README الخاص به. - 5
ادفع بلا محفظة
استدعِ
POST /v1/shout(402)، وافتح الصفحة التي يعطيهاPOST /top-up، واختر باقة، واضغط Simulate payment على الفاتورة، ثم استدعِ مجددًا: 200 وX-Credits-Remaining: 499.
مزالق
- الاستهلاك بلا مفتاح عدم تكرار: الطلب المكرر يخصم مرتين.
- مفتاح الخصم مأخوذ مما يرسله العميل (ترويسة
Idempotency-Key): المفتاح نفسه يعيد الخصم الأول كنجاح، فيحصل العميل على العمل مجددًا بلا دفع. - التحقق من الرصيد ثم الخصم بخطوتين.
consumeنفسه لا يسمح بالرصيد السالب؛ والرصيد للعرض. - العمل أولًا ثم الاستهلاك. العكس: الاستهلاك أولًا.
- معرّفات الاختبار مع مفتاح حقيقي. المنتجات والأسعار والويب هوك تنتمي إلى وضع واحد: قبل الإطلاق كرّر الإعداد بـ
sk_live_….