Node.js PayPal SetExpressCheckout在CreateRecurringPaymentsProfile后停止工作

Node.js PayPal SetExpressCheckout在CreateRecurringPaymentsProfile后停止工作,node.js,express,paypal,paypal-sandbox,paypal-subscriptions,Node.js,Express,Paypal,Paypal Sandbox,Paypal Subscriptions,我正在尝试使用Express Checkout NVP API实现定期付款。在成功执行流SetExpressCheckout->重定向到PayPal并接受->GetExpressCheckoutDetails->CreateRecurringPaymentsProfile之后,当我尝试通过调用SetExpressCheckout来获取新令牌时(例如,当我尝试为其他用户重复该流时),我收到一个错误: { TIMESTAMP: '2014-05-14T09:09:17Z', CORRELATIO

我正在尝试使用Express Checkout NVP API实现定期付款。在成功执行流SetExpressCheckout->重定向到PayPal并接受->GetExpressCheckoutDetails->CreateRecurringPaymentsProfile之后,当我尝试通过调用SetExpressCheckout来获取新令牌时(例如,当我尝试为其他用户重复该流时),我收到一个错误:

{ TIMESTAMP: '2014-05-14T09:09:17Z',
  CORRELATIONID: '9072df3650d68',
  ACK: 'Failure',
  VERSION: '113',
  BUILD: '10958405',
  L_ERRORCODE0: '10413',
  L_SHORTMESSAGE0: 'Transaction refused because of an invalid argument. See additional error messages for details.',
  L_LONGMESSAGE0: 'The totals of the cart item amounts do not match order amounts.',
  L_SEVERITYCODE0: 'Error' }
如果我从请求中删除
PAYMENTREQUEST\u 0\u AMT:0
,我会得到另一个错误,但这个错误带有一个令牌(每个请求上都是相同的):

贝宝给了我一个令牌,但说它无效。我想这不是参数或它们的值的问题,而是令牌的问题。出于某些原因,PayPal只是在第一次成功的流之后停止发出新令牌,以响应SetExpressCheckout请求

完整流程:

1) SetExpressCheckout

USR: [...],
PWD: [...],
SIGNATURE: [...],
VERSION: 113,
METHOD: 'SetExpressCheckout',
PAYMENTREQUEST_0_AMT: 0,
MAXAMT: 5.0,
L_BILLINGTYPE0: 'RecurringPayments',
L_BILLINGAGREEMENTDESCRIPTION0: [...],
REQCONFIRMSHIPPING: 0,
NOSHIPPING: 1,
BRANDNAME: [...],
EMAIL: [...],
LANDINGPAGE: 'Login',
cancelUrl: [...],
returnUrl: [...]
2) 重定向到
https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=token
,其中用户接受计费协议

3) GetExpressCheckoutDetails(步骤1中的凭据、方法和令牌)

4) CreateRecurringPaymentsProfile

USR: [...],
PWD: [...],
SIGNATURE: [...],
VERSION: 113,
METHOD: 'CreateRecurringPaymentsProfile',
TOKEN: [from the step 1],
PAYERID: [from the step 3],
PROFILESTARTDATE: [ISO date string],
DESC: [...],
BILLINGPERIOD: 'Month',
BILLINGFREQUENCY: 1,
AMT: 5.0,
AUTOBILLOUTAMT: 'AddToNextBilling',
CURRENCYCODE: 'USD',
MAXFAILEDPAYMENTS: 1,
L_PAYMENTREQUEST_0_ITEMCATEGORY0: 'Digital',
L_PAYMENTREQUEST_0_NAME0: [...],
L_PAYMENTREQUEST_0_AMT0: 5.0,
L_PAYMENTREQUEST_0_QTY0: 1

就这样。我使用node.js来完成请求。

您是否绝对确定第二次提供的请求是正确的?看起来一定有你不知道的事情发生了,或者某些数据必须包含在我们在这里没有看到的请求中。。??可能您的日志是从原始请求(通过会话或其他方式)保存的,但第二个失败的请求实际上是一个新请求,带有附加参数,发送到PayPal,但不是保存在日志中的内容

当我看到它时,不管我重复多少次,它都能按预期工作

只有在以下情况不正确时,才会显示有关购物车总数的错误

金额=项目金额+发货金额+处理金额+税金金额

当我向同一个请求中添加项目,但故意使价格不相加时,我会得到一个错误,表明您是第二次通过的。你可以

所以奇怪的是,你第二次显示的请求除了最大金额之外,根本没有任何项目或金额信息,就像第一次一样。但是,您发送的金额为0.00,这意味着如果在装运、搬运、税务或任何项目中添加了价格,则最终会出现错误

您确定其中一个参数没有以某种方式包含在您的日志无法捕获的请求中吗。。??这是传递到HTTP请求中的内容的原始转储吗

事实上,PayPal的服务器一定看到了一些东西,这些东西会导致它触发这个错误,我从来没有见过这个错误,因为它不是简单的错误计算这些值


如果你不能追踪到任何类似的东西,你需要将此提交给。不过,我甚至懒得解释关于第二次旅行的所有信息。只需提供原始API请求和响应就可以了,如果请求中没有包含任何金额或项目详细信息,那么您会遇到这样的错误

我通过发送GET请求而不是POST来解决问题。是否设置了最终字段,以及用于向PayPal API发送GET请求的函数。

我无法使用相同的参数重新创建此错误。你能把你的电话同时发送到SetExpressCheckout和CreateRecurringPaymentsProfile吗?当然,我已经更新了这个问题。它们都包括在内了。正如我所说,第一次流程成功的时候,就不会没有他们。是的,我第一次不知怎么错过了。对我来说,这听起来像是在会话变量或类似的东西中传递数据,而它们没有按照您认为的方式被清除或重置。需要查看工作API请求的完整示例以及失败的后续操作。此外,我对第一个错误感到有点困惑,即您的购物车总数不匹配。这似乎再次表明,可能是会话数据被遗留下来,项目总数并没有达到总总数。完整的请求样本会有很大帮助。我在问题中添加了所有请求。是的,我认为这与会话有关,因为当我尝试重复流程时,PayPal跳过登录页面,我发现自己作为一个登录用户出现在协议页面上(尽管SEC的令牌无效)。但是我不知道状态可以存储在哪里,所以我猜是PayPal没有清除会话。虽然问题可以在服务器重新启动后解决,所以node.js可能保留了一些会话数据。就问题中的请求而言,我没有看到任何新的东西。。??我不想看到像“从步骤1”这样的东西,我想看到实际的原始请求。例如,我试图查看来自第一个(工作)事务的同一令牌是否最终与第二组请求一起发送。如果你能像我提供的样本集一样提供完整的样本,那将非常有帮助。
USR: [...],
PWD: [...],
SIGNATURE: [...],
VERSION: 113,
METHOD: 'CreateRecurringPaymentsProfile',
TOKEN: [from the step 1],
PAYERID: [from the step 3],
PROFILESTARTDATE: [ISO date string],
DESC: [...],
BILLINGPERIOD: 'Month',
BILLINGFREQUENCY: 1,
AMT: 5.0,
AUTOBILLOUTAMT: 'AddToNextBilling',
CURRENCYCODE: 'USD',
MAXFAILEDPAYMENTS: 1,
L_PAYMENTREQUEST_0_ITEMCATEGORY0: 'Digital',
L_PAYMENTREQUEST_0_NAME0: [...],
L_PAYMENTREQUEST_0_AMT0: 5.0,
L_PAYMENTREQUEST_0_QTY0: 1