الانتقال إلى المحتوى الرئيسي
يوفر SDK TypeScript وصولاً مريحًا من جانب الخادم إلى واجهة برمجة تطبيقات REST الخاصة بمدفوعات دودي لتطبيقات TypeScript و JavaScript. يتميز بتعريفات نوع شاملة، ومعالجة الأخطاء، وإعادة المحاولة، والمهل، والترقيم التلقائي لمعالجة المدفوعات بسلاسة.

التثبيت

قم بتثبيت SDK باستخدام مدير الحزم الذي تختاره:
npm install dodopayments

البداية السريعة

قم بتهيئة العميل باستخدام مفتاح API الخاص بك وابدأ في معالجة المدفوعات:
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env['DODO_PAYMENTS_API_KEY'], // This is the default and can be omitted
  environment: 'test_mode', // defaults to 'live_mode'
});

const checkoutSessionResponse = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'product_id', quantity: 1 }],
});

console.log(checkoutSessionResponse.session_id);
قم دائمًا بتخزين مفاتيح API الخاصة بك بشكل آمن باستخدام متغيرات البيئة. لا تقم أبدًا بإيداعها في التحكم في الإصدارات أو كشفها في كود جانب العميل.

الميزات الأساسية

الأولوية لـ TypeScript

دعم كامل لـ TypeScript مع تعريفات نوع شاملة لجميع نقاط نهاية API

الترقيم التلقائي

الترقيم التلقائي للاستجابات القائمة يجعل العمل مع مجموعات البيانات الكبيرة سهلاً

معالجة الأخطاء

أنواع أخطاء مدمجة مع رسائل مفصلة لسيناريوهات الفشل المختلفة

إعادة المحاولة الذكية

إعادة المحاولة التلقائية القابلة للتكوين مع تراجع أسي للأخطاء العابرة

التكوين

متغيرات البيئة

قم بتعيين متغيرات البيئة للتكوين الآمن:
.env
DODO_PAYMENTS_API_KEY=your_api_key_here

تكوين المهلة

قم بتكوين مهلات الطلبات على مستوى عالمي أو لكل طلب:
// Configure default timeout for all requests (default is 1 minute)
const client = new DodoPayments({
  timeout: 20 * 1000, // 20 seconds
});

// Override per-request
await client.checkoutSessions.create(
  { product_cart: [{ product_id: 'product_id', quantity: 1 }] },
  { timeout: 5 * 1000 },
);

تكوين إعادة المحاولة

قم بتكوين سلوك إعادة المحاولة التلقائية:
// Configure default for all requests (default is 2 retries)
const client = new DodoPayments({
  maxRetries: 0, // disable retries
});

// Override per-request
await client.checkoutSessions.create(
  { product_cart: [{ product_id: 'product_id', quantity: 1 }] },
  { maxRetries: 5 },
);
يقوم SDK تلقائيًا بإعادة المحاولة للطلبات التي تفشل بسبب أخطاء الشبكة أو مشاكل الخادم (استجابات 5xx) مع تراجع أسي.

العمليات الشائعة

إنشاء جلسة دفع

قم بإنشاء جلسة دفع لجمع معلومات الدفع:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_123',
      quantity: 1
    }
  ],
  return_url: 'https://yourdomain.com/return'
});

console.log('Redirect to:', session.url);

إدارة العملاء

قم بإنشاء واسترجاع معلومات العملاء:
// Create a customer
const customer = await client.customers.create({
  email: 'customer@example.com',
  name: 'John Doe',
  metadata: {
    user_id: '12345'
  }
});

// Retrieve customer
const retrieved = await client.customers.retrieve('cus_123');
console.log(`Customer: ${retrieved.name} (${retrieved.email})`);

التعامل مع الاشتراكات

قم بإنشاء وإدارة الاشتراكات المتكررة:
// Create a subscription
const subscription = await client.subscriptions.create({
  customer_id: 'cus_123',
  product_id: 'prod_456',
  price_id: 'price_789'
});

// Retrieve subscription usage history
const usageHistory = await client.subscriptions.retrieveUsageHistory('sub_123', {
  start_date: '2024-01-01T00:00:00Z',
  end_date: '2024-03-31T23:59:59Z'
});

الفوترة بناءً على الاستخدام

استيعاب أحداث الاستخدام

تتبع الأحداث المخصصة للفوترة بناءً على الاستخدام:
await client.usageEvents.ingest({
  events: [
    {
      event_id: 'api_call_12345',
      customer_id: 'cus_abc123',
      event_name: 'api_request',
      timestamp: '2024-01-15T10:30:00Z',
      metadata: {
        endpoint: '/api/v1/users',
        method: 'GET',
        tokens_used: '150'
      }
    }
  ]
});
يجب أن تحتوي الأحداث على قيم فريدة event_id لضمان عدم التكرار. يتم رفض المعرفات المكررة ضمن نفس الطلب، ويتم تجاهل الطلبات اللاحقة التي تحتوي على معرفات موجودة.

استرجاع أحداث الاستخدام

استرجاع معلومات مفصلة حول أحداث الاستخدام:
// Get a specific event
const event = await client.usageEvents.retrieve('api_call_12345');

// List events with filtering
const events = await client.usageEvents.list({
  customer_id: 'cus_abc123',
  event_name: 'api_request',
  start: '2024-01-14T10:30:00Z',
  end: '2024-01-15T10:30:00Z'
});

تكوين الوكيل

قم بتكوين إعدادات الوكيل لبيئات التشغيل المختلفة:

Node.js (باستخدام undici)

import DodoPayments from 'dodopayments';
import * as undici from 'undici';

const proxyAgent = new undici.ProxyAgent('http://localhost:8888');
const client = new DodoPayments({
  fetchOptions: {
    dispatcher: proxyAgent,
  },
});

Bun

import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  fetchOptions: {
    proxy: 'http://localhost:8888',
  },
});

Deno

import DodoPayments from 'npm:dodopayments';

const httpClient = Deno.createHttpClient({ proxy: { url: 'http://localhost:8888' } });
const client = new DodoPayments({
  fetchOptions: {
    client: httpClient,
  },
});

السجلات

تحكم في مستوى تفصيل السجلات باستخدام متغيرات البيئة أو خيارات العميل:
// Via client option
const client = new DodoPayments({
  logLevel: 'debug', // Show all log messages
});
# Via environment variable
export DODO_PAYMENTS_LOG=debug
مستويات السجل المتاحة:
  • 'debug' - عرض رسائل التصحيح والمعلومات والتحذيرات والأخطاء
  • 'info' - عرض رسائل المعلومات والتحذيرات والأخطاء
  • 'warn' - عرض التحذيرات والأخطاء (افتراضي)
  • 'error' - عرض الأخطاء فقط
  • 'off' - تعطيل جميع السجلات
عند مستوى التصحيح، يتم تسجيل جميع طلبات واستجابات HTTP، بما في ذلك الرؤوس والأجسام. يتم حذف بعض رؤوس المصادقة، ولكن قد تظل البيانات الحساسة في الأجسام مرئية.

الترحيل من SDK Node.js

إذا كنت تقوم بالترقية من SDK Node.js القديم، فإن SDK TypeScript يقدم أمان نوع محسّن وميزات:

عرض دليل الترحيل

تعرف على كيفية الترحيل من SDK Node.js إلى SDK TypeScript

الترقيم التلقائي

تكون طرق القائمة في واجهة برمجة تطبيقات DodoPayments مقسمة إلى صفحات. يمكنك استخدام for await … of للتكرار عبر العناصر عبر جميع الصفحات:
async function fetchAllPayments() {
  const allPayments = [];
  // Automatically fetches more pages as needed.
  for await (const paymentListResponse of client.payments.list()) {
    allPayments.push(paymentListResponse);
  }
  return allPayments;
}
بدلاً من ذلك، يمكنك طلب صفحة واحدة في كل مرة:
let page = await client.payments.list();
for (const paymentListResponse of page.items) {
  console.log(paymentListResponse);
}

// Convenience methods are provided for manually paginating:
while (page.hasNextPage()) {
  page = await page.getNextPage();
  // ...
}

المتطلبات

تدعم الأنظمة التالية:
  • متصفحات الويب (Chrome وFirefox وSafari وEdge وغيرها من المتصفحات المحدثة)
  • Node.js 20 LTS أو إصدار أحدث (غير منتهي)
  • Deno v1.28.0 أو أعلى
  • Bun 1.0 أو أحدث
  • عمال Cloudflare
  • Vercel Edge Runtime
  • Jest 28 أو أكبر مع بيئة "node"
  • Nitro v2.6 أو أكبر
TypeScript >= 4.9 مدعوم.

الموارد

الدعم

هل تحتاج إلى مساعدة بشأن SDK الخاص بـ TypeScript؟

المساهمة

نرحب بالمساهمات! تحقق من إرشادات المساهمة للبدء.