Chuyển đến nội dung chính
SDK C# cung cấp quyền truy cập thuận tiện vào REST API của Dodo Payments từ các ứng dụng viết bằng C#. Nó có API dựa trên Task bất đồng bộ với kiểu dữ liệu mạnh.

Cài đặt

Cài đặt SDK bằng .NET CLI:
dotnet add package DodoPayments.Client
SDK yêu cầu .NET Standard 2.0 trở lên. Nó hoạt động với ASP.NET Core, ứng dụng Console và các loại dự án .NET khác.

Bắt đầu nhanh

Khởi tạo client và tạo phiên thanh toán:
using System;
using DodoPayments.Client;
using DodoPayments.Client.Models.CheckoutSessions;

// Configured using the DODO_PAYMENTS_API_KEY and DODO_PAYMENTS_BASE_URL environment variables
DodoPaymentsClient client = new();

CheckoutSessionCreateParams parameters = new()
{
    ProductCart =
    [
        new()
        {
            ProductID = "product_id",
            Quantity = 1,
        },
    ],
};

var checkoutSessionResponse = await client.CheckoutSessions.Create(parameters);

Console.WriteLine(checkoutSessionResponse.SessionId);
Luôn lưu trữ khóa API của bạn một cách an toàn bằng biến môi trường, user secrets hoặc Azure Key Vault. Không bao giờ viết cứng chúng vào mã nguồn hoặc cam kết chúng lên hệ thống điều khiển phiên bản.

Tính năng chính

Async/Await

API bất đồng bộ dựa trên Task đầy đủ cho các thao tác không chặn

Strong Typing

Đảm bảo kiểu dữ liệu toàn diện với nullable reference types

Dependency Injection

Hỗ trợ hàng đầu cho dependency injection của .NET

Configuration

Cấu hình đơn giản thông qua biến môi trường hoặc appsettings.json

Cấu hình

Biến môi trường

Cấu hình bằng biến môi trường:
.env
DODO_PAYMENTS_API_KEY=your_api_key_here
// Automatically reads from environment variables
DodoPaymentsClient client = new();
Xem bảng này để biết các tùy chọn có sẵn:
Thuộc tínhBiến môi trườngBắt buộcGiá trị mặc định
BearerTokenDODO_PAYMENTS_API_KEYtrue-
WebhookKeyDODO_PAYMENTS_WEBHOOK_KEYfalse-
BaseUrlDODO_PAYMENTS_BASE_URLtrue"https://live.dodopayments.com"

Cấu hình thủ công

Cấu hình thủ công với bearer token:
DodoPaymentsClient client = new() { BearerToken = "My Bearer Token" };

Hoạt động phổ biến

Tạo phiên thanh toán

Tạo một phiên thanh toán:
var parameters = new CheckoutSessionCreateParams
{
    ProductCart =
    [
        new()
        {
            ProductID = "prod_123",
            Quantity = 1
        }
    ],
    ReturnUrl = "https://yourdomain.com/return"
};

var session = await client.CheckoutSessions.Create(parameters);
Console.WriteLine($"Checkout URL: {session.Url}");

Quản lý khách hàng

Tạo và lấy thông tin khách hàng:
// Create a customer
var createParams = new CustomerCreateParams
{
    Email = "customer@example.com",
    Name = "John Doe",
    Metadata = new Dictionary<string, string>
    {
        { "user_id", "12345" }
    }
};

var customer = await client.Customers.Create(createParams);

// Retrieve customer
var retrieved = await client.Customers.Retrieve("cus_123");
Console.WriteLine($"Customer: {retrieved.Name} ({retrieved.Email})");

Xử lý đăng ký

Tạo và quản lý các đăng ký định kỳ:
// Create a subscription
var subscriptionParams = new SubscriptionCreateParams
{
    CustomerID = "cus_123",
    ProductID = "prod_456",
    PriceID = "price_789"
};

var subscription = await client.Subscriptions.Create(subscriptionParams);

// Cancel subscription
await client.Subscriptions.Cancel(subscription.Id);

Phân trang

SDK định nghĩa các phương thức trả về danh sách phân trang với cách thuận tiện để truy cập kết quả theo từng trang hoặc từng mục trên tất cả các trang.

Phân trang tự động

Để lặp qua tất cả kết quả trên mọi trang, hãy sử dụng phương thức Paginate:
using System;

var page = await client.Payments.List(parameters);
await foreach (var item in page.Paginate())
{
    Console.WriteLine(item);
}

Phân trang thủ công

Để truy cập từng mục trên trang và yêu cầu trang tiếp theo theo cách thủ công:
using System;

var page = await client.Payments.List();
while (true)
{
    foreach (var item in page.Items)
    {
        Console.WriteLine(item);
    }
    if (!page.HasNext())
    {
        break;
    }
    page = await page.Next();
}

Tích hợp ASP.NET Core

Đăng ký dịch vụ

Đăng ký client trong Program.cs:
Program.cs
using DodoPayments.Client;

var builder = WebApplication.CreateBuilder(args);

// Register DodoPayments client
builder.Services.AddSingleton<DodoPaymentsClient>(sp =>
{
    var configuration = sp.GetRequiredService<IConfiguration>();
    return new DodoPaymentsClient
    {
        BearerToken = configuration["DodoPayments:ApiKey"]
    };
});

builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.Run();

Cấu hình

Thêm cấu hình trong appsettings.json:
appsettings.json
{
  "DodoPayments": {
    "ApiKey": "your_api_key_here"
  }
}

Bộ điều khiển API

Tạo bộ điều khiển sử dụng dependency injection:
using Microsoft.AspNetCore.Mvc;
using DodoPayments.Client;
using DodoPayments.Client.Models.CheckoutSessions;

[ApiController]
[Route("api/[controller]")]
public class PaymentsController : ControllerBase
{
    private readonly DodoPaymentsClient _client;
    private readonly ILogger<PaymentsController> _logger;

    public PaymentsController(DodoPaymentsClient client, ILogger<PaymentsController> logger)
    {
        _client = client;
        _logger = logger;
    }

    [HttpPost("checkout")]
    public async Task<IActionResult> CreateCheckout([FromBody] CheckoutRequest request)
    {
        try
        {
            var parameters = new CheckoutSessionCreateParams
            {
                ProductCart = request.Items,
                ReturnUrl = Url.Action("Return", "Checkout", null, Request.Scheme)
            };

            var session = await _client.CheckoutSessions.Create(parameters);

            return Ok(new { checkoutUrl = session.Url });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to create checkout");
            return BadRequest(new { error = ex.Message });
        }
    }
}

public record CheckoutRequest(List<ProductCartItem> Items);

Mô hình lớp dịch vụ

Tạo một dịch vụ cho logic nghiệp vụ:
public interface IPaymentService
{
    Task<CheckoutSessionResponse> CreateCheckoutAsync(List<ProductCartItem> items);
    Task<PaymentResponse> ProcessPaymentAsync(decimal amount, string currency, string customerId);
}

public class PaymentService : IPaymentService
{
    private readonly DodoPaymentsClient _client;
    private readonly ILogger<PaymentService> _logger;

    public PaymentService(DodoPaymentsClient client, ILogger<PaymentService> logger)
    {
        _client = client;
        _logger = logger;
    }

    public async Task<CheckoutSessionResponse> CreateCheckoutAsync(List<ProductCartItem> items)
    {
        var parameters = new CheckoutSessionCreateParams
        {
            ProductCart = items,
            ReturnUrl = "https://yourdomain.com/return"
        };

        return await _client.CheckoutSessions.Create(parameters);
    }

    public async Task<PaymentResponse> ProcessPaymentAsync(
        decimal amount,
        string currency,
        string customerId)
    {
        try
        {
            var parameters = new PaymentCreateParams
            {
                Amount = (long)(amount * 100), // Convert to cents
                Currency = currency,
                CustomerID = customerId
            };

            return await _client.Payments.Create(parameters);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed to process payment");
            throw;
        }
    }
}

Bí mật người dùng (phát triển)

Đối với phát triển, sử dụng user secrets để lưu trữ khóa API:
dotnet user-secrets init
dotnet user-secrets set "DodoPayments:ApiKey" "your_api_key_here"

Kiểm thử

Ví dụ kiểm thử đơn vị sử dụng xUnit:
using Xunit;
using DodoPayments.Client;
using DodoPayments.Client.Models.CheckoutSessions;

public class PaymentServiceTests
{
    private readonly DodoPaymentsClient _client;

    public PaymentServiceTests()
    {
        _client = new DodoPaymentsClient
        {
            BearerToken = "test_key"
        };
    }

    [Fact]
    public async Task CreateCheckout_ShouldReturnSession()
    {
        // Arrange
        var parameters = new CheckoutSessionCreateParams
        {
            ProductCart =
            [
                new()
                {
                    ProductID = "prod_test",
                    Quantity = 1
                }
            ]
        };

        // Act
        var session = await _client.CheckoutSessions.Create(parameters);

        // Assert
        Assert.NotNull(session);
        Assert.NotNull(session.SessionId);
    }
}

Tài nguyên

Hỗ trợ

Cần trợ giúp với SDK C#?

Đóng góp

Chúng tôi hoan nghênh các đóng góp! Xem hướng dẫn đóng góp để bắt đầu.