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.
Hình ảnh bìa Overlay Checkout

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;
    manualRedirect?: boolean;
  };
}
Tùy 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 thị hoặc ẩn bộ đếm thời gian thanh toán. Mặc định là true. Khi tắt, bạn sẽ nhận được sự kiện checkout.link_expired khi phiên hết hạn.
options.showSecurityBadgebooleanKhôngHiển thị hoặc ẩn huy hiệu bảo mật. Mặc định là true.
options.manualRedirectbooleanKhôngKhi bật, thanh toán sẽ không tự động chuyển hướng sau khi hoàn thành. Thay vào đó, bạn sẽ nhận được các sự kiện checkout.statuscheckout.redirect_requested để tự xử lý việc chuyển hướng.

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,
    manualRedirect: true,
  },
});
Khi sử dụng manualRedirect, hãy xử lý việc hoàn tất thanh toán trong callback onEvent của bạn:
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
    }
  },
});

Đóng Thanh Toán

Đóng overlay thanh toán một cách lập trình.
DodoPayments.Checkout.close();

Kiểm Tra Trạng Thái

Trả về trạng thái hiện tại của overlay thanh toán.
const isOpen = DodoPayments.Checkout.isOpen();
// Returns: boolean

Sự Kiện

SDK cung cấp các sự kiện thời gian thực mà bạn có thể lắng nghe qua callback onEvent:

Dữ Liệu Sự Kiện Trạng Thái Thanh Toán

Khi manualRedirect được bật, bạn sẽ nhận được sự kiện checkout.status với dữ liệu sau:
interface CheckoutStatusEventData {
  message: {
    status?: "succeeded" | "failed" | "processing";
  };
}

Dữ Liệu Sự Kiện Yêu Cầu Chuyển Hướng Thanh Toán

Khi manualRedirect được bật, bạn sẽ nhận được sự kiện checkout.redirect_requested với dữ liệu sau:
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;
    }
  }
});
Loại sự kiệnMô tả
checkout.openedĐã mở overlay thanh toán
checkout.form_readyBiểu mẫu thanh toán sẵn sàng nhận dữ liệu người dùng. Hữu ích để ẩn trạng thái tải.
checkout.payment_page_openedTrang thanh toán đã hiển thị
checkout.customer_details_submittedKhách hàng và thông tin thanh toán đã được gửi
checkout.closedĐã đóng overlay thanh toán
checkout.redirectThanh toán sẽ thực hiện chuyển hướng
checkout.errorĐã xảy ra lỗi trong quá trình thanh toán
checkout.link_expiredĐược kích hoạt khi phiên thanh toán hết hạn. Chỉ nhận được khi showTimer được đặt thành false.
checkout.statusĐược kích hoạt khi manualRedirect được bật. Chứa trạng thái thanh toán (succeeded, failed, hoặc processing).
checkout.redirect_requestedĐược kích hoạt khi manualRedirect được bật. Chứa URL để chuyển hướng khách hàng đến.

Tùy Chọn Triển Khai

Cài Đặt Qua Trình Quản Lý Gói

Cài đặt qua npm, yarn hoặc pnpm như được mô tả 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 một đối tượng themeConfig vào tham số options khi mở thanh toán. Cấu hình chủ đề 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 ở phía khách hàng bằng cách sử dụng Checkout SDK. Bạn cũng có thể cấu hình giao diện ở phía máy chủ khi tạo phiên thanh toán qua API bằng tham số theme_config. Xem Tùy chỉnh giao diện Checkout để biết cấu hình cấp API, hoặc dùng Trang Thiết kế trong bảng điều khiển để cấu hình giao diện với bản xem trước trực tiếp.

Cấu hình chủ đề 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 chủ đề hoàn chỉnh

Tất cả thuộc tính chủ đề có sẵn:
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 chủ đề 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 chủ đề 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 chủ đề

Bạn có thể chỉ ghi đè một số thuộc tính cụ thể. Thanh toán sẽ sử dụng giá trị mặc định cho những 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 chủ đề cùng các tùy chọn khác

Bạn có thể kết hợp cấu hình chủ đề 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,
    manualRedirect: false,
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        buttonPrimary: "#A6E500",
      },
      dark: {
        bgPrimary: "#0D0D0D",
        buttonPrimary: "#A6E500",
      },
      radius: "8px",
    },
  },
});

Kiểu TypeScript

Đối với người dùng TypeScript, tất cả kiểu cấu hình chủ đề đều được xuất:
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 thông qua hệ thống sự kiện. Luôn triển khai xử lý lỗi phù hợp trong callback onEvent của bạn:
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 để đảm bảo 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 lên, không phải mỗi lần thử thanh toán
  2. Xử lý lỗi: Luôn triển khai xử lý lỗi phù hợp trong callback sự kiện của bạn
  3. Chế độ thử nghiệm: Sử dụng chế độ test trong quá trình phát triển và chuyển sang live chỉ khi sẵn sàng đưa vào sản xuất
  4. Xử lý sự kiện: Xử lý tất cả các sự kiện liên quan để mang lại trải nghiệm người dùng trọn vẹn
  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 để tăng độ an toàn kiểu và trải nghiệm phát triể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. Chuyển hướng thủ công: Sử dụng manualRedirect khi bạn cần kiểm soát tùy chỉnh về điều hướng sau thanh toán
  9. Quản lý bộ đếm thời gian: Tắt bộ đếm (showTimer: false) nếu bạn muốn tự xử lý việc hết hạn phiên

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 console
  • Sự cố kết nối mạng
Giải pháp:
  • Xác minh việc khởi tạo SDK diễn ra trước khi mở thanh toán
  • Kiểm tra lỗi trong console
  • Đảm bảo URL thanh toán hợp lệ và đến 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 cách
  • Lỗi JavaScript ngăn sự kiện lan truyền
  • SDK chưa được khởi tạo chính xác
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 console trình duyệt để tìm lỗi JavaScript
  • Xác minh SDK đã khởi tạo thành công
  • Thử nghiệm trước với một trình xử lý sự kiện đơn giản
Nguyên nhân có thể:
  • Xung đột CSS với kiểu của ứng dụng bạn
  • Cài đặt chủ đề chưa được áp dụng đúng
  • Vấn đề thiết kế đáp ứng
Giải pháp:
  • Kiểm tra xung đột CSS trong DevTools của trình duyệt
  • Xác minh cài đặt chủ đề là chính xác
  • Thử nghiệm 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 overlay

Kích hoạt ví kỹ thuật số

Để biết thông tin chi tiết về việc thiết lập Google Pay và các ví kỹ thuật số khác, hãy xem trang Ví kỹ thuật số.
Apple Pay hiện vẫn chưa được hỗ trợ trong thanh toán overlay. Hỗ trợ 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 (phiên bản mới nhất)
  • Firefox (phiên bản mới nhất)
  • Safari (phiên bản mới nhất)
  • Edge (phiên bản mới nhất)
  • IE11+

Thanh toán Overlay và Inline

Chọn loại 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 OverlayThanh toán Inline
Độ sâu tích hợpCửa sổ modal nằm trên trangTích hợp hoàn toàn trong trang
Kiểm soát bố cụcHạn chếToàn quyền kiểm soát
Nhận diện thương hiệuRiêng biệt so với trangLiền mạch
Mức độ triển khaiThấp hơnCao hơn
Phù hợp vớiTích hợp nhanh, các trang hiện cóTrang thanh toán tùy chỉnh, luồng chuyển đổi cao
Sử dụng thanh toán overlay để tích hợp nhanh mà không cần thay đổi nhiều trên các trang hiện có. Dùng thanh toán inline khi bạn cần kiểm soát tối đa trải nghiệm thanh toán và nhận diện thương hiệu liền mạch.

Tài nguyên liên quan

Để đượ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ệ đội hỗ trợ nhà phát triển.