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 sản phẩm đăng ký qua một trang thanh toán được lưu trữ an toàn. 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ề.
Thanh toán hỗn hợp: Bạn có thể kết hợp sản phẩm đăng ký với sản phẩm thanh toán một lần trong cùng một phiên thanh toán. Điều này cho phép các trường hợp sử dụng như phí cài đặt với đăng ký, gói phần cứng cùng SaaS, và hơn thế nữa. Xem Hướng dẫn Phiên Thanh toán để biết ví dụ.
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: 'subscriber@example.com',
      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 (kích hoạt khi bất kỳ trường nào thay đổi).
  3. subscription.on_hold - Đăng ký bị tạm giữ do gia hạn thất bại.
  4. subscription.failed - Tạo đăng ký thất bại trong quá trình tạo ủy nhiệm.
  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 thời gian thực về bất kỳ thay đổi nào của đăng ký, giúp đồng bộ trạng thái ứng dụng mà không cần truy vấn lại 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 - Cho biết đăng ký đã được kích hoạt
  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 dùng thử): Dự kiến trong vòng 2-10 phút
    • Đối với ngày dùng thử: ngay khi kết thúc
  3. subscription.renewed - Cho biết khoản thanh toán được trừ 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 cho sản phẩm đăng ký được trừ, 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ý thất bại do không thể tạo ủy nhiệm.
  • payment.failed - Cho biết thanh toán thất bại.
  1. Đăng ký bị tạm giữ
  • subscription.on_hold - Đăng ký bị tạm giữ do thanh toán gia hạn thất bại hoặc phí thay đổi gói thất bại.
  • Khi đăng ký bị tạm giữ, nó sẽ không tự động gia hạn cho đến khi cập nhật phương thức thanh toán.
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ý chuyển sang 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. Phần này giải thích khi nào đăng ký bị tạm giữ và cách xử lý.

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ỳ
Đăng ký ở 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 đă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 sẽ tự động:
  1. Tạo một khoản phí cho số tiền còn nợ
  2. Tạo 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 khi thanh toán thành công
1

Handle subscription.on_hold webhook

Khi bạn nhận được 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

Update payment method

Khi khách hàng sẵn sàng cập nhật phương thức thanh toán, 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 phương thức thanh toán:
await client.subscriptions.updatePaymentMethod(subscriptionId, {
  type: 'existing',
  payment_method_id: 'pm_abc123'
});
3

Monitor webhook events

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 số tiền còn nợ đã 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ý


PropertyTypeRequiredDescription
business_idstringYesThe unique identifier for the business
timestampstringYesThe timestamp of when the event occurred (not necessarily the same as when it was delivered)
typestringYesThe type of event. See Event Types
dataobjectYesThe main data payload. See Data Object

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

Change Plan API Reference

Để biết thông tin chi tiết về cách thay đổi gói đăng ký, vui lòng tham khảo tài liệu API Thay Đổi Gói 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 được điều chỉnh theo tỷ lệ dựa trên thời gian còn lại trong chu kỳ thanh toán hiện tại
  • Chỉ tính phí khách hàng khoản chênh lệch giữa gói cũ và mới
  • Trong thời gian dùng thử, điều này sẽ chuyển người dùng sang gói mới ngay lập tức và tính phí 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ý của gói mới
  • Bỏ qua mọi thời gian còn lại hoặc tín dụng từ gói trước đó
  • Hữu ích khi bạn muốn thiết lập lại chu kỳ thanh toán hoặc tính toàn bộ số tiền bất kể điều chỉnh theo tỷ lệ

3. difference_immediately

  • Khi nâng cấp, khách hàng được tính ngay khoản chênh lệch giữa hai gói.
  • Ví dụ, nếu gói hiện tại là 30 Dollars và khách hàng nâng cấp lên gói 80 Dollars, họ sẽ bị tính $50 ngay lập tức.
  • Khi hạ cấp, số tiền chưa sử dụng từ gói hiện tại đượ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ý sau.
  • Ví dụ, nếu gói hiện tại là 50 Dollars và khách hàng chuyển sang gói 20 Dollars, $30 còn lại sẽ được ghi có 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 lập tức bắt đầu một khoản phí dựa trên tùy chọn điều chỉnh tỷ lệ mà bạn đã chọn
  • Nếu việc thay đổi gói là hạ cấp và bạn sử dụng prorated_immediately, các khoản tín dụng sẽ được 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 dành riêng cho đăng ký đó và chỉ được dùng để bù đắp 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 bỏ qua việc tính toán tín dụng và tính toàn bộ số tiền của gói mới
Chọn tùy chọn điều chỉnh tỷ lệ một cách cẩn thận: Sử dụng prorated_immediately để có hóa đơn công bằng tính đến thời gian chưa sử dụng, hoặc full_immediately khi bạn muốn tính toàn bộ số tiền gói 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 nhu cầu cho phép bạn tính phí linh hoạt cho khách hàng, không chỉ theo lịch trình cố định. Tính năng này có sẵn cho tất cả các tài khoản.
Để tạo một đăng ký theo yêu cầu: Để tạo đăng ký theo nhu cầu, hãy sử dụng điểm cuối API POST /subscriptions và bao gồm trường on_demand trong phần thân yêu cầu. Điều này cho phép bạn ủy quyền một phương thức thanh toán mà không tính phí ngay lập tức, hoặc đặt mức giá khởi tạo 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ụ 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 Nhu Cầu.