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: 'customer@example.com',
        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 mengarahkan, 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 diarahkan 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 List Products API.

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
Mengontrol metode pembayaran mana yang tersedia untuk pelanggan selama checkout. Ini membantu mengoptimalkan untuk pasar atau persyaratan bisnis tertentu.Pilihan Tersedia: credit, debit, upi_collect, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, 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
Tindakan untuk mengesampingkan 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
Mengabaikan 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 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: 'customer@example.com',
    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: 'customer@example.com',
    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: 'user@startup.com',
    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: 'student@university.edu',
    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: 'client@company.co.uk',
    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: 'returning.customer@example.com',
    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: 'procurement@enterprise.com',
    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: 'john.sales@company.com'
  }
});

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: 'gamer@example.com',
    name: 'Mike Chen'
  },
  return_url: 'https://gaming-store.com/order-complete'
});

9. Metode Pembayaran Regional (UPI untuk India)

Untuk informasi lebih lanjut tentang konfigurasi dan pengujian UPI, lihat halaman Metode Pembayaran India.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_online_course_hindi',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'upi_collect',
    'credit',
    'debit'
  ],
  customer: {
    email: 'student@example.in',
    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. BNPL (Beli Sekarang Bayar Nanti) Checkout

Untuk informasi lebih lanjut tentang konfigurasi dan pengujian BNPL, lihat halaman Beli Sekarang Bayar Nanti (BNPL).
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_luxury_watch',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'klarna',
    'afterpay_clearpay',
    'credit',
    'debit'
  ],
  customer: {
    email: 'fashion.lover@example.com',
    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 Segera

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 sebuah 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 sekali klik untuk pelanggan yang sudah kembali.

12. Tautan Pendek untuk URL Pembayaran yang Lebih Bersih

Hasilkan tautan pembayaran yang dipersingkat dan dapat dibagikan dengan slugs 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: 'customer@example.com',
    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 sempurna untuk berbagi melalui SMS, email, atau media sosial. Mereka lebih mudah diingat dan membangun lebih banyak kepercayaan pelanggan dibandingkan dengan URL yang panjang.

13. Lewati Halaman Sukses Pembayaran dengan Redirect Segera

Redirect 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: 'customer@example.com',
    name: 'Jane Smith'
  }
});
Gunakan redirect_immediately: true saat Anda memiliki halaman sukses kustom yang memberikan pengalaman pengguna yang lebih baik dibandingkan dengan halaman sukses pembayaran default. Ini sangat berguna untuk aplikasi mobile dan alur checkout yang tertanam.
Saat redirect_immediately diaktifkan, pelanggan akan diarahkan ke return_url Anda segera setelah penyelesaian pembayaran, sepenuhnya melewati halaman sukses default.

Menyajikan Sesi Checkout

Sebelum membuat sesi checkout, Anda dapat melihat rincian harga termasuk pajak, diskon, dan total. Ini berguna untuk menampilkan harga yang akurat kepada pelanggan sebelum mereka melanjutkan ke checkout.
const preview = await client.checkoutSessions.preview({
  product_cart: [
    { product_id: 'prod_123', quantity: 1 }
  ],
  billing_address: {
    country: 'US',
    state: 'CA',
    zipcode: '94102'
  },
  discount_code: 'SAVE20'
});

console.log('Subtotal:', preview.subtotal);
console.log('Tax:', preview.tax);
console.log('Discount:', preview.discount);
console.log('Total:', preview.total);

Pranala API Preview

Lihat dokumentasi lengkap endpoint preview.

Pindah dari Tautan Dinamis ke Sesi Checkout

Perbedaan Utama

Sebelumnya, saat membuat tautan pembayaran dengan Tautan Dinamis, Anda diminta untuk memberikan alamat penagihan lengkap pelanggan. Dengan Sesi Checkout, ini tidak lagi diperlukan. Anda dapat dengan mudah melewatkan informasi yang Anda miliki, dan kami akan menangani sisanya. Contohnya:
  • 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 memberikan kumpulan data lengkap dan menyertakan confirm=true dalam body permintaan Anda.

Proses Migrasi

Migrasi dari Tautan Dinamis ke Sesi Checkout adalah proses yang sederhana:
1

Perbarui integrasi Anda

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

Sesuaikan payload permintaan

Sesuaikan payload permintaan sesuai format Sesi Checkout.
3

Itu saja!

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