在 Sandbox 中一切正常,但我使用 PayPal Live 得到 IdentityException

Everything works in Sandbox, but I get IdentityException using PayPal Live

我正在使用 .NET SDK (https://www.nuget.org/packages/PayPal) 使用 PayPal REST API 将 PayPal 支付集成到我的网站中。我的网站 运行 作为 Microsoft Azure 中的应用服务。我有一个配置为使用 PayPal 沙盒的测试槽,以及一个使用实时凭证的生产槽(配置设置位于应用程序设置中,并且是特定于槽的)。

Sandbox 中一切正常,我能够使用实时配置进行身份验证并获取访问令牌,但是当我尝试处理任何内容时,我得到一个 PayPal.IdentityException(我尝试了付款和计费计划和协议)。如果我查看 IdentityException Response(或 Details),我会得到:

{"error":"invalid_token","error_description":"The token passed in was not found in the system"}

进一步挖掘,似乎创建的 ApiContext 设置了 AccessToken,但 Config 属性 是 null。如果我查看 API 请求(来自 PayPalResource.LastRequestDetails.Value),我发现即使它使用实时配置,它也会将请求发送到 api.sandbox.paypal.com,而不是实时 API。这似乎是我的 ApiContext 的问题,我建立如下:

public static APIContext Authenticate()
{
    string clientId = ConfigurationManager.AppSettings["PayPalClientId"];
    string clientSecret = ConfigurationManager.AppSettings["PayPalSecret"];
    string mode = ConfigurationManager.AppSettings["PayPalMode"];

    var config = new Dictionary<string, string>();
    config.Add("mode", mode);
    config.Add("clientId", clientId);
    config.Add("clientSecret", clientSecret);

    accessToken = new OAuthTokenCredential(config).GetAccessToken();
    return new APIContext(accessToken);    // <--- problem here
}

除了手动构建 Config 字典而不是使用 ConfigManager 从自定义配置部分自动创建它之外,这非常接近 .NET SDK 文档。我做错了什么?

这里的问题是所有传递给 APIContext 构造函数的都是 accessToken。如果没有 Web.configApp.config 的自定义配置部分中的设置,APIContext 默认使用沙箱 API.

解决方案是使用对象初始化程序显式设置配置 属性:

return new APIContext(accessToken) { Config = config };    // <---- fixed