Langsung ke konten utama
SDK PHP menyediakan cara yang kuat dan fleksibel untuk mengintegrasikan Dodo Payments ke dalam aplikasi PHP Anda. Dibangun mengikuti standar PHP modern dengan autoloading PSR-4, ini menawarkan cakupan pengujian yang luas dan dokumentasi yang mendetail.
Perpustakaan API PHP Dodo Payments saat ini dalam beta. Kami sangat senang Anda dapat bereksperimen dengan ini! Silakan bagikan saran, laporan bug, atau permintaan fitur dengan mengajukan masalah.

Instalasi

Instal SDK menggunakan Composer:
composer require "dodopayments/client:^3.5.0"
SDK memerlukan PHP 8.1.0 atau lebih tinggi dan Composer untuk manajemen ketergantungan.

Memulai dengan Cepat

Inisialisasi klien dan buat sesi checkout:
<?php

use Dodopayments\Client;

$client = new Client(
  bearerToken: getenv("DODO_PAYMENTS_API_KEY") ?: "My Bearer Token",
  environment: "test_mode",
);

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

var_dump($checkoutSessionResponse->session_id);
Simpan kunci API Anda dengan aman menggunakan variabel lingkungan. Jangan pernah mengeksposnya dalam basis kode Anda atau mengkomitnya ke kontrol versi.

Fitur Utama

Kepatuhan PSR-4

Mengikuti Rekomendasi Standar PHP untuk pengembangan PHP modern

PHP Modern

Dibangun untuk PHP 8.1+ dengan deklarasi tipe dan tipe ketat

Pengujian Luas

Cakupan pengujian yang komprehensif untuk keandalan dan stabilitas

Penanganan Pengecualian

Jenis pengecualian yang jelas untuk berbagai skenario kesalahan

Objek Nilai

SDK menggunakan parameter bernama untuk menentukan argumen opsional. Anda dapat menginisialisasi objek nilai menggunakan konstruktor statis with:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Recommended: Use static 'with' constructor with named parameters
$customer = AttachExistingCustomer::with(customerID: "customer_id");
Builder juga tersedia sebagai pola alternatif:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

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

Konfigurasi

Konfigurasi Ulang

Kesalahan tertentu secara otomatis dicoba ulang 2 kali secara default dengan backoff eksponensial yang singkat. Kesalahan berikut memicu percobaan ulang otomatis:
  • Kesalahan koneksi (masalah konektivitas jaringan)
  • 408 Permintaan Timeout
  • 409 Konflik
  • 429 Batas Laju
  • 500+ Kesalahan Internal
  • Timeout
Konfigurasikan perilaku ulang secara global atau per permintaan:
<?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),
);

Operasi Umum

Buat Sesi Checkout

Hasilkan sesi checkout:
$session = $client->checkoutSessions->create(
  productCart: [
    ["productID" => "prod_123", "quantity" => 1]
  ],
  returnUrl: "https://yourdomain.com/return"
);

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

Kelola Pelanggan

Buat dan ambil informasi pelanggan:
// 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})";

Tangani Langganan

Buat dan kelola langganan berulang:
// Create a subscription
$subscription = $client->subscriptions->create(
  customerID: "cus_123",
  productID: "prod_456",
  priceID: "price_789"
);

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

Paginasi

Bekerja dengan respons daftar yang dipaginasi:
$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);
}

Penanganan Kesalahan

Ketika perpustakaan tidak dapat terhubung ke API atau menerima kode status non-sukses (4xx atau 5xx), subclass dari APIException dilempar:
<?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();
}

Jenis Kesalahan

PenyebabJenis Kesalahan
HTTP 400BadRequestException
HTTP 401AuthenticationException
HTTP 403PermissionDeniedException
HTTP 404NotFoundException
HTTP 409ConflictException
HTTP 422UnprocessableEntityException
HTTP 429RateLimitException
HTTP >= 500InternalServerException
Kesalahan HTTP LainAPIStatusException
TimeoutAPITimeoutException
Kesalahan JaringanAPIConnectionException
Selalu bungkus panggilan API dalam blok try-catch untuk menangani kesalahan yang mungkin terjadi dengan baik dan memberikan umpan balik yang berarti kepada pengguna.

Penggunaan Lanjutan

Endpoint yang Tidak Didokumentasikan

Lakukan permintaan ke endpoint yang tidak didokumentasikan:
<?php

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

Parameter yang Tidak Didokumentasikan

Kirim parameter yang tidak didokumentasikan ke endpoint mana pun atau baca properti respons yang tidak didokumentasikan:
<?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"],
  ),
);
Parameter extra* dengan nama yang sama akan menimpa parameter yang didokumentasikan.

Integrasi Framework

Laravel

Buat layanan untuk aplikasi Laravel:
<?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')
        );
    }
}
Tambahkan konfigurasi di config/services.php:
'dodo' => [
    'api_key' => env('DODO_API_KEY'),
    'environment' => env('DODO_ENVIRONMENT', 'sandbox')
],

Symfony

Buat layanan di Symfony:
<?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
        );
    }
}
Daftarkan di config/services.yaml:
services:
    App\Service\DodoPaymentService:
        arguments:
            $apiKey: '%env(DODO_API_KEY)%'

Sumber Daya

Dukungan

Butuh bantuan dengan SDK PHP?

Kontribusi

Kami menyambut kontribusi! Periksa pedoman kontribusi untuk memulai.