Chuyển đến nội dung chính

Tổng quan

SDK Thanh toán Dodo cung cấp một cách tích hợp liền mạch để đưa overlay thanh toán của chúng tôi vào ứng dụng web của bạn. Được xây dựng bằng TypeScript và các tiêu chuẩn web hiện đại, nó cung cấp một giải pháp mạnh mẽ để xử lý thanh toán với việc xử lý sự kiện theo thời gian thực và các chủ đề tùy chỉnh.
Overlay Checkout Cover Image

Demo

Interactive Demo

Xem thanh toán phủ hoạt động qua bản demo trực tiếp của chúng tôi.

Bắt đầu nhanh

Bắt đầu với SDK Thanh toán Dodo chỉ trong vài dòng mã:
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"
});
Lấy URL thanh toán từ API tạo phiên thanh toán.

Hướng dẫn tích hợp từng bước

1

Install the SDK

Cài đặt SDK Thanh toán Dodo bằng cách sử dụng trình quản lý gói ưa thích của bạn:
npm install dodopayments-checkout
2

Initialize the SDK

Khởi tạo SDK trong ứng dụng của bạn, thường là trong thành phần chính hoặc điểm vào ứng dụng:
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;
    }
  },
});
Luôn khởi tạo SDK trước khi cố mở thanh toán. Việc khởi tạo chỉ nên diễn ra một lần khi ứng dụng của bạn tải lên.
3

Create a Checkout Button Component

Tạo một thành phần mở overlay thanh toán:
// 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

Sử dụng thành phần nút thanh toán trong ứng dụng của bạn:
// 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

Tạo các trang để xử lý chuyển hướng thanh toán:
// 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. Bắt đầu máy chủ phát triển của bạn:
npm run dev
  1. Kiểm tra quy trình thanh toán:
    • Nhấp vào nút thanh toán
    • Xác minh overlay xuất hiện
    • Kiểm tra quy trình thanh toán bằng cách sử dụng thông tin xác thực thử nghiệm
    • Xác nhận các chuyển hướng hoạt động chính xác
Bạn sẽ thấy các sự kiện thanh toán được ghi lại trong bảng điều khiển trình duyệt.
7

Go Live

Khi bạn đã sẵn sàng cho sản xuất:
  1. Thay đổi chế độ thành 'live':
DodoPayments.Initialize({
  mode: "live",
  displayType: "overlay",
  onEvent: (event) => {
    console.log("Checkout event:", event);
  }
});
  1. Cập nhật các URL thanh toán của bạn để sử dụng các phiên thanh toán trực tiếp từ backend của bạn
  2. Kiểm tra quy trình hoàn chỉnh trong sản xuất
  3. Giám sát các sự kiện và lỗi

Tài liệu API

Cấu hình

Tùy chọn khởi tạo

interface InitializeOptions {
  mode: "test" | "live";
  displayType?: "overlay" | "inline";
  onEvent: (event: CheckoutEvent) => void;
}
Tùy chọnLoạiBắt buộcMô tả
mode"test" | "live"Chế độ môi trường: 'test' cho phát triển, 'live' cho sản xuất
displayType"overlay" | "inline"KhôngLoại hiển thị: 'overlay' cho thanh toán modal (mặc định), 'inline' cho thanh toán nhúng
onEventfunctionHàm gọi lại để xử lý các sự kiện thanh toán

Tùy chọn thanh toán

interface CheckoutOptions {
  checkoutUrl: string;
  options?: {
    showTimer?: boolean;
    showSecurityBadge?: boolean;
  };
}
Lựa chọnLoạiBắt buộcMô tả
checkoutUrlstringURL phiên thanh toán từ API tạo phiên thanh toán
options.showTimerbooleanKhôngHiện hoặc ẩn đồng hồ đếm ngược. Mặc định là true. Khi bị vô hiệu, bạn sẽ nhận được sự kiện checkout.link_expired khi phiên hết hạn.
options.showSecurityBadgebooleanKhôngHiện hoặc ẩn huy hiệu bảo mật. Mặc định là true.

Phương thức

Mở thanh toán

Mở overlay thanh toán với URL phiên thanh toán đã chỉ định.
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123"
});
Bạn cũng có thể truyền thêm tùy chọn để tùy chỉnh hành vi thanh toán:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    showTimer: false,
    showSecurityBadge: false,
  },
});

Đóng Checkout

Đóng giao diện thanh toán bằng lập trình.
DodoPayments.Checkout.close();

Kiểm tra Trạng thái

Trả về trạng thái giao diện thanh toán hiện đang mở hay không.
const isOpen = DodoPayments.Checkout.isOpen();
// Returns: boolean

Sự kiện

SDK cung cấp sự kiện theo thời gian thực mà bạn có thể nghe qua callback onEvent:
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;
    }
  }
});
Loại Sự kiệnMô tả
checkout.openedGiao diện thanh toán đã được mở
checkout.form_readyBiểu mẫu thanh toán đã sẵn sàng nhận thông tin từ người dùng. Hữu ích để ẩn trạng thái tải.
checkout.payment_page_openedTrang thanh toán đã được hiển thị
checkout.customer_details_submittedThông tin khách hàng và hóa đơn đã được gửi
checkout.closedGiao diện thanh toán đã được đóng
checkout.redirectThanh toán sẽ thực hiện chuyển hướng
checkout.errorXảy ra lỗi trong quá trình thanh toán
checkout.link_expiredKích hoạt khi phiên thanh toán hết hạn. Chỉ nhận được khi showTimer được đặt thành false.

Tùy chọn Triển khai

Cài đặt Trình quản lý Gói

Cài đặt qua npm, yarn, hoặc pnpm như được trình bày trong Hướng dẫn Tích hợp Từng Bước.

Triển khai CDN

Để tích hợp nhanh mà không cần bước xây dựng, bạn có thể sử dụng CDN của chúng tôi:
<!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>

Tùy chỉnh Giao diện

Bạn có thể tùy chỉnh giao diện thanh toán bằng cách truyền đối tượng themeConfig vào tham số options khi mở thanh toán. Cấu hình giao diện hỗ trợ cả chế độ sáng và tối, cho phép bạn tùy chỉnh màu sắc, viền, văn bản, nút, và bán kính viền.
Phần này đề cập đến cấu hình giao diện client-side bằng cách sử dụng SDK Checkout. Bạn cũng có thể cấu hình giao diện server-side khi tạo phiên thanh toán qua API bằng tham số theme_config. Xem Tùy chỉnh Giao diện Thanh toán cho cấu hình mức API, hoặc sử dụng trang Thiết kế trên bảng điều khiển để cấu hình giao diện một cách trực quan với xem trước trực tiếp.

Cấu hình giao diện cơ bản

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",
    },
  },
});

Cấu hình giao diện hoàn chỉnh

Tất cả các thuộc tính giao diện khả dụng:
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
    },
  },
});

Chỉ chế độ Sáng

Nếu bạn chỉ muốn tùy chỉnh giao diện sáng:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        textPrimary: "#000000",
        buttonPrimary: "#0070F3",
      },
      radius: "12px",
    },
  },
});

Chỉ chế độ Tối

Nếu bạn chỉ muốn tùy chỉnh giao diện tối:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    themeConfig: {
      dark: {
        bgPrimary: "#000000",
        textPrimary: "#FFFFFF",
        buttonPrimary: "#0070F3",
      },
      radius: "12px",
    },
  },
});

Ghi đè Một phần giao diện

Bạn có thể ghi đè chỉ các thuộc tính nhất định. Thanh toán sẽ sử dụng các giá trị mặc định cho các thuộc tính bạn không chỉ định:
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
    },
  },
});

Cấu hình giao diện với các tùy chọn khác

Bạn có thể kết hợp cấu hình giao diện với các tùy chọn thanh toán khác:
DodoPayments.Checkout.open({
  checkoutUrl: "https://checkout.dodopayments.com/session/cks_123",
  options: {
    showTimer: true,
    showSecurityBadge: true,
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        buttonPrimary: "#A6E500",
      },
      dark: {
        bgPrimary: "#0D0D0D",
        buttonPrimary: "#A6E500",
      },
      radius: "8px",
    },
  },
});

Loại TypeScript

Đối với người dùng TypeScript, tất cả các loại cấu hình giao diện đều được xuất khẩu:
import { ThemeConfig, ThemeModeConfig } from "dodopayments-checkout";

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

Xử lý Lỗi

SDK cung cấp thông tin lỗi chi tiết qua hệ thống sự kiện. Luôn triển khai xử lý lỗi đúng cách trong callback onEvent:
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");
    }
  }
});
Luôn xử lý sự kiện checkout.error để cung cấp trải nghiệm người dùng tốt khi xảy ra lỗi.

Thực hành Tốt nhất

  1. Khởi tạo một lần: Khởi tạo SDK một lần khi ứng dụng của bạn tải, không phải vào mỗi lần thử thanh toán
  2. Xử lý lỗi: Luôn triển khai xử lý lỗi đúng cách trong callback sự kiện của bạn
  3. Chế độ kiểm tra: Sử dụng chế độ test trong quá trình phát triển và chỉ chuyển sang live khi sẵn sàng sản xuất
  4. Xử lý sự kiện: Xử lý tất cả các sự kiện liên quan để có trải nghiệm người dùng hoàn chỉnh
  5. URL hợp lệ: Luôn sử dụng URL thanh toán hợp lệ từ API tạo phiên thanh toán
  6. TypeScript: Sử dụng TypeScript để có an toàn loại tốt hơn và trải nghiệm nhà phát triển tốt hơn
  7. Trạng thái tải: Hiển thị trạng thái tải trong khi thanh toán đang mở để cải thiện UX
  8. Quản lý đồng hồ đếm ngược: Vô hiệu hóa đồng hồ (showTimer: false) nếu bạn muốn xử lý hết hạn phiên thủ công

Khắc phục sự cố

Nguyên nhân có thể:
  • SDK chưa được khởi tạo trước khi gọi open()
  • URL thanh toán không hợp lệ
  • Lỗi JavaScript trong bảng điều khiển
  • Sự cố kết nối mạng
Giải pháp:
  • Xác minh khởi tạo SDK diễn ra trước khi mở thanh toán
  • Kiểm tra lỗi trong bảng điều khiển
  • Đảm bảo URL thanh toán hợp lệ và từ API tạo phiên thanh toán
  • Xác minh kết nối mạng
Nguyên nhân có thể:
  • Trình xử lý sự kiện không được thiết lập đúng
  • Lỗi JavaScript ngăn cản sự kiện lan truyền
  • SDK chưa được khởi tạo đúng cách
Giải pháp:
  • Xác nhận trình xử lý sự kiện được cấu hình đúng trong Initialize()
  • Kiểm tra lỗi JavaScript trong bảng điều khiển trình duyệt
  • Xác minh khởi tạo SDK hoàn tất một cách thành công
  • Thử nghiệm với một trình xử lý sự kiện đơn giản trước
Nguyên nhân có thể:
  • Xung đột CSS với kiểu ứng dụng của bạn
  • Cài đặt giao diện không được áp dụng đúng
  • Vấn đề thiết kế đáp ứng
Giải pháp:
  • Kiểm tra xung đột CSS trong DevTools trình duyệt
  • Xác minh cấu hình giao diện đúng
  • Kiểm tra trên các kích thước màn hình khác nhau
  • Đảm bảo không có xung đột z-index với giao diện

Kích hoạt Ví Điện Tử

Để biết thông tin chi tiết về thiết lập Google Pay và các ví điện tử khác, xem trang Ví Điện Tử.
Apple Pay hiện chưa được hỗ trợ trong giao diện thanh toán lớp phủ. Hỗ trợ cho Apple Pay sẽ sớm có.

Hỗ trợ Trình duyệt

SDK Dodo Payments Checkout hỗ trợ các trình duyệt sau:
  • Chrome (mới nhất)
  • Firefox (mới nhất)
  • Safari (mới nhất)
  • Edge (mới nhất)
  • IE11+

Lớp phủ so với Thanh toán Trực tiếp

Chọn loại giao diện thanh toán phù hợp với trường hợp sử dụng của bạn:
Tính năngThanh toán Lớp phủThanh toán Trực tiếp
Độ sâu tích hợpModal trên trangNhúng hoàn toàn trong trang
Kiểm soát bố cụcHạn chếKiểm soát hoàn toàn
Thương hiệuTách biệt với trangLiền mạch
Nỗ lực triển khaiThấp hơnCao hơn
Tốt nhất choTích hợp nhanh chóng, trang hiện tạiTrang thanh toán tùy chỉnh, luồng chuyển đổi cao
Sử dụng thanh toán lớp phủ để tích hợp nhanh hơn với sự thay đổi tối thiểu đối với các trang hiện tại của bạn. Sử dụng thanh toán trực tiếp khi bạn muốn kiểm soát tối đa trải nghiệm thanh toán và thương hiệu liền mạch.

Tài nguyên liên quan

Inline Checkout

Nhúng thanh toán trực tiếp vào trang của bạn để có trải nghiệm tích hợp đầy đủ.

Checkout Sessions API

Tạo phiên thanh toán để hỗ trợ trải nghiệm thanh toán của bạn.

Webhooks

Xử lý sự kiện thanh toán phía máy chủ với webhooks.

Integration Guide

Hướng dẫn đầy đủ tích hợp Dodo Payments.
Để được trợ giúp thêm, hãy truy cập cộng đồng Discord của chúng tôi hoặc liên hệ với đội ngũ hỗ trợ nhà phát triển của chúng tôi.
Last modified on April 20, 2026