Langsung ke konten utama
SDK Ruby menyediakan cara yang sederhana dan intuitif untuk mengintegrasikan Dodo Payments ke dalam aplikasi Ruby Anda. Ini mengikuti konvensi dan praktik terbaik Ruby, menawarkan penanganan kesalahan yang komprehensif, paginasi, dan dukungan middleware.

Instalasi

Tambahkan gem ke dalam Gemfile Anda:
Gemfile
gem "dodopayments", "~> 1.61.5"
Selalu gunakan versi SDK terbaru untuk mengakses fitur Dodo Payments terbaru. Jalankan bundle update dodopayments secara berkala untuk tetap terupdate.
Kemudian jalankan:
bundle install
SDK mendukung Ruby 3.2.0 dan versi lebih baru, dengan tipe yang komprehensif, penanganan kesalahan, dan mekanisme pengulangan.

Memulai dengan Cepat

Inisialisasi klien dan buat sesi checkout:
require "bundler/setup"
require "dodopayments"

dodo_payments = Dodopayments::Client.new(
  bearer_token: ENV["DODO_PAYMENTS_API_KEY"], # This is the default and can be omitted
  environment: "test_mode" # defaults to "live_mode"
)

checkout_session_response = dodo_payments.checkout_sessions.create(
  product_cart: [{product_id: "product_id", quantity: 1}]
)

puts(checkout_session_response.session_id)
Simpan kunci API Anda dengan aman menggunakan variabel lingkungan. Jangan pernah mengkomitnya ke kontrol versi atau mengeksposnya dalam kode Anda.

Fitur Utama

Konvensi Ruby

Mengikuti konvensi penamaan Ruby dan pola idiomatik

Sintaks yang Elegan

API yang bersih dan mudah dibaca yang terasa alami bagi pengembang Ruby

Auto-Paginasi

Iterator auto-paging bawaan untuk respons daftar

Keamanan Tipe

Tipe Sorbet opsional untuk meningkatkan keamanan tipe

Konfigurasi

Konfigurasi Timeout

Konfigurasi timeout permintaan:
# Configure default for all requests (default is 60 seconds)
dodo_payments = Dodopayments::Client.new(
  timeout: nil # disable timeout
)

# Or, configure per-request
dodo_payments.checkout_sessions.create(
  product_cart: [{product_id: "product_id", quantity: 0}],
  request_options: {timeout: 5}
)

Konfigurasi Pengulangan

Konfigurasi perilaku pengulangan otomatis:
# Configure default for all requests (default is 2)
dodo_payments = Dodopayments::Client.new(
  max_retries: 0 # disable retries
)

# Or, configure per-request
dodo_payments.checkout_sessions.create(
  product_cart: [{product_id: "product_id", quantity: 0}],
  request_options: {max_retries: 5}
)

Operasi Umum

Buat Sesi Checkout

Hasilkan sesi checkout:
session = dodo_payments.checkout_sessions.create(
  product_cart: [
    {
      product_id: "prod_123",
      quantity: 1
    }
  ],
  return_url: "https://yourdomain.com/return"
)

# Redirect to checkout
redirect_to session.url

Kelola Pelanggan

Buat dan ambil informasi pelanggan:
# Create a customer
customer = dodo_payments.customers.create(
  email: "[email protected]",
  name: "John Doe",
  metadata: {
    user_id: "12345"
  }
)

# Retrieve customer
customer = dodo_payments.customers.retrieve("cus_123")
puts "Customer: #{customer.name} (#{customer.email})"

Tangani Langganan

Buat dan kelola langganan berulang:
# Create a subscription
subscription = dodo_payments.subscriptions.create(
  customer_id: "cus_123",
  product_id: "prod_456",
  price_id: "price_789"
)

# Update subscription
updated = dodo_payments.subscriptions.update(
  subscription.id,
  metadata: { plan_type: "premium" }
)

# Cancel subscription
dodo_payments.subscriptions.cancel(subscription.id)

Paginasi

Auto-Paginasi

Secara otomatis iterasi melalui semua halaman:
page = dodo_payments.payments.list

# Fetch single item from page
payment = page.items[0]
puts(payment.brand_id)

# Automatically fetches more pages as needed
page.auto_paging_each do |payment|
  puts(payment.brand_id)
end

Paginasi Manual

Untuk kontrol lebih atas paginasi:
page = dodo_payments.payments.list

if page.next_page?
  new_page = page.next_page
  puts(new_page.items[0].brand_id)
end

Penanganan Kesalahan

Tangani berbagai kesalahan API Dodo Payments:
begin
  checkout_session = dodo_payments.checkout_sessions.create(
    product_cart: [{product_id: "product_id", quantity: 0}]
  )
rescue Dodopayments::Errors::APIConnectionError => e
  puts("The server could not be reached")
  puts(e.cause)  # an underlying Exception, likely raised within `net/http`
rescue Dodopayments::Errors::RateLimitError => e
  puts("A 429 status code was received; we should back off a bit.")
rescue Dodopayments::Errors::APIStatusError => e
  puts("Another non-200-range status code was received")
  puts(e.status)
end
Terapkan logika pengulangan dengan backoff eksponensial untuk kesalahan batas laju untuk memastikan aplikasi Anda menangani skenario volume tinggi dengan baik.

Keamanan Tipe dengan Sorbet

Gunakan Sorbet untuk parameter permintaan yang aman tipe:
# Type-safe using Sorbet RBI definitions
dodo_payments.checkout_sessions.create(
  product_cart: [
    Dodopayments::CheckoutSessionRequest::ProductCart.new(
      product_id: "product_id",
      quantity: 0
    )
  ]
)

# Hashes work, but are not typesafe
dodo_payments.checkout_sessions.create(
  product_cart: [{product_id: "product_id", quantity: 0}]
)

# You can also splat a full Params class
params = Dodopayments::CheckoutSessionCreateParams.new(
  product_cart: [
    Dodopayments::CheckoutSessionRequest::ProductCart.new(
      product_id: "product_id",
      quantity: 0
    )
  ]
)
dodo_payments.checkout_sessions.create(**params)

Penggunaan Lanjutan

Endpoint yang Tidak Didokumentasikan

Lakukan permintaan ke endpoint yang tidak didokumentasikan:
response = dodo_payments.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:
checkout_session_response = dodo_payments.checkout_sessions.create(
  product_cart: [{product_id: "product_id", quantity: 0}],
  request_options: {
    extra_query: {my_query_parameter: value},
    extra_body: {my_body_parameter: value},
    extra_headers: {"my-header": value}
  }
)

# Access undocumented response properties
puts(checkout_session_response[:my_undocumented_property])

Integrasi Rails

Buat Inisialisasi

Buat config/initializers/dodo_payments.rb:
require "dodopayments"

DODO_CLIENT = Dodopayments::Client.new(
  bearer_token: Rails.application.credentials.dodo_api_key,
  environment: Rails.env.production? ? "live_mode" : "test_mode"
)

Pola Objek Layanan

Buat layanan pembayaran:
# app/services/payment_service.rb
class PaymentService
  def initialize
    @client = DODO_CLIENT
  end

  def create_checkout(items)
    @client.checkout_sessions.create(
      product_cart: items,
      return_url: Rails.application.routes.url_helpers.checkout_return_url
    )
  end

  def process_payment(amount:, currency:, customer_id:)
    @client.payments.create(
      amount: amount,
      currency: currency,
      customer_id: customer_id
    )
  end
end

Integrasi Kontroler

Gunakan di kontroler Rails Anda:
# app/controllers/checkouts_controller.rb
class CheckoutsController < ApplicationController
  def create
    service = PaymentService.new
    session = service.create_checkout(checkout_params[:items])
    
    redirect_to session.url, allow_other_host: true
  rescue Dodopayments::Errors::APIError => e
    flash[:error] = "Payment error: #{e.message}"
    redirect_to cart_path
  end

  private

  def checkout_params
    params.require(:checkout).permit(items: [:product_id, :quantity])
  end
end

Integrasi Sinatra

Gunakan dengan aplikasi Sinatra:
require "sinatra"
require "dodopayments"

configure do
  set :dodo_client, Dodopayments::Client.new(
    bearer_token: ENV["DODO_API_KEY"]
  )
end

post "/create-checkout" do
  content_type :json
  
  begin
    session = settings.dodo_client.checkout_sessions.create(
      product_cart: JSON.parse(request.body.read)["items"],
      return_url: "#{request.base_url}/return"
    )
    
    { checkout_url: session.url }.to_json
  rescue Dodopayments::Errors::APIError => e
    status 400
    { error: e.message }.to_json
  end
end

Sumber Daya

Dukungan

Butuh bantuan dengan SDK Ruby?

Kontribusi

Kami menyambut kontribusi! Periksa pedoman kontribusi untuk memulai.