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

Điều Kiện Tiên Quyết

Để tích hợp API Dodo Payments, bạn cần:
  • Một tài khoản thương nhân Dodo Payments
  • Thông tin xác thực API (khóa API và khóa bí mật webhook) từ bảng điều khiển
Để có hướng dẫn chi tiết hơn về các điều kiện tiên quyết, hãy kiểm tra phần này.

Tích Hợp API

Phiên Thanh Toán

Sử dụng Phiên Thanh Toán để bán các sản phẩm đăng ký với một quy trình thanh toán an toàn, được lưu trữ. Truyền sản phẩm đăng ký của bạn vào product_cart và chuyển hướng khách hàng đến checkout_url được trả về.
Bạn không thể trộn lẫn các sản phẩm đăng ký với các sản phẩm một lần trong cùng một phiên thanh toán.
import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function main() {
  const session = await client.checkoutSessions.create({
    product_cart: [
      { product_id: 'prod_subscription_monthly', quantity: 1 }
    ],
    // Optional: configure trials for subscription products
    subscription_data: { trial_period_days: 14 },
    customer: {
      email: '[email protected]',
      name: 'Jane Doe',
    },
    return_url: 'https://example.com/success',
  });

  console.log(session.checkout_url);
}

main();

Phản Hồi API

Dưới đây là một ví dụ về phản hồi:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
Chuyển hướng khách hàng đến checkout_url.

Webhooks

Khi tích hợp đăng ký, bạn sẽ nhận được webhooks để theo dõi vòng đời đăng ký. Những webhooks này giúp bạn quản lý trạng thái đăng ký và các kịch bản thanh toán một cách hiệu quả. Để thiết lập điểm cuối webhook của bạn, vui lòng làm theo Hướng Dẫn Tích Hợp Chi Tiết.

Các Loại Sự Kiện Đăng Ký

Các sự kiện webhook sau theo dõi sự thay đổi trạng thái đăng ký:
  1. subscription.active - Đăng ký đã được kích hoạt thành công.
  2. subscription.updated - Đối tượng đăng ký đã được cập nhật (xảy ra khi có bất kỳ thay đổi nào về trường).
  3. subscription.on_hold - Đăng ký bị tạm hoãn do gia hạn không thành công.
  4. subscription.failed - Tạo đăng ký không thành công trong quá trình tạo ủy quyền.
  5. subscription.renewed - Đăng ký được gia hạn cho kỳ thanh toán tiếp theo.
Để quản lý vòng đời đăng ký một cách đáng tin cậy, chúng tôi khuyên bạn nên theo dõi các sự kiện đăng ký này.
Sử dụng subscription.updated để nhận thông báo theo thời gian thực về bất kỳ thay đổi nào của đăng ký, giữ cho trạng thái ứng dụng của bạn đồng bộ mà không cần truy vấn API.

Các Kịch Bản Thanh Toán

Luồng Thanh Toán Thành Công Khi một khoản thanh toán thành công, bạn sẽ nhận được các webhook sau:
  1. subscription.active - Chỉ ra việc kích hoạt đăng ký
  2. payment.succeeded - Xác nhận khoản thanh toán ban đầu:
    • Đối với thanh toán ngay lập tức (0 ngày thử nghiệm): Mong đợi trong vòng 2-10 phút
    • Đối với các ngày thử nghiệm: bất cứ khi nào nó kết thúc
  3. subscription.renewed - Chỉ ra việc khấu trừ thanh toán và gia hạn cho chu kỳ tiếp theo. (Về cơ bản, bất cứ khi nào khoản thanh toán được khấu trừ cho các sản phẩm đăng ký, bạn sẽ nhận được webhook subscription.renewed cùng với payment.succeeded)
Kịch Bản Thanh Toán Thất Bại
  1. Thất bại Đăng Ký
  • subscription.failed - Tạo đăng ký không thành công do không thể tạo ủy quyền.
  • payment.failed - Chỉ ra thanh toán thất bại.
  1. Đăng Ký Bị Tạm Hoãn
  • subscription.on_hold - Đăng ký bị tạm hoãn do thanh toán gia hạn không thành công hoặc phí thay đổi kế hoạch không thành công.
  • Khi một đăng ký bị tạm hoãn, nó sẽ không tự động gia hạn cho đến khi phương thức thanh toán được cập nhật.
Thực Hành Tốt Nhất: Để đơn giản hóa việc triển khai, chúng tôi khuyên bạn nên theo dõi chủ yếu các sự kiện đăng ký để quản lý vòng đời đăng ký.

Xử Lý Đăng Ký Bị Tạm Hoãn

Khi một đăng ký vào trạng thái on_hold, bạn cần cập nhật phương thức thanh toán để kích hoạt lại nó. Phần này giải thích khi nào các đăng ký bị tạm hoãn và cách xử lý chúng.

Khi Nào Đăng Ký Bị Tạm Hoãn

Một đăng ký bị tạm hoãn khi:
  • Thanh toán gia hạn không thành công: Phí gia hạn tự động không thành công do không đủ tiền, thẻ hết hạn hoặc ngân hàng từ chối
  • Phí thay đổi kế hoạch không thành công: Một khoản phí ngay lập tức trong quá trình nâng cấp/hạ cấp kế hoạch không thành công
  • Ủy quyền phương thức thanh toán không thành công: Phương thức thanh toán không thể được ủy quyền cho các khoản phí định kỳ
Các đăng ký trong trạng thái on_hold sẽ không tự động gia hạn. Bạn phải cập nhật phương thức thanh toán để kích hoạt lại đăng ký.

Kích Hoạt Lại Đăng Ký Từ Trạng Thái Bị Tạm Hoãn

Để kích hoạt lại một đăng ký từ trạng thái on_hold, hãy sử dụng API Cập Nhật Phương Thức Thanh Toán. Điều này tự động:
  1. Tạo một khoản phí cho các khoản nợ còn lại
  2. Tạo một hóa đơn cho khoản phí
  3. Xử lý thanh toán bằng phương thức thanh toán mới
  4. Kích hoạt lại đăng ký về trạng thái active sau khi thanh toán thành công
1

Xử lý webhook subscription.on_hold

Khi bạn nhận được một webhook subscription.on_hold, hãy cập nhật trạng thái ứng dụng của bạn và thông báo cho khách hàng:
// Webhook handler
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;
  
  if (event.type === 'subscription.on_hold') {
    const subscription = event.data;
    
    // Update subscription status in your database
    await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
    
    // Notify customer to update payment method
    await sendEmailToCustomer(subscription.customer_id, {
      subject: 'Payment Required - Subscription On Hold',
      message: 'Your subscription is on hold. Please update your payment method to continue service.'
    });
  }
  
  res.json({ received: true });
});
2

Cập nhật phương thức thanh toán

Khi khách hàng sẵn sàng cập nhật phương thức thanh toán của họ, hãy gọi API Cập Nhật Phương Thức Thanh Toán:
// Update with new payment method
const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'new',
  return_url: 'https://example.com/return'
});

// For on_hold subscriptions, a charge is automatically created
if (response.payment_id) {
  console.log('Charge created for remaining dues:', response.payment_id);
  // Redirect customer to response.payment_link to complete payment
}
Bạn cũng có thể sử dụng ID phương thức thanh toán hiện có nếu khách hàng đã lưu các phương thức thanh toán:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Theo dõi các sự kiện webhook

Sau khi cập nhật phương thức thanh toán, hãy theo dõi các sự kiện webhook sau:
  1. payment.succeeded - Khoản phí cho các khoản nợ còn lại đã thành công
  2. subscription.active - Đăng ký đã được kích hoạt lại
if (event.type === 'payment.succeeded') {
  const payment = event.data;
  
  // Check if this payment is for an on_hold subscription
  if (payment.subscription_id) {
    // Wait for subscription.active webhook to confirm reactivation
  }
}

if (event.type === 'subscription.active') {
  const subscription = event.data;
  
  // Update subscription status in your database
  await updateSubscriptionStatus(subscription.subscription_id, 'active');
  
  // Restore customer access
  await restoreCustomerAccess(subscription.customer_id);
  
  // Notify customer of successful reactivation
  await sendEmailToCustomer(subscription.customer_id, {
    subject: 'Subscription Reactivated',
    message: 'Your subscription has been reactivated successfully.'
  });
}

Ví Dụ Về Payload Sự Kiện Đăng Ký


Thuộc TínhLoạiBắt BuộcMô Tả
business_idstringĐịnh danh duy nhất cho doanh nghiệp
timestampstringDấu thời gian khi sự kiện xảy ra (không nhất thiết phải giống như khi nó được gửi đi)
typestringLoại sự kiện. Xem Các Loại Sự Kiện
dataobjectPayload dữ liệu chính. Xem Đối Tượng Dữ Liệu

Thay Đổi Kế Hoạch Đăng Ký

Bạn có thể nâng cấp hoặc hạ cấp một kế hoạch đăng ký bằng cách sử dụng điểm cuối API thay đổi kế hoạch. Điều này cho phép bạn sửa đổi sản phẩm, số lượng của đăng ký và xử lý việc phân bổ.

Tài Liệu Tham Khảo API Thay Đổi Kế Hoạch

Để biết thông tin chi tiết về việc thay đổi kế hoạch đăng ký, vui lòng tham khảo tài liệu API Thay Đổi Kế Hoạch của chúng tôi.

Tùy Chọn Phân Bổ

Khi thay đổi kế hoạch đăng ký, bạn có hai tùy chọn để xử lý khoản phí ngay lập tức:

1. prorated_immediately

  • Tính toán số tiền phân bổ dựa trên thời gian còn lại trong chu kỳ thanh toán hiện tại
  • Tính phí cho khách hàng chỉ cho sự khác biệt giữa kế hoạch cũ và mới
  • Trong thời gian thử nghiệm, điều này sẽ ngay lập tức chuyển người dùng sang kế hoạch mới, tính phí cho khách hàng ngay lập tức

2. full_immediately

  • Tính phí cho khách hàng toàn bộ số tiền đăng ký cho kế hoạch mới
  • Bỏ qua bất kỳ thời gian còn lại hoặc tín dụng nào từ kế hoạch trước
  • Hữu ích khi bạn muốn đặt lại chu kỳ thanh toán hoặc tính phí toàn bộ số tiền bất kể phân bổ

3. difference_immediately

  • Khi nâng cấp, khách hàng sẽ ngay lập tức bị tính phí sự khác biệt giữa hai số tiền kế hoạch.
  • Ví dụ, nếu kế hoạch hiện tại là 30 đô la và khách hàng nâng cấp lên 80 đô la, họ sẽ bị tính phí 50 đô la ngay lập tức.
  • Khi hạ cấp, số tiền chưa sử dụng từ kế hoạch hiện tại sẽ được thêm vào tín dụng nội bộ và tự động áp dụng cho các lần gia hạn đăng ký trong tương lai.
  • Ví dụ, nếu kế hoạch hiện tại là 50 đô la và khách hàng chuyển sang kế hoạch 20 đô la, số tiền còn lại 30 đô la sẽ được tín dụng và sử dụng cho chu kỳ thanh toán tiếp theo.

Hành Vi

  • Khi bạn gọi API này, Dodo Payments sẽ ngay lập tức khởi động một khoản phí dựa trên tùy chọn phân bổ mà bạn đã chọn
  • Nếu việc thay đổi kế hoạch là một sự hạ cấp và bạn sử dụng prorated_immediately, các tín dụng sẽ được tự động tính toán và thêm vào số dư tín dụng của đăng ký. Những tín dụng này là cụ thể cho đăng ký đó và sẽ chỉ được sử dụng để bù đắp cho các khoản thanh toán định kỳ trong tương lai của cùng một đăng ký
  • Tùy chọn full_immediately sẽ bỏ qua việc tính toán tín dụng và tính phí toàn bộ số tiền cho kế hoạch mới
Chọn tùy chọn phân bổ của bạn một cách cẩn thận: Sử dụng prorated_immediately để tính phí công bằng mà tính đến thời gian chưa sử dụng, hoặc full_immediately khi bạn muốn tính phí toàn bộ số tiền cho kế hoạch mới bất kể chu kỳ thanh toán hiện tại.

Xử Lý Khoản Phí

  • Khoản phí ngay lập tức được khởi động khi thay đổi kế hoạch thường hoàn tất xử lý trong chưa đầy 2 phút
  • Nếu khoản phí ngay lập tức này không thành công vì bất kỳ lý do gì, đăng ký sẽ tự động bị tạm hoãn cho đến khi vấn đề được giải quyết

Đăng Ký Theo Yêu Cầu

Đăng ký theo yêu cầu cho phép bạn tính phí cho khách hàng một cách linh hoạt, không chỉ theo một lịch trình cố định. Liên hệ với bộ phận hỗ trợ để kích hoạt tính năng này.
Để tạo một đăng ký theo yêu cầu: Để tạo một đăng ký theo yêu cầu, hãy sử dụng điểm cuối API POST /subscriptions và bao gồm trường on_demand trong thân yêu cầu của bạn. Điều này cho phép bạn ủy quyền một phương thức thanh toán mà không cần tính phí ngay lập tức, hoặc đặt một mức giá khởi đầu tùy chỉnh. Để tính phí cho một đăng ký theo yêu cầu: Đối với các khoản phí tiếp theo, hãy sử dụng điểm cuối POST /subscriptions/charge và chỉ định số tiền để tính phí cho khách hàng cho giao dịch đó.
Để có hướng dẫn đầy đủ, từng bước—bao gồm ví dụ về yêu cầu/phản hồi, chính sách thử lại an toàn và xử lý webhook—hãy xem Hướng Dẫn Đăng Ký Theo Yêu Cầu.