Skip to content
Bitzsoft.Integrationsbitzsoft.integrations

Reference

PayPal Payment

PayPal 支付服务——OAuth2 client_credentials 令牌模式。

Last updated

基于 PayPal REST API 实现,采用 OAuth2 Client Credentials 令牌模式,内置令牌缓存与自动刷新。

包信息

  • NuGet 包:Bitzsoft.Integrations.Payment.PayPal
  • 接口:IPaymentProvider
  • 鉴权:OAuth2 client_credentials(ClientId / ClientSecret)
  • Provider ID:paypal

配置

字段类型必填默认值说明
ClientIdstring应用 Client Id
ClientSecretstring应用 Client Secret
BaseUrlstringhttps://api-m.paypal.comAPI 基地址(沙箱自动切换 https://api-m.sandbox.paypal.com
UseSandboxboolfalse是否使用 sandbox 沙箱环境
WebhookIdstring?Webhook ID(VERIFY-WEBHOOK-SIGNATURE 端点验签所需)
HttpClientNamestringPayPalPaymentProvider业务 HttpClient 命名
TokenHttpClientNamestringPayPalPaymentProviderToken令牌刷新专用 HttpClient 命名
TimeoutTimeSpan00:00:30HTTP 请求超时
{
"PayPal": {
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret",
"UseSandbox": false,
"WebhookId": "your-webhook-id"
}
}

注册

// 方式一:IConfiguration(默认读取 "PayPal" 配置节)
services.AddPayPalPayment(configuration);
// 方式二:委托配置
services.AddPayPalPayment(options =>
{
options.ClientId = "your-client-id";
options.ClientSecret = "your-client-secret";
options.UseSandbox = false;
});

使用示例

var orderResult = await provider.CreateOrderAsync(new PaymentOrderRequest
{
OutTradeNo = "ORDER_20260801_004",
Subject = "PayPal Order",
TotalAmount = 29.99m,
Scene = PaymentScene.Web
});
// 查询状态
var status = await provider.QueryStatusAsync("ORDER_20260801_004");
// 退款
var refundResult = await provider.RefundAsync(new RefundRequest
{
OutTradeNo = "ORDER_20260801_004",
RefundAmount = 29.99m,
RefundNo = "REFUND_003"
});

鉴权机制

  • 令牌获取:POST /v1/oauth2/token,HTTP Basic Auth(ClientId:ClientSecret),grant_type=client_credentials
  • 令牌缓存:PayPalTokenManager 为 Singleton,持有内存令牌缓存,过期前自动刷新(SemaphoreSlim 并发安全)。
  • 业务请求:按请求注入 Authorization: Bearer {token} 头。
  • 双 HttpClient 隔离:令牌刷新 HttpClient 不经业务管道,避免循环依赖。

已知限制

UseSandbox 为 true 时,若 BaseUrl 仍为默认值则自动切换到沙箱地址。Webhook 验签需要配置 WebhookId

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%