Langsung ke konten utama

Ikhtisar

SDK Checkout Dodo Payments menyediakan cara yang mulus untuk mengintegrasikan overlay pembayaran kami ke dalam aplikasi web Anda. Dibangun dengan TypeScript dan standar web modern, ini menawarkan solusi yang kuat untuk menangani pembayaran dengan penanganan peristiwa real-time dan tema yang dapat disesuaikan.
Gambar Sampul Overlay Checkout

Demo

Interactive Demo

Lihat overlay checkout beraksi dengan demo langsung kami.

Memulai dengan Cepat

Mulai dengan SDK Checkout Dodo Payments hanya dalam beberapa baris kode:
import { DodoPayments } from "dodopayments-checkout";

// Initialize the SDK
DodoPayments.Initialize({
  mode: "test", // 'test' or 'live'
  displayType: "overlay", // Optional: defaults to 'overlay' for overlay checkout
  onEvent: (event) => {
    console.log("Checkout event:", event);
  },
});

// Open checkout
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123"
});
Dapatkan URL checkout Anda dari create checkout session API.

Panduan Integrasi Langkah-demi-Langkah

1

Install the SDK

Instal SDK Checkout Dodo Payments menggunakan manajer paket pilihan Anda:
npm install dodopayments-checkout
2

Initialize the SDK

Inisialisasi SDK di aplikasi Anda, biasanya di komponen utama atau titik masuk aplikasi:
import { DodoPayments } from "dodopayments-checkout";

DodoPayments.Initialize({
  mode: "test", // Change to 'live' for production
  displayType: "overlay", // Optional: defaults to 'overlay' for overlay checkout
  onEvent: (event) => {
    console.log("Checkout event:", event);
    
    // Handle different events
    switch (event.event_type) {
      case "checkout.opened":
        // Checkout overlay has been opened
        break;
      case "checkout.closed":
        // Checkout has been closed
        break;
      case "checkout.error":
        // Handle errors
        console.error("Checkout error:", event.data?.message);
        break;
    }
  },
});
Selalu inisialisasi SDK sebelum mencoba membuka checkout. Inisialisasi harus dilakukan sekali saat aplikasi Anda dimuat.
3

Create a Checkout Button Component

Buat komponen yang membuka overlay checkout:
// components/CheckoutButton.tsx
"use client";

import { Button } from "@/components/ui/button";
import { DodoPayments } from "dodopayments-checkout";
import { useEffect, useState } from "react";

export function CheckoutButton() {
  const [isLoading, setIsLoading] = useState(false);

  useEffect(() => {
    // Initialize the SDK
    DodoPayments.Initialize({
      mode: "test",
      displayType: "overlay",
      onEvent: (event) => {
        switch (event.event_type) {
          case "checkout.opened":
            setIsLoading(false);
            break;
          case "checkout.error":
            setIsLoading(false);
            console.error("Checkout error:", event.data?.message);
            break;
        }
      },
    });
  }, []);

  const handleCheckout = async () => {
    try {
      setIsLoading(true);
      await DodoPayments.Checkout.open({
        checkoutUrl: "https://checkout.dodopayments.com/session/cks_123"
      });
    } catch (error) {
      console.error("Failed to open checkout:", error);
      setIsLoading(false);
    }
  };

  return (
    <Button 
      onClick={handleCheckout}
      disabled={isLoading}
    >
      {isLoading ? "Loading..." : "Checkout Now"}
    </Button>
  );
}
4

Add Checkout to Your Page

Gunakan komponen tombol checkout di aplikasi Anda:
// app/page.tsx
import { CheckoutButton } from "@/components/CheckoutButton";

export default function Home() {
  return (
    <main className="flex min-h-screen flex-col items-center justify-center p-24">
      <h1>Welcome to Our Store</h1>
      <CheckoutButton />
    </main>
  );
}
5

Handle Success and Failure Pages

Buat halaman untuk menangani pengalihan checkout:
// app/success/page.tsx
export default function SuccessPage() {
  return (
    <div className="flex min-h-screen flex-col items-center justify-center">
      <h1>Payment Successful!</h1>
      <p>Thank you for your purchase.</p>
    </div>
  );
}

// app/failure/page.tsx
export default function FailurePage() {
  return (
    <div className="flex min-h-screen flex-col items-center justify-center">
      <h1>Payment Failed</h1>
      <p>Please try again or contact support.</p>
    </div>
  );
}
6

Test Your Integration

  1. Mulai server pengembangan Anda:
npm run dev
  1. Uji alur checkout:
    • Klik tombol checkout
    • Verifikasi overlay muncul
    • Uji alur pembayaran menggunakan kredensial uji
    • Konfirmasi pengalihan berfungsi dengan benar
Anda harus melihat event checkout tercatat di konsol browser Anda.
7

Go Live

Saat Anda siap untuk produksi:
  1. Ubah mode menjadi 'live':
DodoPayments.Initialize({
  mode: "live",
  displayType: "overlay",
  onEvent: (event) => {
    console.log("Checkout event:", event);
  }
});
  1. Perbarui URL checkout Anda untuk menggunakan sesi checkout langsung dari backend Anda
  2. Uji alur lengkap di produksi
  3. Pantau peristiwa dan kesalahan

Referensi API

Konfigurasi

Opsi Inisialisasi

interface InitializeOptions {
  mode: "test" | "live";
  displayType?: "overlay" | "inline";
  onEvent: (event: CheckoutEvent) => void;
}
OpsiTipeWajibDeskripsi
mode"test" | "live"YaMode lingkungan: 'test' untuk pengembangan, 'live' untuk produksi
displayType"overlay" | "inline"TidakJenis tampilan: 'overlay' untuk modal checkout (default), 'inline' untuk embedded checkout
onEventfunctionYaFungsi callback untuk menangani event checkout

Opsi Checkout

interface CheckoutOptions {
  checkoutUrl: string;
  options?: {
    showTimer?: boolean;
    showSecurityBadge?: boolean;
    manualRedirect?: boolean;
  };
}
OpsiTipeWajibDeskripsi
checkoutUrlstringYaURL sesi checkout dari create checkout session API
options.showTimerbooleanTidakTampilkan atau sembunyikan timer checkout. Defaultnya adalah true. Ketika dinonaktifkan, Anda akan menerima event checkout.link_expired saat sesi kedaluwarsa.
options.showSecurityBadgebooleanTidakTampilkan atau sembunyikan lencana keamanan. Defaultnya adalah true.
options.manualRedirectbooleanTidakSaat diaktifkan, checkout tidak akan mengalihkan secara otomatis setelah selesai. Sebagai gantinya, Anda akan menerima event checkout.status dan checkout.redirect_requested untuk menangani pengalihan sendiri.

Metode

Buka Checkout

Membuka overlay checkout dengan URL sesi checkout yang ditentukan.
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123"
});
Anda juga dapat memberikan opsi tambahan untuk menyesuaikan perilaku checkout:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    showTimer: false,
    showSecurityBadge: false,
    manualRedirect: true,
  },
});
Saat menggunakan manualRedirect, tangani penyelesaian checkout di callback onEvent Anda:
DodoPayments.Initialize({
  mode: "test",
  displayType: "overlay",
  onEvent: (event) => {
    if (event.event_type === "checkout.status") {
      const status = event.data?.message?.status;
      // Handle status: "succeeded", "failed", or "processing"
    }
    if (event.event_type === "checkout.redirect_requested") {
      const redirectUrl = event.data?.message?.redirect_to;
      // Redirect the customer manually
      window.location.href = redirectUrl;
    }
    if (event.event_type === "checkout.link_expired") {
      // Handle expired checkout session
    }
  },
});

Tutup Checkout

Menutup overlay checkout secara programatis.
DodoPayments.Checkout.close();

Periksa Status

Mengembalikan apakah overlay checkout saat ini terbuka.
const isOpen = DodoPayments.Checkout.isOpen();
// Returns: boolean

Peristiwa

SDK menyediakan event waktu nyata yang bisa Anda dengarkan melalui callback onEvent:

Data Peristiwa Status Checkout

Saat manualRedirect diaktifkan, Anda menerima event checkout.status dengan data berikut:
interface CheckoutStatusEventData {
  message: {
    status?: "succeeded" | "failed" | "processing";
  };
}

Data Peristiwa Pengalihan Checkout Diminta

Saat manualRedirect diaktifkan, Anda menerima event checkout.redirect_requested dengan data berikut:
interface CheckoutRedirectRequestedEventData {
  message: {
    redirect_to?: string;
  };
}
DodoPayments.Initialize({
  onEvent: (event: CheckoutEvent) => {
    switch (event.event_type) {
      case "checkout.opened":
        // Checkout overlay has been opened
        break;
      case "checkout.form_ready":
        // Checkout form is ready for user input
        break;
      case "checkout.payment_page_opened":
        // Payment page has been displayed
        break;
      case "checkout.customer_details_submitted":
        // Customer and billing details submitted
        break;
      case "checkout.closed":
        // Checkout has been closed
        break;
      case "checkout.redirect":
        // Checkout will perform a redirect
        break;
      case "checkout.error":
        // An error occurred
        console.error("Error:", event.data?.message);
        break;
      case "checkout.link_expired":
        // Checkout session has expired (only when showTimer is false)
        break;
      case "checkout.status":
        // Checkout status update (only when manualRedirect is enabled)
        const status = event.data?.message?.status;
        break;
      case "checkout.redirect_requested":
        // Redirect requested (only when manualRedirect is enabled)
        const redirectUrl = event.data?.message?.redirect_to;
        break;
    }
  }
});
Jenis EventDeskripsi
checkout.openedOverlay checkout telah dibuka
checkout.form_readyForm checkout siap menerima input pengguna. Berguna untuk menyembunyikan status pemuatan.
checkout.payment_page_openedHalaman pembayaran telah ditampilkan
checkout.customer_details_submittedDetail pelanggan dan tagihan telah diserahkan
checkout.closedOverlay checkout telah ditutup
checkout.redirectCheckout akan melakukan pengalihan
checkout.errorTerjadi kesalahan selama checkout
checkout.link_expiredDipicu saat sesi checkout kedaluwarsa. Hanya diterima ketika showTimer disetel ke false.
checkout.statusDipicu saat manualRedirect diaktifkan. Berisi status checkout (succeeded, failed, atau processing).
checkout.redirect_requestedDipicu saat manualRedirect diaktifkan. Berisi URL untuk mengarahkan pelanggan.

Opsi Implementasi

Instalasi Package Manager

Instal melalui npm, yarn, atau pnpm seperti yang ditunjukkan dalam Panduan Integrasi Langkah-demi-Langkah.

Implementasi CDN

Untuk integrasi cepat tanpa langkah build, Anda dapat menggunakan CDN kami:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dodo Payments Checkout</title>
    
    <!-- Load DodoPayments -->
    <script src="https://cdn.jsdelivr.net/npm/dodopayments-checkout@latest/dist/index.js"></script>
    <script>
        // Initialize the SDK
        DodoPaymentsCheckout.DodoPayments.Initialize({
            mode: "test", // Change to 'live' for production
            displayType: "overlay",
            onEvent: (event) => {
                console.log('Checkout event:', event);
            }
        });
    </script>
</head>
<body>
    <button onclick="openCheckout()">Checkout Now</button>

    <script>
        function openCheckout() {
            DodoPaymentsCheckout.DodoPayments.Checkout.open({
                checkoutUrl: "https://checkout.dodopayments.com/session/cks_123"
            });
        }
    </script>
</body>
</html>

Kustomisasi Tema

Anda dapat menyesuaikan tampilan checkout dengan meneruskan objek themeConfig dalam parameter options saat membuka checkout. Konfigurasi tema mendukung mode terang dan gelap, memungkinkan Anda menyesuaikan warna, border, teks, tombol, dan radius border.
Bagian ini membahas konfigurasi tema di sisi klien menggunakan SDK Checkout. Anda juga dapat mengonfigurasi tema di sisi server saat membuat sesi checkout melalui API menggunakan parameter theme_config. Lihat Kustomisasi Tema Checkout untuk konfigurasi tingkat API, atau gunakan halaman Desain di dasbor untuk mengonfigurasi tema secara visual dengan pratinjau langsung.

Konfigurasi Tema Dasar

DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        textPrimary: "#344054",
        buttonPrimary: "#A6E500",
      },
      dark: {
        bgPrimary: "#0D0D0D",
        textPrimary: "#FFFFFF",
        buttonPrimary: "#A6E500",
      },
      radius: "8px",
    },
  },
});

Konfigurasi Tema Lengkap

Semua properti tema yang tersedia:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      light: {
        // Background colors
        bgPrimary: "#FFFFFF",        // Primary background color
        bgSecondary: "#F9FAFB",      // Secondary background color (e.g., tabs)
        
        // Border colors
        borderPrimary: "#D0D5DD",     // Primary border color
        borderSecondary: "#6B7280",  // Secondary border color
        
        // Text colors
        textPrimary: "#344054",       // Primary text color
        textSecondary: "#6B7280",    // Secondary text color
        textPlaceholder: "#667085",  // Placeholder text color
        textError: "#D92D20",        // Error text color
        textSuccess: "#10B981",      // Success text color
        
        // Button colors
        buttonPrimary: "#A6E500",           // Primary button background
        buttonPrimaryHover: "#8CC500",      // Primary button hover state
        buttonTextPrimary: "#0D0D0D",       // Primary button text color
        buttonSecondary: "#F3F4F6",         // Secondary button background
        buttonSecondaryHover: "#E5E7EB",     // Secondary button hover state
        buttonTextSecondary: "#344054",     // Secondary button text color
      },
      dark: {
        // Background colors
        bgPrimary: "#0D0D0D",
        bgSecondary: "#1A1A1A",
        
        // Border colors
        borderPrimary: "#323232",
        borderSecondary: "#D1D5DB",
        
        // Text colors
        textPrimary: "#FFFFFF",
        textSecondary: "#909090",
        textPlaceholder: "#9CA3AF",
        textError: "#F97066",
        textSuccess: "#34D399",
        
        // Button colors
        buttonPrimary: "#A6E500",
        buttonPrimaryHover: "#8CC500",
        buttonTextPrimary: "#0D0D0D",
        buttonSecondary: "#2A2A2A",
        buttonSecondaryHover: "#3A3A3A",
        buttonTextSecondary: "#FFFFFF",
      },
      radius: "8px", // Border radius for inputs, buttons, and tabs
    },
  },
});

Hanya Mode Terang

Jika Anda hanya ingin menyesuaikan tema terang:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        textPrimary: "#000000",
        buttonPrimary: "#0070F3",
      },
      radius: "12px",
    },
  },
});

Hanya Mode Gelap

Jika Anda hanya ingin menyesuaikan tema gelap:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      dark: {
        bgPrimary: "#000000",
        textPrimary: "#FFFFFF",
        buttonPrimary: "#0070F3",
      },
      radius: "12px",
    },
  },
});

Penggantian Tema Parsial

Anda dapat menimpa hanya properti tertentu. Checkout akan menggunakan nilai default untuk properti yang tidak Anda tentukan:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      light: {
        buttonPrimary: "#FF6B6B", // Only override primary button color
      },
      radius: "16px", // Override border radius
    },
  },
});

Konfigurasi Tema dengan Opsi Lain

Anda dapat menggabungkan konfigurasi tema dengan opsi checkout lainnya:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    showTimer: true,
    showSecurityBadge: true,
    manualRedirect: false,
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        buttonPrimary: "#A6E500",
      },
      dark: {
        bgPrimary: "#0D0D0D",
        buttonPrimary: "#A6E500",
      },
      radius: "8px",
    },
  },
});

Tipe TypeScript

Bagi pengguna TypeScript, semua tipe konfigurasi tema diekspor:
import { ThemeConfig, ThemeModeConfig } from "dodopayments-checkout";

const themeConfig: ThemeConfig = {
  light: {
    bgPrimary: "#FFFFFF",
    // ... other properties
  },
  dark: {
    bgPrimary: "#0D0D0D",
    // ... other properties
  },
  radius: "8px",
};

Penanganan Error

SDK menyediakan informasi kesalahan rinci melalui sistem event. Selalu terapkan penanganan error yang tepat dalam callback onEvent Anda:
DodoPayments.Initialize({
  mode: "test",
  displayType: "overlay",
  onEvent: (event: CheckoutEvent) => {
    if (event.event_type === "checkout.error") {
      console.error("Checkout error:", event.data?.message);
      // Handle error appropriately
      // You may want to show a user-friendly error message
      // or retry the checkout process
    }
    if (event.event_type === "checkout.link_expired") {
      // Handle expired checkout session
      console.warn("Checkout session has expired");
    }
  }
});
Selalu tangani event checkout.error untuk memberikan pengalaman pengguna yang baik saat terjadi kesalahan.

Praktik Terbaik

  1. Inisialisasi sekali: Inisialisasi SDK sekali saat aplikasi Anda dimuat, bukan setiap kali mencoba checkout
  2. Penanganan error: Selalu terapkan penanganan error yang tepat di callback event Anda
  3. Mode pengujian: Gunakan mode test selama pengembangan dan beralih ke live hanya ketika siap untuk produksi
  4. Penanganan event: Tangani semua event relevan untuk pengalaman pengguna yang lengkap
  5. URL Valid: Selalu gunakan URL checkout valid dari create checkout session API
  6. TypeScript: Gunakan TypeScript untuk keamanan tipe yang lebih baik dan pengalaman pengembang yang lebih baik
  7. Status pemuatan: Tampilkan status pemuatan saat checkout sedang dibuka untuk meningkatkan UX
  8. Pengalihan manual: Gunakan manualRedirect ketika Anda memerlukan kontrol khusus atas navigasi pasca-checkout
  9. Manajemen timer: Nonaktifkan timer (showTimer: false) jika Anda ingin menangani kedaluwarsa sesi secara manual

Pemecahan Masalah

Kemungkinan penyebab:
  • SDK tidak diinisialisasi sebelum memanggil open()
  • URL checkout tidak valid
  • Kesalahan JavaScript di konsol
  • Masalah konektivitas jaringan
Solusi:
  • Verifikasi inisialisasi SDK terjadi sebelum membuka checkout
  • Periksa kesalahan di konsol
  • Pastikan URL checkout valid dan berasal dari create checkout session API
  • Verifikasi konektivitas jaringan
Kemungkinan penyebab:
  • Pengelola event tidak disiapkan dengan benar
  • Kesalahan JavaScript yang mencegah propagasi event
  • SDK tidak diinisialisasi dengan benar
Solusi:
  • Pastikan pengelola event dikonfigurasi dengan benar di Initialize()
  • Periksa konsol browser untuk kesalahan JavaScript
  • Verifikasi inisialisasi SDK selesai dengan sukses
  • Uji dengan pengelola event sederhana terlebih dahulu
Kemungkinan penyebab:
  • Konflik CSS dengan gaya aplikasi Anda
  • Pengaturan tema tidak diterapkan dengan benar
  • Masalah desain responsif
Solusi:
  • Periksa konflik CSS di DevTools browser
  • Verifikasi pengaturan tema sudah benar
  • Uji pada ukuran layar berbeda
  • Pastikan tidak ada konflik z-index dengan overlay

Mengaktifkan Dompet Digital

Untuk informasi detail tentang menyiapkan Google Pay dan dompet digital lainnya, lihat halaman Dompet Digital.
Apple Pay belum didukung di overlay checkout. Dukungan untuk Apple Pay akan segera hadir.

Dukungan Browser

SDK Checkout Dodo Payments mendukung browser berikut:
  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)
  • IE11+

Overlay vs Inline Checkout

Pilih jenis checkout yang tepat untuk kasus penggunaan Anda:
FiturOverlay CheckoutInline Checkout
Kedalaman integrasiModal di atas halamanSepenuhnya tertanam di halaman
Kontrol tata letakTerbatasKontrol penuh
BrandingTerpisah dari halamanMulus
Upaya implementasiLebih rendahLebih tinggi
Cocok untukIntegrasi cepat, halaman yang sudah adaHalaman checkout khusus, alur konversi tinggi
Gunakan overlay checkout untuk integrasi yang lebih cepat dengan perubahan minimal pada halaman Anda saat ini. Gunakan inline checkout saat Anda menginginkan kontrol maksimal atas pengalaman checkout dan branding yang mulus.

Sumber Terkait

Untuk bantuan lebih lanjut, kunjungi komunitas Discord kami atau hubungi tim dukungan pengembang kami.