【问题标题】:PayPal SetExpressCheckout stops working after CreateRecurringPaymentsProfilePayPal SetExpressCheckout 在 CreateRecurringPaymentsProfile 后停止工作
【发布时间】:2014-07-02 06:15:08
【问题描述】:

我正在尝试使用 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) 设置ExpressCheckout

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) 创建RecurringPaymentsProfile

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

【问题讨论】:

  • 我无法使用相同的参数重新创建此错误。你能把你的电话同时发给 SetExpressCheckout 和 CreateRecurringPaymentsProfile 吗?
  • 当然,我已经更新了问题。

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


【解决方案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 请求和响应,并质疑当您甚至没有在请求中包含任何金额或项目详细信息时您收到此类错误的事实。

【讨论】:

  • 包括在内。正如我所说,第一次流程成功,就没有他们。
  • 是的,我第一次不知何故错过了。对我来说听起来像是你在会话变量或类似的东西中传递数据,并且它们没有被清除或重置你认为它们应该的方式。需要查看工作 API 请求的完整示例以及失败的后续操作。另外,我对第一个错误表示您的购物车总数不匹配感到有些困惑。这似乎又好像会话数据被遗留下来并且项目总数没有加起来总计。完整的请求样本会有很大帮助。
  • 我将所有请求添加到问题中。是的,我认为这与会话有关,因为当我尝试重复流程时,PayPal 会跳过登录页面,我发现自己以登录用户的身份出现在协议页面上(尽管来自 SEC 的令牌无效)。但是我不知道状态可以存储在我这边的哪里,所以我猜是PayPal没有以某种方式清除会话。
  • 虽然服务器重启后问题就可以解决了,所以也许node.js保留了一些会话数据。
  • 就问题中的请求而言,我没有看到任何新内容..??我不想看到“从第 1 步开始”之类的东西,我想看到实际的原始请求。例如,我试图查看来自第一个(工作)事务的相同令牌是否最终与第二组请求一起发送,等等。如果你能提供完整的样本,就像我提供的样本集一样,那将有很大帮助。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 2011-12-12
    • 2014-12-10
    • 2014-03-04
    • 2013-07-06
    • 2013-06-27
    • 2017-08-05
    • 2011-04-19
    • 2018-04-22
    相关资源
    最近更新 更多