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

Demo Tương tác

Xem overlay checkout hoạt động với 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 của bạn từ API tạo phiên thanh toán.

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

1

Cài đặt 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

Khởi tạo 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ố gắng mở thanh toán. Việc khởi tạo nên diễn ra một lần khi ứng dụng của bạn tải.
3

Tạo thành phần nút thanh toán

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

Thêm thanh toán vào trang của bạn

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

Xử lý trang thành công và thất bại

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

Kiểm tra tích hợp của bạn

  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 nên 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 của bạn.
7

Đi vào sản xuất

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 callback để 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 bị vô hiệu hóa, 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 được kích hoạt, thanh toán sẽ không tự động chuyển hướng sau khi hoàn tất. 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, xử lý việc hoàn tất thanh toán trong hàm callback onEvent:
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 thông qua hàm callback onEvent:

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

Khi manualRedirect được kích hoạ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 kích hoạ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.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.openedOverlay thanh toán đã được mở
checkout.payment_page_openedTrang thanh toán đã được hiển thị
checkout.customer_details_submittedThông tin khách hàng và thanh toán đã được gửi
checkout.closedOverlay thanh toán đã được đóng
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 kích hoạ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 kích hoạ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 trong 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.

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 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 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 cụ thể. 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,
    manualRedirect: false,
    themeConfig: {
      light: {
        bgPrimary: "#FFFFFF",
        buttonPrimary: "#A6E500",
      },
      dark: {
        bgPrimary: "#0D0D0D",
        buttonPrimary: "#A6E500",
      },
      radius: "8px",
    },
  },
});

Các Kiểu TypeScript

Đối với người dùng TypeScript, tất cả các kiểu 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 thông qua hệ thống sự kiện. Luôn thực hiện xử lý lỗi đúng cách trong hàm callback của bạn 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 trên mỗi lần cố gắng thanh toán
  2. Xử lý lỗi: Luôn thực hiện xử lý lỗi đúng cách trong hàm 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 cho 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 kiểu tốt hơn và trải nghiệm lập trình viê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. 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: Vô hiệu hóa bộ đếm thời gian (showTimer: false) nếu bạn muốn xử lý việc hết hạn phiên một cách 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
  • Vấn đề kết nối mạng
Giải pháp:
  • Xác minh rằng SDK đã được khởi tạo 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 cách
  • Lỗi JavaScript ngăn cản sự lan truyền sự kiện
  • SDK không được khởi tạo đúng cách
Giải pháp:
  • Xác nhận rằng trình xử lý sự kiện được cấu hình đúng trong Initialize()
  • Kiểm tra bảng điều khiển trình duyệt để tìm lỗi JavaScript
  • Xác minh rằng việc khởi tạo SDK đã hoàn tất 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 dáng ứng dụng của bạn
  • Cài đặt giao diện không được áp dụng đúng cách
  • 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 rằng cài đặt giao diện 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 lớp phủ

Kích hoạt Ví điện tử

Để biết thông tin chi tiết về cách thiết lập Apple Pay, Google Pay và các ví điện tử khác, hãy tham khảo trang Ví điện tử.

Thiết lập nhanh cho Apple Pay

1

Tải xuống tệp liên kết miền

2

Yêu cầu kích hoạt

Gửi email tới support@dodopayments.com với URL miền sản xuất của bạn và yêu cầu kích hoạt Apple Pay.
3

Kiểm tra sau khi xác nhận

Sau khi được xác nhận, xác minh xem Apple Pay có xuất hiện trong thanh toán và kiểm tra toàn bộ quy trình.
Apple Pay yêu cầu xác minh miền trước khi nó xuất hiện trong môi trường sản xuất. Liên hệ với bộ phận hỗ trợ trước khi phát hành nếu bạn dự định cung cấp Apple Pay.

Hỗ trợ trình duyệt

SDK Thanh toán Dodo 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+

Thanh toán Overlay so với Inline

Chọn loại thanh toán phù hợp cho 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ợpModal trên cùng trangHoàn toàn nhúng trong trang
Kiểm soát bố cụcHạn chếToàn quyền kiểm soát
Thương hiệuTách biệt với trangLiền mạch
Nỗ lực thực hiệnThấp hơnCao hơn
Tốt nhất choTích hợp nhanh, các trang hiện cóCác trang thanh toán tùy chỉnh, quy trình chuyển đổi cao
Sử dụng thanh toán overlay để tích hợp nhanh với ít thay đổi trên các trang hiện có. Sử dụng thanh toán inline 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

Để biết thêm trợ giúp, hãy truy cập vào cộng đồng Discord của chúng tôi hoặc liên hệ với đội ngũ hỗ trợ phát triển của chúng tôi.