Langsung ke konten utama

Prasyarat

Untuk mengintegrasikan API Dodo Payments, Anda memerlukan:
  • Akun pedagang Dodo Payments
  • Kredensial API (kunci API dan kunci rahasia webhook) dari dasbor
Untuk panduan yang lebih rinci tentang prasyarat, periksa bagian ini.

Integrasi API

Sesi Checkout

Gunakan Sesi Checkout untuk menjual produk langganan dengan checkout yang aman dan dihosting. Kirim produk langganan Anda di product_cart dan arahkan pelanggan ke checkout_url yang dikembalikan.
Anda tidak dapat mencampur produk langganan dengan produk satu kali dalam sesi checkout yang sama.
import DodoPayments from 'dodopayments';

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

async function main() {
  const session = await client.checkoutSessions.create({
    product_cart: [
      { product_id: 'prod_subscription_monthly', quantity: 1 }
    ],
    // Optional: configure trials for subscription products
    subscription_data: { trial_period_days: 14 },
    customer: {
      email: '[email protected]',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

Respons API

Berikut adalah contoh respons:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Arahkan pelanggan ke checkout_url.

Webhook

Saat mengintegrasikan langganan, Anda akan menerima webhook untuk melacak siklus hidup langganan. Webhook ini membantu Anda mengelola status langganan dan skenario pembayaran dengan efektif. Untuk mengatur endpoint webhook Anda, silakan ikuti Panduan Integrasi Rinci.

Jenis Acara Langganan

Berikut adalah acara webhook yang melacak perubahan status langganan:
  1. subscription.active - Langganan berhasil diaktifkan.
  2. subscription.updated - Objek langganan diperbarui (terjadi pada setiap perubahan field).
  3. subscription.on_hold - Langganan ditangguhkan karena pembaruan gagal.
  4. subscription.failed - Pembuatan langganan gagal selama pembuatan mandat.
  5. subscription.renewed - Langganan diperbarui untuk periode penagihan berikutnya.
Untuk manajemen siklus hidup langganan yang andal, kami merekomendasikan untuk melacak acara langganan ini.
Gunakan subscription.updated untuk mendapatkan notifikasi waktu nyata tentang setiap perubahan langganan, menjaga status aplikasi Anda tetap sinkron tanpa polling API.

Skenario Pembayaran

Alur Pembayaran Berhasil Ketika pembayaran berhasil, Anda akan menerima webhook berikut:
  1. subscription.active - Menunjukkan aktivasi langganan
  2. payment.succeeded - Mengonfirmasi pembayaran awal:
    • Untuk penagihan segera (0 hari percobaan): Harapkan dalam 2-10 menit
    • Untuk hari percobaan: kapan pun itu berakhir
  3. subscription.renewed - Menunjukkan pemotongan pembayaran dan pembaruan untuk siklus berikutnya. (Pada dasarnya, kapan pun pembayaran dipotong untuk produk langganan, Anda akan mendapatkan webhook subscription.renewed bersama dengan payment.succeeded)
Skenario Kegagalan Pembayaran
  1. Kegagalan Langganan
  • subscription.failed - Pembuatan langganan gagal karena kegagalan untuk membuat mandat.
  • payment.failed - Menunjukkan pembayaran gagal.
  1. Langganan Ditangguhkan
  • subscription.on_hold - Langganan ditangguhkan karena pembayaran pembaruan gagal atau biaya perubahan rencana gagal.
  • Ketika langganan ditangguhkan, itu tidak akan diperbarui secara otomatis sampai metode pembayaran diperbarui.
Praktik Terbaik: Untuk menyederhanakan implementasi, kami merekomendasikan untuk terutama melacak acara langganan untuk mengelola siklus hidup langganan.

Menangani Langganan Ditangguhkan

Ketika langganan memasuki status on_hold, Anda perlu memperbarui metode pembayaran untuk mengaktifkannya kembali. Bagian ini menjelaskan kapan langganan ditangguhkan dan bagaimana cara menanganinya.

Ketika Langganan Ditangguhkan

Sebuah langganan ditangguhkan ketika:
  • Pembayaran pembaruan gagal: Biaya pembaruan otomatis gagal karena dana tidak mencukupi, kartu kadaluarsa, atau penolakan bank
  • Biaya perubahan rencana gagal: Biaya segera selama peningkatan/penurunan rencana gagal
  • Otorisasi metode pembayaran gagal: Metode pembayaran tidak dapat diotorisasi untuk biaya berulang
Langganan dalam status on_hold tidak akan diperbarui secara otomatis. Anda harus memperbarui metode pembayaran untuk mengaktifkan kembali langganan.

Mengaktifkan Kembali Langganan dari Ditangguhkan

Untuk mengaktifkan kembali langganan dari status on_hold, gunakan API Pembaruan Metode Pembayaran. Ini secara otomatis:
  1. Membuat biaya untuk tunggakan yang tersisa
  2. Menghasilkan faktur untuk biaya tersebut
  3. Memproses pembayaran menggunakan metode pembayaran baru
  4. Mengaktifkan kembali langganan ke status active setelah pembayaran berhasil
1

Tangani webhook subscription.on_hold

Ketika Anda menerima webhook subscription.on_hold, perbarui status aplikasi Anda dan beri tahu pelanggan:
// Webhook handler
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'subscription.on_hold') {
    const subscription = event.data;
    
    // Update subscription status in your database
    await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
    
    // Notify customer to update payment method
    await sendEmailToCustomer(subscription.customer_id, {
      subject: 'Payment Required - Subscription On Hold',
      message: 'Your subscription is on hold. Please update your payment method to continue service.'
    });
  }
  
  res.json({ received: true });
});
2

Perbarui metode pembayaran

Ketika pelanggan siap untuk memperbarui metode pembayaran mereka, panggil API Pembaruan Metode Pembayaran:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created for remaining dues:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
}
Anda juga dapat menggunakan ID metode pembayaran yang ada jika pelanggan telah menyimpan metode pembayaran:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Pantau acara webhook

Setelah memperbarui metode pembayaran, pantau acara webhook ini:
  1. payment.succeeded - Biaya untuk tunggakan yang tersisa berhasil
  2. subscription.active - Langganan telah diaktifkan kembali
if (event.type === 'payment.succeeded') {
  const payment = event.data;
  
  // Check if this payment is for an on_hold subscription
  if (payment.subscription_id) {
    // Wait for subscription.active webhook to confirm reactivation
  }
}

if (event.type === 'subscription.active') {
  const subscription = event.data;
  
  // Update subscription status in your database
  await updateSubscriptionStatus(subscription.subscription_id, 'active');
  
  // Restore customer access
  await restoreCustomerAccess(subscription.customer_id);
  
  // Notify customer of successful reactivation
  await sendEmailToCustomer(subscription.customer_id, {
    subject: 'Subscription Reactivated',
    message: 'Your subscription has been reactivated successfully.'
  });
}

Contoh Payload Acara Langganan


PropertiTipeDiperlukanDeskripsi
business_idstringYaPengidentifikasi unik untuk bisnis
timestampstringYaTimestamp saat acara terjadi (tidak selalu sama dengan saat dikirim)
typestringYaJenis acara. Lihat Jenis Acara
dataobjectYaPayload data utama. Lihat Objek Data

Mengubah Rencana Langganan

Anda dapat meningkatkan atau menurunkan rencana langganan menggunakan endpoint API perubahan rencana. Ini memungkinkan Anda untuk memodifikasi produk langganan, kuantitas, dan menangani proration.

Referensi API Ubah Rencana

Untuk informasi rinci tentang mengubah rencana langganan, silakan merujuk ke dokumentasi API Ubah Rencana kami.

Opsi Prorata

Saat mengubah rencana langganan, Anda memiliki dua opsi untuk menangani biaya segera:

1. prorated_immediately

  • Menghitung jumlah prorata berdasarkan waktu yang tersisa dalam siklus penagihan saat ini
  • Mengenakan biaya kepada pelanggan hanya untuk selisih antara rencana lama dan baru
  • Selama periode percobaan, ini akan segera mengalihkan pengguna ke rencana baru, mengenakan biaya kepada pelanggan segera

2. full_immediately

  • Mengenakan biaya kepada pelanggan jumlah penuh untuk rencana baru
  • Mengabaikan waktu atau kredit yang tersisa dari rencana sebelumnya
  • Berguna ketika Anda ingin mereset siklus penagihan atau mengenakan biaya jumlah penuh terlepas dari proration

3. difference_immediately

  • Saat meningkatkan, pelanggan segera dikenakan biaya selisih antara dua jumlah rencana.
  • Misalnya, jika rencana saat ini adalah 30 Dolar dan pelanggan meningkatkan ke 80 Dolar, mereka dikenakan biaya $50 secara instan.
  • Saat menurunkan, jumlah yang tidak terpakai dari rencana saat ini ditambahkan sebagai kredit internal dan secara otomatis diterapkan pada pembaruan langganan di masa mendatang.
  • Misalnya, jika rencana saat ini adalah 50 Dolar dan pelanggan beralih ke rencana 20 Dolar, sisa $30 dikreditkan dan digunakan untuk siklus penagihan berikutnya.

Perilaku

  • Ketika Anda memanggil API ini, Dodo Payments segera memulai biaya berdasarkan opsi prorata yang Anda pilih
  • Jika perubahan rencana adalah penurunan dan Anda menggunakan prorated_immediately, kredit akan dihitung secara otomatis dan ditambahkan ke saldo kredit langganan. Kredit ini spesifik untuk langganan tersebut dan hanya akan digunakan untuk mengimbangi pembayaran berulang di masa mendatang dari langganan yang sama
  • Opsi full_immediately melewati perhitungan kredit dan mengenakan biaya jumlah penuh untuk rencana baru
Pilih opsi prorata Anda dengan hati-hati: Gunakan prorated_immediately untuk penagihan yang adil yang memperhitungkan waktu yang tidak terpakai, atau full_immediately ketika Anda ingin mengenakan biaya jumlah penuh untuk rencana baru terlepas dari siklus penagihan saat ini.

Pemrosesan Biaya

  • Biaya segera yang dimulai saat perubahan rencana biasanya selesai diproses dalam waktu kurang dari 2 menit
  • Jika biaya segera ini gagal karena alasan apa pun, langganan secara otomatis ditangguhkan sampai masalah teratasi

Langganan Sesuai Permintaan

Langganan sesuai permintaan memungkinkan Anda mengenakan biaya kepada pelanggan secara fleksibel, tidak hanya pada jadwal tetap. Hubungi dukungan untuk mengaktifkan fitur ini.
Untuk membuat langganan sesuai permintaan: Untuk membuat langganan sesuai permintaan, gunakan endpoint API POST /subscriptions dan sertakan field on_demand dalam body permintaan Anda. Ini memungkinkan Anda untuk mengotorisasi metode pembayaran tanpa biaya segera, atau menetapkan harga awal kustom. Untuk mengenakan biaya langganan sesuai permintaan: Untuk biaya berikutnya, gunakan endpoint POST /subscriptions/charge dan tentukan jumlah yang akan dikenakan kepada pelanggan untuk transaksi tersebut.
Untuk panduan lengkap, langkah demi langkah—termasuk contoh permintaan/respons, kebijakan pengulangan yang aman, dan penanganan webhook—lihat Panduan Langganan Sesuai Permintaan.