You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过.NET集成PayPal Advanced Checkout实现信用卡支付?

解决ASP.NET中PayPal REST API直接处理信用卡支付的问题

核心结论

PayPal v2 REST API支持直接信用卡支付,你遇到的PAYEE_ACCOUNT_INVALID错误主要是账户权限或配置问题导致的,以下是具体排查和实现方案:


1. 排查PAYEE_ACCOUNT_INVALID错误

  • 账户权限未开通:仅在应用设置中勾选"Advanced Credit and Debit"不够,沙箱商家账户需要单独开通「Direct Credit Card Processing」权限:
    1. 登录PayPal开发者平台,进入「Sandbox > Accounts」
    2. 找到你的测试商家账户,点击「Profile」
    3. 在「Payment Capabilities」中确认是否包含「Credit Card Processing」,若没有需在账户设置中启用(部分地区可能需要提交额外申请)
  • 沙箱账户配置不匹配:确保测试商家账户的地区、业务类型与申请的权限匹配,部分地区沙箱账户默认不开启直接信用卡支付。

2. .NET后端直接处理信用卡支付的正确方式

方式一:单次直接支付(不存储卡片)

使用PayPal.Net库通过Orders API直接提交信用卡信息完成支付,示例代码:

using PayPalCheckoutSdk.Core;
using PayPalCheckoutSdk.Orders;
using System.Collections.Generic;
using System.Threading.Tasks;

public async Task<HttpResponse> ProcessCreditCardPayment()
{
    // 初始化PayPal客户端
    var environment = new SandboxEnvironment("你的CLIENT_ID", "你的CLIENT_SECRET");
    var client = new PayPalHttpClient(environment);

    // 构建订单请求
    var orderRequest = new OrderRequest()
    {
        CheckoutPaymentIntent = "CAPTURE",
        PurchaseUnits = new List<PurchaseUnitRequest>()
        {
            new PurchaseUnitRequest()
            {
                AmountWithBreakdown = new AmountWithBreakdown()
                {
                    CurrencyCode = "USD",
                    Value = "10.00"
                }
            }
        },
        PaymentSource = new PaymentSource()
        {
            Card = new Card()
            {
                Number = "4111111111111111", // PayPal测试卡号
                Expiry = "12/28",
                Cvv = "123",
                Name = "TEST USER"
            }
        }
    };

    // 创建订单
    var createOrderRequest = new OrdersCreateRequest();
    createOrderRequest.Prefer("return=representation");
    createOrderRequest.RequestBody(orderRequest);
    var createOrderResponse = await client.Execute(createOrderRequest);
    var order = createOrderResponse.Result<Order>();

    // 捕获订单完成支付
    var captureRequest = new OrdersCaptureRequest(order.Id);
    captureRequest.RequestBody(new OrderActionRequest());
    var captureResponse = await client.Execute(captureRequest);
    return captureResponse;
}

方式二:存储用户信用卡(支持复用支付)

若要支持用户存储的信用卡,需使用PayPal Vault API将卡片安全存储到PayPal服务器,后续支付仅需调用存储的卡片ID,示例代码:

存储卡片:
using PayPalCheckoutSdk.Core;
using PayPalCheckoutSdk.Vault;

public async Task<HttpResponse> StoreUserCreditCard()
{
    var environment = new SandboxEnvironment("你的CLIENT_ID", "你的CLIENT_SECRET");
    var client = new PayPalHttpClient(environment);

    var cardRequest = new CreditCardRequest()
    {
        Number = "4111111111111111",
        Expiry = "12/28",
        Cvv = "123",
        Name = "TEST USER",
        BillingAddress = new AddressPortable()
        {
            AddressLine1 = "123 Test St",
            AdminArea2 = "San Jose",
            AdminArea1 = "CA",
            PostalCode = "95131",
            CountryCode = "US"
        }
    };

    var createCardRequest = new CreditCardsCreateRequest();
    createCardRequest.RequestBody(cardRequest);
    var response = await client.Execute(createCardRequest);
    var storedCard = response.Result<CreditCard>();
    // 将storedCard.Id保存到你的用户数据库,用于后续支付
    return response;
}
使用存储的卡片支付:
public async Task<HttpResponse> PayWithStoredCard(string storedCardId)
{
    var environment = new SandboxEnvironment("你的CLIENT_ID", "你的CLIENT_SECRET");
    var client = new PayPalHttpClient(environment);

    var orderRequest = new OrderRequest()
    {
        CheckoutPaymentIntent = "CAPTURE",
        PurchaseUnits = new List<PurchaseUnitRequest>()
        {
            new PurchaseUnitRequest()
            {
                AmountWithBreakdown = new AmountWithBreakdown()
                {
                    CurrencyCode = "USD",
                    Value = "10.00"
                }
            }
        },
        PaymentSource = new PaymentSource()
        {
            Card = new Card()
            {
                Id = storedCardId // 使用存储的卡片ID
            }
        }
    };

    var createOrderRequest = new OrdersCreateRequest();
    createOrderRequest.Prefer("return=representation");
    createOrderRequest.RequestBody(orderRequest);
    var createOrderResponse = await client.Execute(createOrderRequest);
    var order = createOrderResponse.Result<Order>();

    var captureRequest = new OrdersCaptureRequest(order.Id);
    captureRequest.RequestBody(new OrderActionRequest());
    var captureResponse = await client.Execute(captureRequest);
    return captureResponse;
}

3. 关键注意事项

  • PCI合规:直接处理信用卡卡号时,你的系统必须符合PCI DSS标准;使用Vault API存储卡片可大幅降低合规要求,因为PayPal负责处理敏感信息。
  • SDK版本:确保使用最新版的PayPalCheckoutSdk NuGet包,旧版本可能不支持v2 API的直接信用卡支付功能。
  • 权限范围:应用请求的scope必须包含payment:write、payment:read(使用Vault需额外添加vault:write、vault:read)。

内容的提问来源于stack exchange,提问作者pbickford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:30:59