Langsung ke konten utama
Validitas Sesi: Sesi checkout berlaku selama 24 jam secara default. Jika Anda mengirim confirm=true dalam permintaan Anda, sesi hanya akan berlaku selama 15 menit.

Prasyarat

1

Akun Dodo Payments

Anda memerlukan akun pedagang Dodo Payments yang aktif dengan akses API.
2

Kredensial API

Hasilkan kredensial API Anda dari dasbor Dodo Payments:
3

Pengaturan Produk

Buat produk Anda di dasbor Dodo Payments sebelum menerapkan sesi checkout.

Membuat Sesi Checkout Pertama Anda

import DodoPayments from 'dodopayments';

// Initialize the Dodo Payments client
const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function createCheckoutSession() {
  try {
    const session = await client.checkoutSessions.create({
      // Products to sell - use IDs from your Dodo Payments dashboard
      product_cart: [
        {
          product_id: 'prod_123', // Replace with your actual product ID
          quantity: 1
        }
      ],
      
      // Pre-fill customer information to reduce friction
      customer: {
        email: '[email protected]',
        name: 'John Doe',
        phone_number: '+1234567890'
      },
      
      // Billing address for tax calculation and compliance
      billing_address: {
        street: '123 Main St',
        city: 'San Francisco',
        state: 'CA',
        country: 'US', // Required: ISO 3166-1 alpha-2 country code
        zipcode: '94102'
      },
      
      // Where to redirect after successful payment
      return_url: 'https://yoursite.com/checkout/success',
      
      // Custom data for your internal tracking
      metadata: {
        order_id: 'order_123',
        source: 'web_app'
      }
    });

    // Redirect your customer to this URL to complete payment
    console.log('Checkout URL:', session.checkout_url);
    console.log('Session ID:', session.session_id);
    
    return session;
    
  } catch (error) {
    console.error('Failed to create checkout session:', error);
    throw error;
  }
}

// Example usage in an Express.js route
app.post('/create-checkout', async (req, res) => {
  try {
    const session = await createCheckoutSession();
    res.json({ checkout_url: session.checkout_url });
  } catch (error) {
    res.status(500).json({ error: 'Failed to create checkout session' });
  }
});

Respons API

Semua metode di atas mengembalikan struktur respons yang sama:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
1

Dapatkan URL checkout

Ekstrak checkout_url dari respons API.
2

Arahkan pelanggan Anda

Arahkan pelanggan Anda ke URL checkout untuk menyelesaikan pembelian mereka.
// Redirect immediately
window.location.href = session.checkout_url;

// Or open in new window
window.open(session.checkout_url, '_blank');
Opsi Integrasi Alternatif: Alih-alih mengalihkan, Anda dapat menyematkan checkout langsung di halaman Anda menggunakan Overlay Checkout (overlay modal) atau Inline Checkout (sepenuhnya disematkan). Kedua opsi menggunakan URL sesi checkout yang sama.
3

Tangani pengembalian

Setelah pembayaran, pelanggan akan diarahkan kembali ke return_url Anda dengan parameter kueri tambahan untuk status pembayaran.

Badan Permintaan

Bidang Wajib

Bidang penting yang dibutuhkan untuk setiap sesi checkout

Bidang Opsional

Konfigurasi tambahan untuk menyesuaikan pengalaman checkout Anda

Bidang Wajib

product_cart
array
wajib
Array produk yang termasuk dalam sesi checkout. Setiap produk harus memiliki product_id yang valid dari dasbor Dodo Payments Anda.
Checkout Campuran: Anda dapat menggabungkan produk pembayaran satu kali dan produk langganan dalam sesi checkout yang sama. Ini memungkinkan kasus penggunaan yang kuat seperti biaya pengaturan dengan langganan, bundel perangkat keras dengan SaaS, dan lainnya.
Temukan ID Produk Anda: Anda dapat menemukan ID produk di dasbor Dodo Payments Anda di bawah Produk → Lihat Detail, atau dengan menggunakan API Daftar Produk.

Bidang Opsional

Konfigurasikan bidang ini untuk menyesuaikan pengalaman checkout dan menambahkan logika bisnis ke alur pembayaran Anda.
customer
object
Informasi pelanggan. Anda dapat melampirkan pelanggan yang ada menggunakan ID mereka atau membuat catatan pelanggan baru selama checkout.
Lampirkan pelanggan yang ada ke sesi checkout menggunakan ID mereka.
billing_address
object
Informasi alamat penagihan untuk perhitungan pajak yang akurat, pencegahan penipuan, dan kepatuhan regulasi.
Ketika confirm diatur ke true, semua bidang alamat penagihan menjadi wajib untuk pembuatan sesi yang berhasil.
allowed_payment_method_types
array
Kontrol metode pembayaran mana yang tersedia untuk pelanggan selama checkout. Ini membantu mengoptimalkan untuk pasar atau persyaratan bisnis tertentu.Opsi Tersedia: credit, debit, upi_collect, upi_intent, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, sepa, ach, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal
Kritis: Selalu sertakan credit dan debit sebagai opsi cadangan untuk mencegah kegagalan checkout ketika metode pembayaran yang diinginkan tidak tersedia.
Contoh:
["apple_pay", "google_pay", "credit", "debit"]
billing_currency
string
Tentukan pemilihan mata uang default dengan mata uang penagihan tetap. Menggunakan kode mata uang ISO 4217.Mata Uang yang Didukung: USD, EUR, GBP, CAD, AUD, INR, dan lainnyaContoh: "USD" untuk Dolar AS, "EUR" untuk Euro
Bidang ini hanya efektif ketika penetapan harga adaptif diaktifkan. Jika penetapan harga adaptif dinonaktifkan, mata uang default produk akan digunakan.
show_saved_payment_methods
boolean
default:"false"
Tampilkan metode pembayaran yang disimpan sebelumnya untuk pelanggan yang kembali, meningkatkan kecepatan checkout dan pengalaman pengguna.
return_url
string
URL untuk mengarahkan pelanggan setelah pembayaran berhasil atau pembatalan.
confirm
boolean
default:"false"
Jika benar, menyelesaikan semua detail sesi segera. API akan mengeluarkan kesalahan jika data yang diperlukan hilang.
discount_code
string
Terapkan kode diskon ke sesi checkout.
metadata
object
Pasangan kunci-nilai kustom untuk menyimpan informasi tambahan tentang sesi.
force_3ds
boolean
Tentukan perilaku 3DS default pedagang untuk sesi ini.
minimal_address
boolean
default:"false"
Aktifkan mode pengumpulan alamat minimal. Ketika diaktifkan, checkout hanya mengumpulkan:
  • Negara: Selalu diperlukan untuk penentuan pajak
  • Kode ZIP/Pos: Hanya di wilayah di mana itu diperlukan untuk perhitungan pajak penjualan, PPN, atau GST
Ini secara signifikan mengurangi gesekan checkout dengan menghilangkan bidang formulir yang tidak perlu.
Aktifkan alamat minimal untuk penyelesaian checkout yang lebih cepat. Pengumpulan alamat lengkap tetap tersedia untuk bisnis yang memerlukan detail penagihan lengkap.
customization
object
Sesuaikan penampilan dan perilaku antarmuka checkout.
feature_flags
object
Konfigurasikan fitur dan perilaku tertentu untuk sesi checkout.
subscription_data
object
Konfigurasi tambahan untuk sesi checkout yang berisi produk langganan.

Contoh Penggunaan

Berikut adalah 10 contoh komprehensif yang menunjukkan berbagai konfigurasi sesi checkout untuk berbagai skenario bisnis:

1. Checkout Produk Tunggal Sederhana

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_ebook_guide',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'John Doe'
  },
  return_url: 'https://yoursite.com/success'
});

2. Keranjang Multi-Produk

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_laptop',
      quantity: 1
    },
    {
      product_id: 'prod_mouse',
      quantity: 2
    },
    {
      product_id: 'prod_warranty',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'John Doe',
    phone_number: '+1234567890'
  },
  billing_address: {
    street: '123 Tech Street',
    city: 'San Francisco',
    state: 'CA',
    country: 'US',
    zipcode: '94102'
  },
  return_url: 'https://electronics-store.com/order-confirmation'
});

3. Langganan dengan Periode Percobaan

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_plan',
      quantity: 1
    }
  ],
  subscription_data: {
    trial_period_days: 14
  },
  customer: {
    email: '[email protected]',
    name: 'Jane Smith'
  },
  return_url: 'https://saas-app.com/onboarding',
  metadata: {
    plan_type: 'professional',
    referral_source: 'google_ads'
  }
});

4. Checkout yang Sudah Dikonfirmasi

Ketika confirm diatur ke true, pelanggan akan langsung dibawa ke halaman checkout, melewati langkah konfirmasi apa pun.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_premium_course',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Alex Johnson',
    phone_number: '+1555123456'
  },
  billing_address: {
    street: '456 University Ave',
    city: 'Boston',
    state: 'MA',
    country: 'US',
    zipcode: '02134'
  },
  confirm: true,
  return_url: 'https://learning-platform.com/course-access',
  metadata: {
    course_category: 'programming',
    enrollment_date: '2024-01-15'
  }
});

5. Checkout dengan Override Mata Uang

Override billing_currency hanya berlaku ketika mata uang adaptif diaktifkan dalam pengaturan akun Anda. Jika mata uang adaptif dinonaktifkan, parameter ini tidak akan berpengaruh.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_consulting_service',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Oliver Williams'
  },
  billing_address: {
    street: '789 Business Park',
    city: 'London',
    state: 'England',
    country: 'GB',
    zipcode: 'SW1A 1AA'
  },
  billing_currency: 'GBP',
  feature_flags: {
    allow_currency_selection: true,
    allow_tax_id: true
  },
  return_url: 'https://consulting-firm.com/service-confirmation'
});

6. Metode Pembayaran yang Disimpan untuk Pelanggan yang Kembali

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_subscription',
      quantity: 1
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Robert Johnson',
    phone_number: '+1555987654'
  },
  show_saved_payment_methods: true,
  feature_flags: {
    allow_phone_number_collection: true,
    always_create_new_customer: false
  },
  return_url: 'https://subscription-service.com/welcome-back',
  metadata: {
    customer_tier: 'premium',
    account_age: 'returning'
  }
});

7. Checkout B2B dengan Pengumpulan ID Pajak

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_enterprise_license',
      quantity: 5
    }
  ],
  customer: {
    email: '[email protected]',
    name: 'Sarah Davis',
    phone_number: '+1800555000'
  },
  billing_address: {
    street: '1000 Corporate Blvd',
    city: 'New York',
    state: 'NY',
    country: 'US',
    zipcode: '10001'
  },
  feature_flags: {
    allow_tax_id: true,
    allow_phone_number_collection: true,
    always_create_new_customer: false
  },
  return_url: 'https://enterprise-software.com/license-delivery',
  metadata: {
    customer_type: 'enterprise',
    contract_id: 'ENT-2024-001',
    sales_rep: '[email protected]'
  }
});

8. Checkout Tema Gelap dengan Kode Diskon

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_gaming_chair',
      quantity: 1
    }
  ],
  discount_code: 'BLACKFRIDAY2024',
  customization: {
    theme: 'dark',
    show_order_details: true,
    show_on_demand_tag: false
  },
  feature_flags: {
    allow_discount_code: true
  },
  customer: {
    email: '[email protected]',
    name: 'Mike Chen'
  },
  return_url: 'https://gaming-store.com/order-complete'
});

9. Metode Pembayaran Regional (UPI untuk India)

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_online_course_hindi',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'upi_collect',
    'upi_intent',
    'credit',
    'debit'
  ],
  customer: {
    email: '[email protected]',
    name: 'Priya Sharma',
    phone_number: '+919876543210'
  },
  billing_address: {
    street: 'MG Road',
    city: 'Bangalore',
    state: 'Karnataka',
    country: 'IN',
    zipcode: '560001'
  },
  billing_currency: 'INR',
  return_url: 'https://education-platform.in/course-access',
  metadata: {
    region: 'south_india',
    language: 'hindi'
  }
});

10. Checkout BNPL (Beli Sekarang Bayar Nanti)

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_luxury_watch',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'klarna',
    'affirm',
    'afterpay_clearpay',
    'credit',
    'debit'
  ],
  customer: {
    email: '[email protected]',
    name: 'Emma Thompson',
    phone_number: '+1234567890'
  },
  billing_address: {
    street: '555 Fashion Ave',
    city: 'Los Angeles',
    state: 'CA',
    country: 'US',
    zipcode: '90210'
  },
  feature_flags: {
    allow_phone_number_collection: true
  },
  return_url: 'https://luxury-store.com/purchase-confirmation',
  metadata: {
    product_category: 'luxury',
    price_range: 'high_value'
  }
});

11. Menggunakan Metode Pembayaran yang Ada untuk Checkout Instan

Gunakan metode pembayaran yang disimpan oleh pelanggan untuk membuat sesi checkout yang diproses segera, melewati pengumpulan metode pembayaran:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_premium_plan',
      quantity: 1
    }
  ],
  customer: {
    customer_id: 'cus_123'  // Required when using payment_method_id
  },
  payment_method_id: 'pm_abc123',  // Use customer's saved payment method
  confirm: true,  // Required when using payment_method_id
  return_url: 'https://yourapp.com/success'
});
Saat menggunakan payment_method_id, confirm harus diatur ke true dan customer_id yang ada harus disediakan. Metode pembayaran akan divalidasi untuk kelayakan dengan mata uang pembayaran.
Metode pembayaran harus milik pelanggan dan kompatibel dengan mata uang pembayaran. Ini memungkinkan pembelian satu klik untuk pelanggan yang kembali.

12. Tautan Pendek untuk URL Pembayaran yang Lebih Bersih

Hasilkan tautan pembayaran yang dipersingkat dan dapat dibagikan dengan slug kustom:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_subscription',
      quantity: 1
    }
  ],
  short_link: true,  // Generate a shortened payment link
  return_url: 'https://yourapp.com/success',
  customer: {
    email: '[email protected]',
    name: 'John Doe'
  }
});

// The checkout_url will be a shortened, cleaner link
console.log(session.checkout_url);  // e.g., https://checkout.dodopayments.com/buy/abc123
Tautan pendek sangat cocok untuk berbagi melalui SMS, email, atau media sosial. Mereka lebih mudah diingat dan membangun lebih banyak kepercayaan pelanggan dibandingkan URL yang panjang.

13. Lewati Halaman Sukses Pembayaran dengan Pengalihan Langsung

Alihkan pelanggan segera setelah penyelesaian pembayaran, melewati halaman sukses default:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_digital_product',
      quantity: 1
    }
  ],
  feature_flags: {
    redirect_immediately: true  // Skip success page, redirect immediately
  },
  return_url: 'https://yourapp.com/success',
  customer: {
    email: '[email protected]',
    name: 'Jane Smith'
  }
});
Gunakan redirect_immediately: true ketika Anda memiliki halaman sukses kustom yang memberikan pengalaman pengguna yang lebih baik daripada halaman sukses pembayaran default. Ini sangat berguna untuk aplikasi seluler dan alur checkout yang disematkan.
Ketika redirect_immediately diaktifkan, pelanggan akan dialihkan ke return_url Anda segera setelah penyelesaian pembayaran, sepenuhnya melewati halaman sukses default.

Beralih dari Tautan Dinamis ke Sesi Checkout

Perbedaan Utama

Sebelumnya, saat membuat tautan pembayaran dengan Tautan Dinamis, Anda diharuskan untuk memberikan alamat penagihan lengkap pelanggan. Dengan Sesi Checkout, ini tidak lagi diperlukan. Anda cukup menyampaikan informasi yang Anda miliki, dan kami akan menangani sisanya. Misalnya:
  • Jika Anda hanya tahu negara penagihan pelanggan, cukup berikan itu.
  • Alur checkout akan secara otomatis mengumpulkan detail yang hilang sebelum memindahkan pelanggan ke halaman pembayaran.
  • Di sisi lain, jika Anda sudah memiliki semua informasi yang diperlukan dan ingin langsung ke halaman pembayaran, Anda dapat menyampaikan kumpulan data lengkap dan menyertakan confirm=true dalam body permintaan Anda.

Proses Migrasi

Migrasi dari Tautan Dinamis ke Sesi Checkout sangatlah sederhana:
1

Perbarui integrasi Anda

Perbarui integrasi Anda untuk menggunakan metode API atau SDK yang baru.
2

Sesuaikan payload permintaan

Sesuaikan payload permintaan sesuai dengan format Sesi Checkout.
3

Itu saja!

Ya. Tidak ada penanganan tambahan atau langkah migrasi khusus yang diperlukan di pihak Anda.