C# SDK 目前处于测试阶段。我们正在积极进行改进,并欢迎您的反馈。
安装
使用 .NET CLI 安装 SDK:复制
dotnet add package DodoPayments.Client
SDK 需要 .NET 8.0 或更高版本。它适用于 ASP.NET Core、控制台应用程序和其他 .NET 项目类型。
快速开始
初始化客户端并创建结账会话:复制
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);
始终使用环境变量、用户机密或 Azure Key Vault 安全存储您的 API 密钥。切勿将其硬编码在源代码中或提交到版本控制中。
核心功能
Async/Await
完整的基于 async Task 的 API,支持非阻塞操作
强类型
具有可空引用类型的全面类型安全
依赖注入
对 .NET 依赖注入的一级支持
配置
通过环境变量或 appsettings.json 进行简单配置
配置
环境变量
使用环境变量进行配置:.env
复制
DODO_PAYMENTS_API_KEY=your_api_key_here
复制
// Automatically reads from environment variables
DodoPaymentsClient client = new();
手动配置
使用 Bearer 令牌手动配置:复制
DodoPaymentsClient client = new() { BearerToken = "My Bearer Token" };
常见操作
创建结账会话
生成结账会话:复制
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}");
管理客户
创建和检索客户信息:复制
// Create a customer
var createParams = new CustomerCreateParams
{
Email = "[email protected]",
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})");
处理订阅
创建和管理定期订阅:复制
// 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);
ASP.NET Core 集成
服务注册
在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();
配置
在appsettings.json 中添加配置:
appsettings.json
复制
{
"DodoPayments": {
"ApiKey": "your_api_key_here"
}
}
API 控制器
使用依赖注入创建控制器:复制
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);
服务层模式
为业务逻辑创建服务:复制
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;
}
}
}
用户机密(开发)
在开发中,使用用户机密存储 API 密钥:复制
dotnet user-secrets init
dotnet user-secrets set "DodoPayments:ApiKey" "your_api_key_here"
测试
使用 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);
}
}
资源
支持
需要 C# SDK 的帮助吗?- Discord: 加入我们的 社区服务器 获取实时支持
- 电子邮件: 联系我们 [email protected]
- GitHub: 在 仓库 上打开问题