Langsung ke konten utama

Ikhtisar

Checkout inline memungkinkan Anda untuk membuat pengalaman checkout yang sepenuhnya terintegrasi yang menyatu dengan situs web atau aplikasi Anda. Berbeda dengan overlay checkout, yang muncul sebagai modal di atas halaman Anda, checkout inline menyisipkan formulir pembayaran langsung ke dalam tata letak halaman Anda. Dengan menggunakan checkout inline, Anda dapat:
  • Membuat pengalaman checkout yang sepenuhnya terintegrasi dengan aplikasi atau situs web Anda
  • Membiarkan Dodo Payments dengan aman menangkap informasi pelanggan dan pembayaran dalam bingkai checkout yang dioptimalkan
  • Menampilkan item, total, dan informasi lain dari Dodo Payments di halaman Anda
  • Menggunakan metode dan peristiwa SDK untuk membangun pengalaman checkout yang lebih canggih
Gambar Sampul Checkout Inline

Cara Kerjanya

Checkout inline bekerja dengan menyisipkan bingkai Dodo Payments yang aman ke dalam situs web atau aplikasi Anda. Bingkai checkout menangani pengumpulan informasi pelanggan dan menangkap detail pembayaran. Halaman Anda menampilkan daftar item, total, dan opsi untuk mengubah apa yang ada di checkout. SDK memungkinkan halaman Anda dan bingkai checkout berinteraksi satu sama lain. Dodo Payments secara otomatis membuat langganan ketika checkout selesai, siap untuk Anda provision.
Frame checkout inline menangani semua informasi pembayaran sensitif dengan aman, memastikan kepatuhan PCI tanpa perlu sertifikasi tambahan dari pihak Anda.

Apa yang Membuat Checkout Inline yang Baik?

Penting bagi pelanggan untuk mengetahui siapa yang mereka beli, apa yang mereka beli, dan berapa banyak yang mereka bayar. Untuk membangun checkout inline yang sesuai dan dioptimalkan untuk konversi, implementasi Anda harus mencakup:
Contoh checkout inline dengan elemen wajib diberi label
  1. Informasi berulang: Jika berulang, seberapa sering itu terjadi dan total yang harus dibayar saat pembaruan. Jika percobaan, berapa lama percobaan berlangsung.
  2. Deskripsi item: Deskripsi tentang apa yang dibeli.
  3. Total transaksi: Total transaksi, termasuk subtotal, total pajak, dan total keseluruhan. Pastikan untuk menyertakan mata uang juga.
  4. Footer Dodo Payments: Bingkai checkout inline lengkap, termasuk footer checkout yang memiliki informasi tentang Dodo Payments, syarat penjualan kami, dan kebijakan privasi kami.
  5. Kebijakan pengembalian: Tautan ke kebijakan pengembalian Anda, jika berbeda dari kebijakan pengembalian standar Dodo Payments.
Selalu tampilkan frame checkout inline secara lengkap, termasuk footer. Menghapus atau menyembunyikan informasi hukum melanggar persyaratan kepatuhan.

Perjalanan Pelanggan

Alur checkout ditentukan oleh konfigurasi sesi checkout Anda. Tergantung pada bagaimana Anda mengonfigurasi sesi checkout, pelanggan akan mengalami checkout yang mungkin menyajikan semua informasi di satu halaman atau di beberapa langkah.
1

Customer opens checkout

Anda dapat membuka checkout inline dengan mengirimkan item atau transaksi yang sudah ada. Gunakan SDK untuk menampilkan dan memperbarui informasi di halaman, dan metode SDK untuk memperbarui item berdasarkan interaksi pelanggan.Halaman checkout awal dengan daftar item dan formulir pembayaran
2

Customer enters their details

Checkout inline pertama-tama meminta pelanggan untuk memasukkan alamat email mereka, memilih negara mereka, dan (di mana diperlukan) memasukkan kode pos atau kode pos mereka. Langkah ini mengumpulkan semua informasi yang diperlukan untuk menentukan pajak dan opsi pembayaran yang tersedia.Anda dapat mengisi detail pelanggan sebelumnya dan menyajikan alamat yang disimpan untuk memperlancar pengalaman.
3

Customer selects payment method

Setelah memasukkan detail mereka, pelanggan disajikan dengan metode pembayaran yang tersedia dan formulir pembayaran. Opsi mungkin termasuk kartu kredit atau debit, PayPal, Apple Pay, Google Pay, dan metode pembayaran lokal lainnya berdasarkan lokasi mereka.Tampilkan metode pembayaran yang disimpan jika tersedia untuk mempercepat checkout.Metode pembayaran yang tersedia dan formulir detail kartu
4

Checkout completed

Dodo Payments mengarahkan setiap pembayaran ke pengakuisisi terbaik untuk penjualan tersebut untuk mendapatkan peluang terbaik untuk sukses. Pelanggan memasuki alur kerja sukses yang dapat Anda bangun.Layar sukses dengan tanda centang konfirmasi
5

Dodo Payments creates subscription

Dodo Payments secara otomatis membuat langganan untuk pelanggan, siap untuk Anda provision. Metode pembayaran yang digunakan pelanggan disimpan untuk pembaruan atau perubahan langganan.Langganan dibuat dengan notifikasi webhook

Memulai dengan Cepat

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

// Initialize the SDK for inline mode
DodoPayments.Initialize({
  mode: "test",
  displayType: "inline",
  onEvent: (event) => {
    console.log("Checkout event:", event);
  },
});

// Open checkout in a specific container
DodoPayments.Checkout.open({
  checkoutUrl: "https://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout" // ID of the container element
});
Pastikan Anda memiliki elemen kontainer dengan id yang sesuai di halaman Anda: <div id="dodo-inline-checkout"></div>.

Panduan Integrasi Langkah-demi-Langkah

1

Install the SDK

Instal Dodo Payments Checkout SDK:
npm install dodopayments-checkout
2

Initialize the SDK for Inline Display

Inisialisasi SDK dan tentukan displayType: 'inline'. Anda juga harus mendengarkan event checkout.breakdown untuk memperbarui UI Anda dengan perhitungan pajak dan total secara real-time.
import { DodoPayments } from "dodopayments-checkout";

DodoPayments.Initialize({
  mode: "test",
  displayType: "inline",
  onEvent: (event) => {
    if (event.event_type === "checkout.breakdown") {
      const breakdown = event.data?.message;
      // Update your UI with breakdown.subTotal, breakdown.tax, breakdown.total, etc.
    }
  },
});
3

Create a Container Element

Tambahkan elemen ke HTML Anda di mana bingkai checkout akan disuntikkan:
<div id="dodo-inline-checkout"></div>
4

Open the Checkout

Panggil DodoPayments.Checkout.open() dengan checkoutUrl dan elementId dari kontainer Anda:
DodoPayments.Checkout.open({
  checkoutUrl: "https://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout"
});
5

Test Your Integration

  1. Mulai server pengembangan Anda:
npm run dev
  1. Uji alur checkout:
    • Masukkan email dan detail alamat Anda di bingkai inline.
    • Verifikasi bahwa ringkasan pesanan kustom Anda diperbarui secara real-time.
    • Uji alur pembayaran menggunakan kredensial uji.
    • Konfirmasi pengalihan berfungsi dengan benar.
Anda akan melihat event checkout.breakdown dicatat di konsol browser Anda jika Anda menambahkan console log pada callback onEvent.
6

Go Live

Ketika Anda siap untuk produksi:
  1. Ubah mode menjadi 'live':
DodoPayments.Initialize({
  mode: "live",
  displayType: "inline",
  onEvent: (event) => {
    // Handle events
  }
});
  1. Perbarui URL checkout Anda untuk menggunakan sesi checkout langsung dari backend Anda.
  2. Uji alur lengkap di produksi.

Contoh React Lengkap

Contoh ini menunjukkan cara mengimplementasikan ringkasan pesanan kustom bersamaan dengan checkout inline, menjaga keduanya tetap sinkron menggunakan event checkout.breakdown.
"use client";

import { useEffect, useState } from 'react';
import { DodoPayments, CheckoutBreakdownData } from 'dodopayments-checkout';

export default function CheckoutPage() {
  const [breakdown, setBreakdown] = useState<Partial<CheckoutBreakdownData>>({});

  useEffect(() => {
    // 1. Initialize the SDK
    DodoPayments.Initialize({
      mode: 'test',
      displayType: 'inline',
      onEvent: (event) => {
        // 2. Listen for the 'checkout.breakdown' event
        if (event.event_type === "checkout.breakdown") {
          const message = event.data?.message as CheckoutBreakdownData;
          if (message) setBreakdown(message);
        }
      }
    });

    // 3. Open the checkout in the specified container
    DodoPayments.Checkout.open({
      checkoutUrl: 'https://test.dodopayments.com/session/cks_123',
      elementId: 'dodo-inline-checkout'
    });

    return () => DodoPayments.Checkout.close();
  }, []);

  const format = (amt: number | null | undefined, curr: string | null | undefined) => 
    amt != null && curr ? `${curr} ${(amt/100).toFixed(2)}` : '0.00';

  const currency = breakdown.currency ?? breakdown.finalTotalCurrency ?? '';

  return (
    <div className="flex flex-col md:flex-row min-h-screen">
      {/* Left Side - Checkout Form */}
      <div className="w-full md:w-1/2 flex items-center">
        <div id="dodo-inline-checkout" className='w-full' />
      </div>

      {/* Right Side - Custom Order Summary */}
      <div className="w-full md:w-1/2 p-8 bg-gray-50">
        <h2 className="text-2xl font-bold mb-4">Order Summary</h2>
        <div className="space-y-2">
          {breakdown.subTotal && (
            <div className="flex justify-between">
              <span>Subtotal</span>
              <span>{format(breakdown.subTotal, currency)}</span>
            </div>
          )}
          {breakdown.discount && (
            <div className="flex justify-between">
              <span>Discount</span>
              <span>{format(breakdown.discount, currency)}</span>
            </div>
          )}
          {breakdown.tax != null && (
            <div className="flex justify-between">
              <span>Tax</span>
              <span>{format(breakdown.tax, currency)}</span>
            </div>
          )}
          <hr />
          {(breakdown.finalTotal ?? breakdown.total) && (
            <div className="flex justify-between font-bold text-xl">
              <span>Total</span>
              <span>{format(breakdown.finalTotal ?? breakdown.total, breakdown.finalTotalCurrency ?? currency)}</span>
            </div>
          )}
        </div>
      </div>
    </div>
  );
}

Referensi API

Konfigurasi

Opsi Inisialisasi

interface InitializeOptions {
  mode: "test" | "live";
  displayType: "inline"; // Required for inline checkout
  onEvent: (event: CheckoutEvent) => void;
}
OpsiTipeWajibDeskripsi
mode"test" | "live"YaMode lingkungan.
displayType"inline" | "overlay"YaHarus diatur ke "inline" untuk menyematkan checkout.
onEventfunctionYaFungsi callback untuk menangani event checkout.

Opsi Checkout

export type FontSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
export type FontWeight = "normal" | "medium" | "bold" | "extraBold";

interface CheckoutOptions {
  checkoutUrl: string;
  elementId: string; // Required for inline checkout
  options?: {
    showTimer?: boolean;
    showSecurityBadge?: boolean;
    manualRedirect?: boolean;
    payButtonText?: string;
    fontSize?: FontSize;
    fontWeight?: FontWeight;
  };
}
OpsiTipeDiperlukanDeskripsi
checkoutUrlstringYesURL sesi checkout.
elementIdstringYesid dari elemen DOM tempat checkout harus ditampilkan.
options.showTimerbooleanNoTampilkan atau sembunyikan timer checkout. Secara default true. Saat dinonaktifkan, Anda akan menerima event checkout.link_expired ketika sesi berakhir.
options.showSecurityBadgebooleanNoTampilkan atau sembunyikan badge keamanan. Secara default true.
options.manualRedirectbooleanNoSaat diaktifkan, checkout tidak akan otomatis mengalihkan setelah selesai. Sebagai gantinya, Anda akan menerima event checkout.status dan checkout.redirect_requested untuk menangani pengalihan sendiri.
options.payButtonTextstringNoTeks kustom yang ditampilkan pada tombol bayar.
options.fontSizeFontSizeNoUkuran font global untuk checkout.
options.fontWeightFontWeightNoKetebalan font global untuk checkout.

Metode

Buka Checkout

Membuka bingkai checkout di kontainer yang ditentukan.
DodoPayments.Checkout.open({
  checkoutUrl: "https://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout"
});
Anda juga dapat memberikan opsi tambahan untuk menyesuaikan perilaku checkout:
DodoPayments.Checkout.open({
  checkoutUrl: "https://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout",
  options: {
    showTimer: false,
    showSecurityBadge: false,
    manualRedirect: true,
    payButtonText: "Pay Now",
  },
});
Saat menggunakan manualRedirect, tangani penyelesaian checkout dalam callback onEvent Anda:
DodoPayments.Initialize({
  mode: "test",
  displayType: "inline",
  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

Secara programatik menghapus bingkai checkout dan membersihkan pendengar event.
DodoPayments.Checkout.close();

Periksa Status

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

Event

SDK menyediakan event real-time melalui callback onEvent. Untuk checkout inline, checkout.breakdown sangat berguna untuk menyinkronkan UI Anda.
Tipe EventDeskripsi
checkout.openedFrame checkout telah dimuat.
checkout.form_readyFormulir checkout siap menerima input pengguna. Berguna untuk menyembunyikan status pemuatan dan menampilkan UI checkout.
checkout.breakdownDipicu saat harga, pajak, atau diskon diperbarui.
checkout.customer_details_submittedDetail pelanggan telah diserahkan.
checkout.pay_button_clickedDipicu saat pelanggan mengklik tombol bayar. Berguna untuk analitik dan melacak konversi.
checkout.redirectCheckout akan melakukan pengalihan (misalnya ke halaman bank).
checkout.errorTerjadi kesalahan selama checkout.
checkout.link_expiredDipicu saat sesi checkout kedaluwarsa. Hanya diterima ketika showTimer diatur ke false.
checkout.statusDipicu saat manualRedirect diaktifkan. Berisi status checkout (succeeded, failed, atau processing).
checkout.redirect_requestedDipicu saat manualRedirect diaktifkan. Berisi URL untuk mengalihkan pelanggan.

Data Rincian Checkout

Event checkout.breakdown memberikan data berikut:
interface CheckoutBreakdownData {
  subTotal?: number;          // Amount in cents
  discount?: number;         // Amount in cents
  tax?: number;              // Amount in cents
  total?: number;            // Amount in cents
  currency?: string;         // e.g., "USD"
  finalTotal?: number;       // Final amount including adjustments
  finalTotalCurrency?: string; // Currency for the final total
}

Data Event Status Checkout

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

Data Event Pengalihan Checkout Diminta

Saat manualRedirect diaktifkan, Anda menerima event checkout.redirect_requested dengan data berikut:
interface CheckoutRedirectRequestedEventData {
  message: {
    redirect_to?: string;
  };
}

Memahami Event Rincian

Event checkout.breakdown adalah cara utama untuk menjaga UI aplikasi Anda tetap sinkron dengan status checkout Dodo Payments. Saat ini terjadi:
  • Saat inisialisasi: Segera setelah bingkai checkout dimuat dan siap.
  • Saat perubahan alamat: Setiap kali pelanggan memilih negara atau memasukkan kode pos yang mengakibatkan perhitungan ulang pajak.
Detail Field:
KolomDeskripsi
subTotalJumlah semua item baris dalam sesi sebelum diskon atau pajak diterapkan.
discountTotal nilai semua diskon yang diterapkan.
taxJumlah pajak yang dihitung. Dalam mode inline, ini diperbarui secara dinamis saat pengguna berinteraksi dengan kolom alamat.
totalHasil matematis dari subTotal - discount + tax dalam mata uang dasar sesi.
currencyKode mata uang ISO (misalnya "USD") untuk subtotal standar, diskon, dan nilai pajak.
finalTotalJumlah aktual yang dibebankan kepada pelanggan. Ini mungkin mencakup penyesuaian nilai tukar asing tambahan atau biaya metode pembayaran lokal yang tidak termasuk dalam rincian harga dasar.
finalTotalCurrencyMata uang yang benar-benar digunakan pelanggan untuk membayar. Ini dapat berbeda dari currency jika paritas daya beli atau konversi mata uang lokal aktif.
Tips Integrasi Utama:
  1. Format Mata Uang: Harga selalu dikembalikan sebagai bilangan bulat dalam unit mata uang terkecil (misalnya sen untuk USD, yen untuk JPY). Untuk menampilkannya, bagi dengan 100 (atau pangkat 10 yang sesuai) atau gunakan library pemformatan seperti Intl.NumberFormat.
  2. Menangani Status Awal: Ketika checkout pertama kali dimuat, tax dan discount mungkin 0 atau null sampai pengguna memberikan informasi penagihan atau menerapkan kode. UI Anda harus menangani status ini dengan mulus (misalnya menampilkan tanda hubung atau menyembunyikan baris tersebut).
  3. “Total Akhir” vs “Total”: Sementara total memberi Anda perhitungan harga standar, finalTotal adalah sumber kebenaran untuk transaksi. Jika finalTotal hadir, itu mencerminkan persis apa yang akan dibebankan ke kartu pelanggan, termasuk penyesuaian dinamis.
  4. Umpan Balik Real-time: Gunakan kolom tax untuk menunjukkan kepada pengguna bahwa pajak sedang dihitung secara real-time. Ini memberikan nuansa “langsung” pada halaman checkout Anda dan mengurangi gesekan selama langkah pengisian alamat.

Opsi Implementasi

Instalasi Manajer Paket

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 Inline 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",
            displayType: "inline",
            onEvent: (event) => {
                console.log('Checkout event:', event);
            }
        });
    </script>
</head>
<body>
    <div id="dodo-inline-checkout"></div>

    <script>
        // Open the checkout
        DodoPaymentsCheckout.DodoPayments.Checkout.open({
            checkoutUrl: "https://test.dodopayments.com/session/cks_123",
            elementId: "dodo-inline-checkout"
        });
    </script>
</body>
</html>

Perbarui Metode Pembayaran

Inline checkout mendukung pembaruan metode pembayaran untuk langganan. Ketika pelanggan perlu memperbarui metode pembayarannya — baik untuk langganan aktif maupun untuk mengaktifkan kembali langganan yang ditangguhkan — Anda dapat menampilkan alur pembaruan langsung di dalam tata letak halaman Anda.

Cara Kerjanya

  1. Panggil Update Payment Method API untuk mendapatkan payment_link:
const response = await client.subscriptions.updatePaymentMethod('sub_123', {
  type: 'new',
  return_url: 'https://example.com/return'
});
  1. Kirimkan payment_link yang dikembalikan sebagai checkoutUrl untuk membuka inline checkout:
DodoPayments.Checkout.open({
  checkoutUrl: response.payment_link,
  elementId: "dodo-inline-checkout"
});
Inline frame hanya merender formulir pengumpulan metode pembayaran. Pelanggan dapat memasukkan detail kartu baru atau memilih metode pembayaran yang tersimpan tanpa meninggalkan halaman Anda.

Untuk Langganan yang Ditangguhkan

Saat memperbarui metode pembayaran untuk langganan dalam status on_hold, Dodo Payments secara otomatis membuat biaya untuk hutang yang tersisa. Pantau webhook payment.succeeded dan subscription.active untuk memastikan reaktivasi.
const response = await client.subscriptions.updatePaymentMethod('sub_123', {
  type: 'new',
  return_url: 'https://example.com/return'
});

if (response.payment_id) {
  // Charge created for remaining dues
  // Open inline checkout for payment collection
  DodoPayments.Checkout.open({
    checkoutUrl: response.payment_link,
    elementId: "dodo-inline-checkout"
  });
}
Anda juga dapat menggunakan metode pembayaran tersimpan yang sudah ada daripada mengumpulkan detail baru dengan mengirimkan type: 'existing' bersama payment_method_id ke Update Payment Method API.

Penanganan Kesalahan

SDK memberikan informasi kesalahan yang rinci melalui sistem event. Selalu terapkan penanganan kesalahan yang tepat di dalam callback onEvent Anda:
DodoPayments.Initialize({
  mode: "test",
  displayType: "inline",
  onEvent: (event: CheckoutEvent) => {
    if (event.event_type === "checkout.error") {
      console.error("Checkout error:", event.data?.message);
      // Handle error appropriately
    }
  }
});
Selalu tangani event checkout.error untuk memberikan pengalaman pengguna yang baik saat terjadi masalah.

Praktik Terbaik

  1. Desain Responsif: Pastikan elemen kontainer Anda memiliki lebar dan tinggi yang cukup. Iframe biasanya akan memperluas untuk mengisi kontainernya.
  2. Sinkronisasi: Gunakan event checkout.breakdown untuk menjaga ringkasan pesanan kustom atau tabel harga Anda tetap sinkron dengan apa yang dilihat pengguna di frame checkout.
  3. Status Skeleton: Tampilkan indikator pemuatan dalam kontainer Anda sampai event checkout.opened dipicu.
  4. Pembersihan: Panggil DodoPayments.Checkout.close() saat komponen Anda dilepas untuk membersihkan iframe dan pendengar event.
Untuk implementasi mode gelap, disarankan menggunakan #0d0d0d sebagai warna latar belakang agar integrasi visual dengan frame inline checkout optimal.

Validasi Status Pembayaran

Jangan hanya mengandalkan event inline checkout untuk menentukan keberhasilan atau kegagalan pembayaran. Selalu terapkan validasi sisi server menggunakan webhook dan/atau polling.

Mengapa Validasi Sisi Server Itu Penting

Meskipun event inline checkout seperti checkout.status memberikan umpan balik waktu nyata, event tersebut tidak boleh menjadi satu-satunya sumber kebenaran untuk status pembayaran. Masalah jaringan, kerusakan peramban, atau pengguna menutup halaman dapat menyebabkan event terlewat. Untuk memastikan validasi pembayaran yang andal:
  1. Server Anda harus mendengarkan event webhook - Dodo Payments mengirim webhook untuk perubahan status pembayaran
  2. Terapkan mekanisme polling - Antarmuka Anda harus melakukan polling ke server untuk pembaruan status
  3. Gabungkan kedua pendekatan - Gunakan webhook sebagai sumber utama dan polling sebagai cadangan

Arsitektur yang Direkomendasikan

Langkah Implementasi

1. Dengarkan event checkout - Ketika pengguna mengklik bayar, mulai persiapkan untuk memverifikasi status:
onEvent: (event) => {
  if (event.event_type === 'checkout.status') {
    // Start polling your server for confirmed status
    startPolling();
  }
}
2. Lakukan polling ke server Anda - Buat endpoint yang memeriksa database Anda untuk status pembayaran (yang diperbarui oleh webhook):
// Poll every 2 seconds until status is confirmed
const interval = setInterval(async () => {
  const { status } = await fetch(`/api/payments/${paymentId}/status`).then(r => r.json());
  if (status === 'succeeded' || status === 'failed') {
    clearInterval(interval);
    handlePaymentResult(status);
  }
}, 2000);
3. Tangani webhook di sisi server - Perbarui database Anda ketika Dodo mengirimkan webhook payment.succeeded atau payment.failed. Lihat dokumentasi Webhooks kami untuk detailnya.

Menangani Pengalihan (3DS, Google Pay, UPI)

Saat menggunakan manualRedirect: true, beberapa metode pembayaran membutuhkan pengalihan pengguna dari halaman Anda untuk otentikasi:
  • 3D Secure (3DS) - Autentikasi kartu
  • Google Pay - Autentikasi dompet pada beberapa alur
  • UPI - Pengalihan metode pembayaran India
Ketika pengalihan diperlukan, Anda akan menerima event checkout.redirect_requested. Alihkan pengguna ke URL yang diberikan:
if (event.event_type === 'checkout.redirect_requested') {
  const redirectUrl = event.data?.message?.redirect_to;
  // Save payment ID before redirect, then redirect
  sessionStorage.setItem('pendingPaymentId', paymentId);
  window.location.href = redirectUrl;
}
Setelah otentikasi selesai (berhasil atau gagal), pengguna kembali ke halaman Anda. Jangan menganggap pembayaran berhasil hanya karena pengguna kembali. Sebagai gantinya:
  1. Periksa apakah pengguna kembali dari pengalihan (misalnya, melalui sessionStorage)
  2. Mulai polling ke server Anda untuk status pembayaran yang telah dikonfirmasi
  3. Tampilkan status “Memverifikasi pembayaran…” saat melakukan polling
  4. Tampilkan antarmuka sukses/gagal berdasarkan status yang dikonfirmasi server
Selalu verifikasi status pembayaran di sisi server setelah pengalihan. Kembalinya pengguna ke halaman Anda hanya berarti otentikasi selesai—itu tidak menunjukkan apakah pembayaran berhasil atau gagal.

Pemecahan Masalah

  • Verifikasi bahwa elementId cocok dengan id dari div yang benar-benar ada di DOM.
  • Pastikan displayType: 'inline' dikirim ke Initialize.
  • Periksa bahwa checkoutUrl valid.
  • Pastikan Anda mendengarkan event checkout.breakdown.
  • Pajak hanya dihitung setelah pengguna memasukkan negara dan kode pos yang valid di frame checkout.

Mengaktifkan Dompet Digital

Untuk informasi terperinci tentang cara menyiapkan Apple Pay, Google Pay, dan dompet digital lainnya, lihat halaman Digital Wallets.

Pengaturan Cepat untuk Apple Pay

1

Download domain association file

2

Request activation

Kirim email ke support@dodopayments.com dengan URL domain produksi Anda dan minta aktivasi Apple Pay.
3

Test after confirmation

Setelah dikonfirmasi, pastikan Apple Pay muncul di checkout dan uji seluruh alurnya.
Apple Pay memerlukan verifikasi domain sebelum muncul di produksi. Hubungi dukungan sebelum go-live jika Anda berencana menawarkan Apple Pay.

Dukungan Peramban

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

Checkout Inline vs Overlay

Pilih jenis checkout yang tepat untuk kasus penggunaan Anda:
FiturInline CheckoutOverlay Checkout
Tingkat integrasiTersemat penuh di halamanModal di atas halaman
Kontrol tata letakKontrol penuhTerbatas
Pencitraan merekMulusTerpisah dari halaman
Upaya implementasiLebih tinggiLebih rendah
Terbaik untukHalaman checkout kustom, alur konversi tinggiIntegrasi cepat, halaman yang sudah ada
Gunakan inline checkout ketika Anda menginginkan kontrol maksimum atas pengalaman checkout dan pencitraan yang mulus. Gunakan overlay checkout untuk integrasi cepat dengan perubahan minimal pada halaman yang sudah ada.

Sumber Daya Terkait

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