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

Tổng Quan

Thanh toán inline cho phép bạn tạo ra những trải nghiệm thanh toán hoàn toàn tích hợp, hòa quyện một cách liền mạch với trang web hoặc ứng dụng của bạn. Khác với thanh toán overlay, mở dưới dạng modal trên trang của bạn, thanh toán inline nhúng biểu mẫu thanh toán trực tiếp vào bố cục trang của bạn. Sử dụng thanh toán inline, bạn có thể:
  • Tạo ra những trải nghiệm thanh toán hoàn toàn tích hợp với ứng dụng hoặc trang web của bạn
  • Để Dodo Payments an toàn thu thập thông tin khách hàng và thông tin thanh toán trong một khung thanh toán tối ưu
  • Hiển thị các mặt hàng, tổng số và thông tin khác từ Dodo Payments trên trang của bạn
  • Sử dụng các phương thức và sự kiện SDK để xây dựng những trải nghiệm thanh toán nâng cao
Hình Ảnh Bìa Thanh Toán Inline

Cách Hoạt Động

Thanh toán inline hoạt động bằng cách nhúng một khung Dodo Payments an toàn vào trang web hoặc ứng dụng của bạn. Khung thanh toán xử lý việc thu thập thông tin khách hàng và ghi lại chi tiết thanh toán. Trang của bạn hiển thị danh sách mặt hàng, tổng số và tùy chọn để thay đổi những gì có trên thanh toán. SDK cho phép trang của bạn và khung thanh toán tương tác với nhau. Dodo Payments tự động tạo một đăng ký khi một thanh toán hoàn tất, sẵn sàng để bạn cung cấp.
Khung thanh toán inline xử lý an toàn tất cả thông tin thanh toán nhạy cảm, đảm bảo tuân thủ PCI mà không cần chứng nhận bổ sung từ phía bạn.

Điều Gì Tạo Nên Một Thanh Toán Inline Tốt?

Điều quan trọng là khách hàng biết họ đang mua từ ai, họ đang mua gì và họ phải trả bao nhiêu. Để xây dựng một thanh toán inline tuân thủ và tối ưu hóa cho chuyển đổi, việc triển khai của bạn phải bao gồm:
Ví dụ thanh toán inline với các yếu tố cần thiết được gán nhãn

Ví dụ về bố cục thanh toán inline hiển thị các yếu tố cần thiết

  1. Thông tin định kỳ: Nếu là định kỳ, tần suất và tổng số phải trả khi gia hạn. Nếu là dùng thử, thời gian dùng thử kéo dài bao lâu.
  2. Mô tả mặt hàng: Một mô tả về những gì đang được mua.
  3. Tổng giao dịch: Tổng giao dịch, bao gồm tổng phụ, thuế tổng và tổng cộng. Đảm bảo bao gồm cả loại tiền tệ.
  4. Chân trang Dodo Payments: Toàn bộ khung thanh toán inline, bao gồm chân trang thanh toán có thông tin về Dodo Payments, điều khoản bán hàng của chúng tôi và chính sách bảo mật của chúng tôi.
  5. Chính sách hoàn tiền: Một liên kết đến chính sách hoàn tiền của bạn, nếu nó khác với chính sách hoàn tiền tiêu chuẩn của Dodo Payments.
Luôn hiển thị toàn bộ khung thanh toán inline, bao gồm chân trang. Việc loại bỏ hoặc ẩn thông tin pháp lý vi phạm yêu cầu tuân thủ.

Hành Trình Khách Hàng

Luồng thanh toán được xác định bởi cấu hình phiên thanh toán của bạn. Tùy thuộc vào cách bạn cấu hình phiên thanh toán, khách hàng sẽ trải nghiệm một thanh toán có thể trình bày tất cả thông tin trên một trang duy nhất hoặc qua nhiều bước.
1

Khách hàng mở thanh toán

Bạn có thể mở thanh toán inline bằng cách truyền các mặt hàng hoặc một giao dịch hiện có. Sử dụng SDK để hiển thị và cập nhật thông tin trên trang, và các phương thức SDK để cập nhật các mặt hàng dựa trên tương tác của khách hàng.Trang thanh toán ban đầu với danh sách mặt hàng và biểu mẫu thanh toán
2

Khách hàng nhập thông tin của họ

Thanh toán inline trước tiên yêu cầu khách hàng nhập địa chỉ email của họ, chọn quốc gia của họ và (nếu cần) nhập mã ZIP hoặc mã bưu chính của họ. Bước này thu thập tất cả thông tin cần thiết để xác định thuế và các tùy chọn thanh toán có sẵn.Bạn có thể tự động điền thông tin khách hàng và trình bày các địa chỉ đã lưu để đơn giản hóa trải nghiệm.
3

Khách hàng chọn phương thức thanh toán

Sau khi nhập thông tin của họ, khách hàng sẽ được trình bày các phương thức thanh toán có sẵn và biểu mẫu thanh toán. Các tùy chọn có thể bao gồm thẻ tín dụng hoặc thẻ ghi nợ, PayPal, Apple Pay, Google Pay và các phương thức thanh toán địa phương khác dựa trên vị trí của họ.Hiển thị các phương thức thanh toán đã lưu nếu có để tăng tốc độ thanh toán.Các phương thức thanh toán có sẵn và biểu mẫu chi tiết thẻ
4

Thanh toán hoàn tất

Dodo Payments định tuyến mọi thanh toán đến nhà cung cấp tốt nhất cho giao dịch đó để có cơ hội thành công tốt nhất. Khách hàng sẽ vào một quy trình thành công mà bạn có thể xây dựng.Màn hình thành công với dấu kiểm xác nhận
5

Dodo Payments tạo đăng ký

Dodo Payments tự động tạo một đăng ký cho khách hàng, sẵn sàng để bạn cung cấp. Phương thức thanh toán mà khách hàng đã sử dụng sẽ được lưu giữ để gia hạn hoặc thay đổi đăng ký.Đăng ký đã được tạo với thông báo webhook

Bắt đầu nhanh

Bắt đầu với Dodo Payments Inline Checkout chỉ với vài dòng mã:
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
});
Đảm bảo bạn có một phần tử chứa với id tương ứng trên trang của bạn: <div id="dodo-inline-checkout"></div>.

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

1

Cài đặt SDK

Cài đặt Dodo Payments Checkout SDK:
npm install dodopayments-checkout
2

Khởi tạo SDK cho Hiển thị Inline

Khởi tạo SDK và chỉ định displayType: 'inline'. Bạn cũng nên lắng nghe sự kiện checkout.breakdown để cập nhật UI của bạn với các tính toán thuế và tổng thời gian thực.
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

Tạo một phần tử chứa

Thêm một phần tử vào HTML của bạn nơi khung thanh toán sẽ được chèn vào:
<div id="dodo-inline-checkout"></div>
4

Mở thanh toán

Gọi DodoPayments.Checkout.open() với checkoutUrlelementId của phần tử chứa của bạn:
DodoPayments.Checkout.open({
  checkoutUrl: "https://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout"
});
5

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

  1. Khởi động 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 email và địa chỉ của bạn trong khung inline.
    • Xác minh rằng tóm tắt đơn hàng tùy chỉnh của bạn cập nhật theo thời gian thực.
    • 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 rằng các chuyển hướng hoạt động chính xác.
Bạn nên thấy các sự kiện checkout.breakdown được ghi lại trong bảng điều khiển trình duyệt của bạn nếu bạn đã thêm một bản ghi console trong callback onEvent.
6

Đ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: "inline",
  onEvent: (event) => {
    // Handle events
  }
});
  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.

Ví dụ hoàn chỉnh về React

Ví dụ này minh họa cách thực hiện một tóm tắt đơn hàng tùy chỉnh cùng với thanh toán inline, giữ cho chúng đồng bộ bằng cách sử dụng sự kiện 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>
  );
}

Tài liệu API

Cấu hình

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

interface InitializeOptions {
  mode: "test" | "live";
  displayType: "inline"; // Required for inline checkout
  onEvent: (event: CheckoutEvent) => void;
}
Tùy chọnLoạiBắt buộcMô tả
mode"test" | "live"Chế độ môi trường.
displayType"inline" | "overlay"Phải được đặt thành "inline" để nhúng thanh toán.
onEventfunctionHàm callback để xử lý các sự kiện thanh toán.

Tùy chọn thanh toán

interface CheckoutOptions {
  checkoutUrl: string;
  elementId: string; // Required for inline checkout
  options?: {
    showTimer?: boolean;
    showSecurityBadge?: boolean;
    manualRedirect?: boolean;
    payButtonText?: string;
  };
}
Tùy chọnLoạiBắt buộcMô tả
checkoutUrlstringURL phiên thanh toán.
elementIdstringid của phần tử DOM nơi phiên thanh toán sẽ được hiển thị.
options.showTimerbooleanKhôngHiện 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 hoặc ẩn huy hiệu bảo mật. Mặc định là true.
options.manualRedirectbooleanKhôngKhi được kích hoạt, phiên 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.
options.payButtonTextstringKhôngVăn bản tùy chỉnh để hiển thị trên nút thanh toán.

Phương thức

Mở thanh toán

Mở khung thanh toán trong phần tử được chỉ định.
DodoPayments.Checkout.open({
  checkoutUrl: "https://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout"
});
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://test.dodopayments.com/session/cks_123",
  elementId: "dodo-inline-checkout",
  options: {
    showTimer: false,
    showSecurityBadge: false,
    manualRedirect: true,
    payButtonText: "Pay Now",
  },
});
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: "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
    }
  },
});

Đóng Thanh Toán

Loại bỏ khung thanh toán theo cách lập trình và dọn dẹp các trình lắng nghe sự kiện.
DodoPayments.Checkout.close();

Kiểm Tra Trạng Thái

Trả về liệu khung thanh toán hiện đang được chèn hay không.
const isOpen = DodoPayments.Checkout.isOpen();
// Returns: boolean

Sự Kiện

SDK cung cấp các sự kiện thời gian thực thông qua callback onEvent. Đối với thanh toán inline, checkout.breakdown đặc biệt hữu ích để đồng bộ hóa UI của bạn.
Loại Sự KiệnMô Tả
checkout.openedKhung thanh toán đã được tải.
checkout.breakdownBị kích hoạt khi giá, thuế hoặc giảm giá được cập nhật.
checkout.customer_details_submittedThông tin khách hàng đã được gửi.
checkout.redirectThanh toán sẽ thực hiện một chuyển hướng (ví dụ: đến trang ngân hàng).
checkout.errorĐã xảy ra lỗi trong quá trình thanh toán.
checkout.link_expiredBị 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.statusBị 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_requestedBị kích hoạt khi manualRedirect được kích hoạt. Chứa URL để chuyển hướng khách hàng đến.

Dữ Liệu Phân Tích Thanh Toán

Sự kiện checkout.breakdown cung cấp các dữ liệu sau:
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
}

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

Khi manualRedirect được kích hoạt, bạn nhận được sự kiện checkout.status với các 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 nhận được sự kiện checkout.redirect_requested với các dữ liệu sau:
interface CheckoutRedirectRequestedEventData {
  message: {
    redirect_to?: string;
  };
}

Hiểu Sự Kiện Phân Tích

Sự kiện checkout.breakdown là cách chính để giữ cho UI của ứng dụng bạn đồng bộ với trạng thái thanh toán của Dodo Payments. Khi nó xảy ra:
  • Khi khởi tạo: Ngay sau khi khung thanh toán được tải và sẵn sàng.
  • Khi thay đổi địa chỉ: Bất cứ khi nào khách hàng chọn một quốc gia hoặc nhập mã bưu chính dẫn đến việc tính toán thuế lại.
Chi tiết trường:
TrườngMô Tả
subTotalTổng số tiền của tất cả các mục trong phiên trước khi bất kỳ giảm giá hoặc thuế nào được áp dụng.
discountTổng giá trị của tất cả các giảm giá đã áp dụng.
taxSố tiền thuế đã tính. Trong chế độ inline, điều này được cập nhật động khi người dùng tương tác với các trường địa chỉ.
totalKết quả toán học của subTotal - discount + tax trong đơn vị tiền tệ cơ bản của phiên.
currencyMã tiền tệ ISO (ví dụ: "USD") cho các giá trị tổng phụ, giảm giá và thuế tiêu chuẩn.
finalTotalSố tiền thực tế mà khách hàng phải trả. Điều này có thể bao gồm các điều chỉnh tỷ giá hối đoái bổ sung hoặc phí phương thức thanh toán địa phương không nằm trong phân tích giá cơ bản.
finalTotalCurrencyTiền tệ mà khách hàng thực sự thanh toán. Điều này có thể khác với currency nếu sức mua tương đương hoặc chuyển đổi tiền tệ địa phương đang hoạt động.
Mẹo tích hợp chính:
  1. Định dạng tiền tệ: Giá luôn được trả về dưới dạng số nguyên trong đơn vị tiền tệ nhỏ nhất (ví dụ: xu cho USD, yên cho JPY). Để hiển thị chúng, chia cho 100 (hoặc lũy thừa thích hợp của 10) hoặc sử dụng thư viện định dạng như Intl.NumberFormat.
  2. Xử lý trạng thái ban đầu: Khi thanh toán lần đầu được tải, taxdiscount có thể là 0 hoặc null cho đến khi người dùng cung cấp thông tin thanh toán của họ hoặc áp dụng mã. UI của bạn nên xử lý các trạng thái này một cách hợp lý (ví dụ: hiển thị dấu gạch ngang hoặc ẩn hàng).
  3. “Tổng cuối” so với “Tổng”: Trong khi total cung cấp cho bạn phép tính giá tiêu chuẩn, finalTotal là nguồn thông tin chính xác cho giao dịch. Nếu finalTotal có mặt, nó phản ánh chính xác những gì sẽ được tính phí vào thẻ của khách hàng, bao gồm bất kỳ điều chỉnh động nào.
  4. Phản hồi thời gian thực: Sử dụng trường tax để cho người dùng thấy rằng thuế đang được tính toán theo thời gian thực. Điều này mang lại cảm giác “trực tiếp” cho trang thanh toán của bạn và giảm ma sát trong bước nhập địa chỉ.

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 hiển thị 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 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>

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 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.

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
        inputFocusBorder: "#D0D5DD", // Input focus 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",
        inputFocusBorder: "#323232",
        
        // 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 callback onEvent của bạn:
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
    }
  }
});
Luôn xử lý sự kiện checkout.error để cung cấp trải nghiệm người dùng tốt khi có sự cố xảy ra.

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

  1. Thiết kế Phản hồi: Đảm bảo phần tử chứa của bạn có đủ chiều rộng và chiều cao. iframe sẽ thường mở rộng để lấp đầy phần tử chứa của nó.
  2. Đồng bộ hóa: Sử dụng sự kiện checkout.breakdown để giữ cho tóm tắt đơn hàng hoặc bảng giá tùy chỉnh của bạn đồng bộ với những gì người dùng thấy trong khung thanh toán.
  3. Trạng thái Skeleton: Hiển thị chỉ báo tải trong phần tử chứa của bạn cho đến khi sự kiện checkout.opened được kích hoạt.
  4. Dọn dẹp: Gọi DodoPayments.Checkout.close() khi thành phần của bạn bị gỡ bỏ để dọn dẹp iframe và các trình lắng nghe sự kiện.
Đối với các triển khai chế độ tối, nên sử dụng #0d0d0d làm màu nền để tích hợp hình ảnh tốt nhất với khung thanh toán inline.

Khắc phục sự cố

  • Xác minh rằng elementId khớp với id của một div thực sự tồn tại trong DOM.
  • Đảm bảo displayType: 'inline' đã được truyền vào Initialize.
  • Kiểm tra rằng checkoutUrl là hợp lệ.
  • Đảm bảo bạn đang lắng nghe sự kiện checkout.breakdown.
  • Thuế chỉ được tính toán sau khi người dùng nhập một quốc gia và mã bưu chính hợp lệ trong khung thanh toán.

Kích hoạt Apple Pay

Apple Pay cho phép khách hàng hoàn tất thanh toán nhanh chóng và an toàn bằng cách sử dụng các phương thức thanh toán đã lưu của họ. Khi được kích hoạt, khách hàng có thể khởi động modal Apple Pay trực tiếp từ overlay thanh toán trên các thiết bị hỗ trợ.
Apple Pay được hỗ trợ trên iOS 17+, iPadOS 17+, và Safari 17+ trên macOS.
Để kích hoạt Apple Pay cho miền của bạn trong môi trường sản xuất, hãy làm theo các bước sau:
1

Tải xuống và tải lên tệp liên kết miền Apple Pay

Tải xuống tệp liên kết miền Apple Pay.Tải tệp lên máy chủ web của bạn tại /.well-known/apple-developer-merchantid-domain-association. Ví dụ, nếu trang web của bạn là example.com, hãy làm cho tệp có sẵn tại https://example.com/well-known/apple-developer-merchantid-domain-association.
2

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

Gửi email đến [email protected] với thông tin sau:
  • URL miền sản xuất của bạn (ví dụ: https://example.com)
  • Yêu cầu kích hoạt Apple Pay cho miền của bạn
Bạn sẽ nhận được xác nhận trong vòng 1-2 ngày làm việc sau khi Apple Pay đã được kích hoạt cho miền của bạn.
3

Xác minh tính khả dụng của Apple Pay

Sau khi nhận được xác nhận, hãy kiểm tra Apple Pay trong thanh toán của bạn:
  1. Mở thanh toán của bạn trên một thiết bị hỗ trợ (iOS 17+, iPadOS 17+, hoặc Safari 17+ trên macOS)
  2. Xác minh rằng nút Apple Pay xuất hiện như một tùy chọn thanh toán
  3. Kiểm tra toàn bộ quy trình thanh toán
Apple Pay phải được kích hoạt cho miền của bạn trước khi nó xuất hiện như một tùy chọn thanh toán trong môi trường sản xuất. Liên hệ với hỗ trợ trước khi ra mắt 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 Inline vs Overlay

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 InlineThanh toán Overlay
Độ sâu tích hợpHoàn toàn nhúng trong trangModal trên trang
Kiểm soát bố cụcKiểm soát đầy đủHạn chế
Thương hiệuLiền mạchTách biệt khỏi trang
Nỗ lực thực hiệnCao hơnThấp hơn
Tốt nhất choCác trang thanh toán tùy chỉnh, quy trình chuyển đổi caoTích hợp nhanh, 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. Sử dụng thanh toán overlay cho tích hợp nhanh với thay đổi tối thiểu cho các trang hiện có của bạn.

Tài nguyên Liên quan

Để biết thêm trợ giúp, 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ợ phát triển của chúng tôi.