一切都在沙盒中运行,但是我使用PayPal Live收到了IdentityException

rud*_*den 4 .net c# integration paypal paypal-rest-sdk

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

一切在Sandbox中都可以正常工作,并且我可以使用实时配置进行身份验证并获得访问令牌,但是当我尝试处理任何事情时,我都得到了PayPal.IdentityException(我尝试了“付款”以及“计费计划和协议”)。如果查看IdentityException Response(或Details),则会得到以下信息:

{"error":"invalid_token","error_description":"The token passed in was not found in the system"}
Run Code Online (Sandbox Code Playgroud)

进一步挖掘,似乎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
}
Run Code Online (Sandbox Code Playgroud)

除了手动构造Config字典,而不是使用字典ConfigManager从自定义配置部分自动创建字典以外,这与.NET SDK文档非常相似。我究竟做错了什么?

rud*_*den 6

这里的问题是,传递给APIContext构造函数的全部是accessToken。如果没有的自定义配置部具有设置Web.configApp.configAPIContext默认使用沙盒API。

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

return new APIContext(accessToken) { Config = config };    // <---- fixed
Run Code Online (Sandbox Code Playgroud)