الانتقال إلى المحتوى الرئيسي
يوفر SDK PHP طريقة قوية ومرنة لدمج مدفوعات دودي في تطبيقات PHP الخاصة بك. تم بناؤه وفقًا لمعايير PHP الحديثة مع تحميل تلقائي متوافق مع PSR-4، ويقدم تغطية اختبار شاملة ووثائق مفصلة.
مكتبة واجهة برمجة التطبيقات PHP الخاصة بـ Dodo Payments في النسخة التجريبية حاليًا. نحن متحمسون لتجربتك معها! يرجى مشاركة أي اقتراحات أو تقارير عن الأخطاء أو طلبات الميزات من خلال تقديم مشكلة.

التثبيت

قم بتثبيت SDK باستخدام Composer:
composer require dodopayments/client
تتطلب مجموعة تطوير البرمجيات PHP 8.1.0 أو أعلى و Composer لإدارة التبعيات.

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

قم بتهيئة العميل وإنشاء جلسة دفع:
<?php

use Dodopayments\Client;

$client = new Client(
  bearerToken: getenv('DODO_PAYMENTS_API_KEY') ?: 'My Bearer Token',
  // use 'https://test.dodopayments.com' for test mode
  baseUrl: 'https://live.dodopayments.com'
);

$checkoutSessionResponse = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]]
);

var_dump($checkoutSessionResponse->session_id);
قم بتخزين مفاتيح واجهة برمجة التطبيقات الخاصة بك بشكل آمن باستخدام متغيرات البيئة. لا تعرضها أبدًا في قاعدة الشيفرة الخاصة بك أو تلتزم بها في التحكم في الإصدارات.

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

متوافق مع PSR-4

يتبع توصيات معايير PHP لتطوير PHP الحديث

PHP الحديثة

تم بناؤه لـ PHP 8.1+ مع إعلانات نوعية وأنواع صارمة

اختبار شامل

تغطية اختبار شاملة للموثوقية والاستقرار

معالجة الاستثناءات

أنواع استثناءات واضحة لسيناريوهات الأخطاء المختلفة

كائنات القيمة

يستخدم SDK معلمات مسماة لتحديد الوسائط الاختيارية. يمكنك تهيئة كائنات القيمة باستخدام المُنشئ الثابت with:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Recommended: Use static 'with' constructor with named parameters
$customer = AttachExistingCustomer::with(customerID: "customer_id");
المُنشئون متاحون أيضًا كنمط بديل:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Alternative: Use builder pattern
$customer = (new AttachExistingCustomer)->withCustomerID("customer_id");

التكوين

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

تتم إعادة محاولة بعض الأخطاء تلقائيًا مرتين بشكل افتراضي مع تأخير أسي قصير. الأخطاء التالية تؤدي إلى إعادة المحاولة التلقائية:
  • أخطاء الاتصال (مشاكل الاتصال بالشبكة)
  • 408 مهلة الطلب
  • 409 تعارض
  • 429 حد المعدل
  • 500+ أخطاء داخلية
  • المهلات
قم بتكوين سلوك إعادة المحاولة على مستوى عالمي أو لكل طلب:
<?php

use Dodopayments\Client;
use Dodopayments\RequestOptions;

// Configure default for all requests (disable retries)
$client = new Client(maxRetries: 0);

// Or, configure per-request
$result = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]],
  requestOptions: RequestOptions::with(maxRetries: 5),
);

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

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

قم بإنشاء جلسة دفع:
$session = $client->checkoutSessions->create(
  productCart: [
    ["productID" => "prod_123", "quantity" => 1]
  ],
  returnUrl: "https://yourdomain.com/return"
);

header('Location: ' . $session->url);

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

قم بإنشاء واسترجاع معلومات العملاء:
// Create a customer
$customer = $client->customers->create(
  email: "[email protected]",
  name: "John Doe",
  metadata: [
    "user_id" => "12345"
  ]
);

// Retrieve customer
$customer = $client->customers->retrieve("cus_123");
echo "Customer: {$customer->name} ({$customer->email})";

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

قم بإنشاء وإدارة الاشتراكات المتكررة:
// Create a subscription
$subscription = $client->subscriptions->create(
  customerID: "cus_123",
  productID: "prod_456",
  priceID: "price_789"
);

// Cancel subscription
$client->subscriptions->cancel($subscription->id);

الترقيم

العمل مع استجابات القوائم المرقمة:
$page = $client->payments->list();

var_dump($page);

// Fetch items from the current page
foreach ($page->getItems() as $item) {
  var_dump($item->brand_id);
}

// Auto-paginate: fetch items from all pages
foreach ($page->pagingEachItem() as $item) {
  var_dump($item->brand_id);
}

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

عندما لا تتمكن المكتبة من الاتصال بـ API أو تتلقى رمز حالة غير ناجح (4xx أو 5xx)، يتم طرح فئة فرعية من APIException:
<?php

use Dodopayments\Core\Exceptions\APIConnectionException;
use Dodopayments\Core\Exceptions\RateLimitException;
use Dodopayments\Core\Exceptions\APIStatusException;

try {
  $checkoutSessionResponse = $client->checkoutSessions->create(
    productCart: [["productID" => "product_id", "quantity" => 1]]
  );
} catch (APIConnectionException $e) {
  echo "The server could not be reached", PHP_EOL;
  var_dump($e->getPrevious());
} catch (RateLimitException $_) {
  echo "A 429 status code was received; we should back off a bit.", PHP_EOL;
} catch (APIStatusException $e) {
  echo "Another non-200-range status code was received", PHP_EOL;
  echo $e->getMessage();
}

أنواع الأخطاء

السببنوع الخطأ
HTTP 400BadRequestException
HTTP 401AuthenticationException
HTTP 403PermissionDeniedException
HTTP 404NotFoundException
HTTP 409ConflictException
HTTP 422UnprocessableEntityException
HTTP 429RateLimitException
HTTP >= 500InternalServerException
خطأ HTTP آخرAPIStatusException
انتهاء الوقتAPITimeoutException
خطأ في الشبكةAPIConnectionException
دائمًا قم بتغليف استدعاءات واجهة برمجة التطبيقات في كتل try-catch للتعامل مع الأخطاء المحتملة بشكل سلس وتقديم ملاحظات ذات مغزى للمستخدمين.

الاستخدام المتقدم

نقاط النهاية غير الموثقة

قم بإجراء طلبات إلى نقاط النهاية غير الموثقة:
<?php

$response = $client->request(
  method: "post",
  path: '/undocumented/endpoint',
  query: ['dog' => 'woof'],
  headers: ['useful-header' => 'interesting-value'],
  body: ['hello' => 'world']
);

المعلمات غير الموثقة

أرسل معلمات غير موثقة إلى أي نقطة نهاية أو اقرأ خصائص استجابة غير موثقة:
<?php

use Dodopayments\RequestOptions;

$checkoutSessionResponse = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]],
  requestOptions: RequestOptions::with(
    extraQueryParams: ["my_query_parameter" => "value"],
    extraBodyParams: ["my_body_parameter" => "value"],
    extraHeaders: ["my-header" => "value"],
  ),
);
المعلمات extra* التي تحمل نفس الاسم تتجاوز المعلمات الموثقة.

تكامل الإطار

لارفيل

قم بإنشاء خدمة لتطبيقات لارفيل:
<?php

namespace App\Services;

use Dodopayments\Client;

class PaymentService
{
    protected $client;

    public function __construct()
    {
        $this->client = new Client(
            bearerToken: config('services.dodo.api_key')
        );
    }

    public function createCheckout(array $items)
    {
        return $this->client->checkoutSessions->create(
            productCart: $items,
            returnUrl: route('checkout.return')
        );
    }
}
أضف التكوين في config/services.php:
'dodo' => [
    'api_key' => env('DODO_API_KEY'),
    'environment' => env('DODO_ENVIRONMENT', 'sandbox')
],

سيمفوني

قم بإنشاء خدمة في سيمفوني:
<?php

namespace App\Service;

use Dodopayments\Client;

class DodoPaymentService
{
    private Client $client;

    public function __construct(string $apiKey)
    {
        $this->client = new Client(bearerToken: $apiKey);
    }

    public function createPayment(int $amount, string $currency, string $customerId): object
    {
        return $this->client->payments->create(
            amount: $amount,
            currency: $currency,
            customerID: $customerId
        );
    }
}
سجل في config/services.yaml:
services:
  App\Service\DodoPaymentService:
    arguments:
      $apiKey: "%env(DODO_API_KEY)%"

الموارد

الدعم

هل تحتاج إلى مساعدة بشأن SDK PHP؟

المساهمة

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