PayPal SetExpressCheckout在CreateRecurringPaymentsProfile之后停止工作

时间:2014-05-14 09:19:08

标签: node.js express paypal paypal-sandbox paypal-subscriptions

我尝试使用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_0_AMT: 0,我会收到另一个错误,但是这个错误有一个令牌(每个请求都是相同的):

{ TOKEN: 'EC-2U787650918701539',
  TIMESTAMP: '2014-05-14T09:13:09Z',
  CORRELATIONID: 'd3f276219cab9',
  ACK: 'Failure',
  VERSION: '113',
  BUILD: '10958405',
  L_ERRORCODE0: '10410',
  L_SHORTMESSAGE0: 'Invalid token',
  L_LONGMESSAGE0: 'Invalid token.',
  L_SEVERITYCODE0: 'Error' }

所以PayPal给了我一个代币,但说它无效。我猜它不是参数或它们的值的问题,而是与令牌有关。出于某种原因,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中的凭证,METHOD和TOKEN)。

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 request来完成请求。

2 个答案:

答案 0 :(得分:1)

您是否完全确定第二次提供的请求是否正确?似乎必定会发生一些您不知道的事情,或者某些数据必须包含在我们未在此处看到的请求中。也许你的日志正在保存原始请求(通过会话或其他东西),但第二个失败的实际上是一个新请求,其中包含其他参数,这些参数将被发送到PayPal但不会保存到你的日志.. ??

当我replicate your request on my test server时,无论我重复多少次,它都按预期工作。

只有在以下情况不属实时,您才会显示有关购物车总数的错误。

AMT = ITEMAMT + SHIPPINGAMT + HANDLINGAMT + TAXAMT

当我将商品添加到同一个请求中,但有目的地使价格没有加起来时,我会收到错误,表明您已经第二次通过了。你可以see that here

好奇的是,你第二次显示的请求除了MAXAMT之外没有任何项目或金额信息,就像第一次一样。但是,您发送的金额为0.00,这意味着如果运费,手续费,税金或任何项目添加了价格,您最终会得到错误。

你确定其中一个参数不会以某种方式包含在你的日志不以某种方式捕获的请求中吗?这是传递给您的HTTP请求的原始转储吗?

事实上,PayPal的服务器必须看到一些会导致它触发此错误的事情,并且我从来没有见过这个错误。这些价值的简单错误估计。

如果您无法跟踪此类内容,则需要将此内容提交至PayPal MTS。不过,我甚至无法解释所有这些关于四处走动的信息。只需提供未通过的原始API请求和响应,并质疑当您甚至不在请求中包含任何金额或项目详细信息时,您会收到此类错误。

答案 1 :(得分:0)

我通过发送GET请求而不是POST来解决我的问题。 Here是最终的字段集,也是我用来向PayPal API发送GET请求的函数。