【问题标题】:Generic "Sorry — your last action could not be completed" Failure通用“抱歉——您的最后一个操作无法完成”失败
【发布时间】:2014-09-08 14:52:36
【问题描述】:

我刚刚从使用普通的“纯文本”PayPal 按钮切换到加密按钮(两者都是自制的,因为它们需要是动态的)。普通的工作正常,但我遇到了加密版本的问题。 Paypal 只是失败并显示通用的“抱歉,您的最后一个操作无法完成”消息,并且没有提供更多信息。

我发布的信息是……

cert_id=<certificateID>
business=<merchantID>
return=<returnURL>
cancel_return=<returnURL>
notify_url=<ipnURL>
cn=Email Address Needed
lc=GB
currency_code=GBP
button_subtype=services
no_note=0
no_shipping=1
rm=1
charset=utf-8
item_name=<productName>
item_number=<productID>
amount=<value>

出于安全原因,此时 中的所有内容都已删除,但这应该让您对加密后发布的内容有所了解。

表单很简单,通过 jQuery AJAX 调用提交(以减少加密按钮添加到页面的大量数据)...

<form id='igp-<prodID>' action='https://www.paypal.com/cgi-bin/webscr' method='post'>
    <input type='hidden' name='cmd' value='_s-xclick' />
    <input type='hidden' name='encrypted' value='{$paypalData}' />
</form>

PayPal 的文档在您需要在这里做什么方面相当随意地散布,但我看不到任何我遗漏的东西。

如果我替换 cert_id 中的一个字母,那么它仍然会失败并显示相同的消息(而不是告诉我它无法解密数据),这给人的印象是它甚至没有走那么远。

有什么想法吗?

编辑/更新: 看起来失败实际上是“我们无法解密证书 ID”。 (使用沙盒时显示)。发送到 OpenSSL 的代码看起来很正常(正确的 '=' 匹配值)。

我正在使用的 OpenSSL 代码是...

 $opensslOutput = trim(shell_exec("export RANDFILE='system/.rnd'; (openssl smime -sign -signer {$keystoreCert} -inkey {$keystoreKey} -outform der -nodetach -binary <<_EOF_\n{$paypalData}\n_EOF_\n) | openssl smime -encrypt -des3 -outform pem -binary {$paypalCert}"));

这反过来会产生一个大的 PCK7Z 块,并且 OpenSSL 没有错误。所以这就引出了一个问题,Paypal 在这里可能会失败吗?上面的代码是否不再产生 Paypal 喜欢的签名块?

【问题讨论】:

  • FWIW 这个错误现在很普遍,不一定限于加密支付。许多论坛条目已经确定了一个可能的浏览器问题(适用于 Safari,但不适用于 Chrome?),总体印象是,这是由于 Paypal 的设计大修造成的。无论哪种方式,它都会影响付款,这对他们不利。

标签: paypal


【解决方案1】:

作为一种解决方法和更好的集成,我建议改用 Express Checkout API。

它可以做标准 PayPal 按钮可以做的所有事情,甚至更多,并且适用于所有可以使用标准按钮收款的 PayPal 账户。

您是否尝试过快速结帐?

https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECGettingStarted/

https://devtools-paypal.com/guide/expresscheckout/php?interactive=OFF&env=sandbox

https://devtools-paypal.com/integrationwizard/ecpaypal/main.php

需要注意的主要区别是,默认情况下,EC 要求买家在结账时登录或创建 PayPal 帐户。您可以通过将 SOLUTIONTYPE=Sole 添加到您的初始 SetExpressCheckout API 调用来启用与标准完全相同的访客结帐功能。

另一个需要注意的区别是,使用 EC,客户将始终在付款完成之前返回您的站点。这是一件好事,因为您将有机会向客户展示订单审查页面并更新任何总数,或者直接执行付款,立即获得 API 响应,并立即感谢或要求客户再试一次.

基本上,EC 在每一个方面 都更好。您只需要能够将 HTTPS API 调用从您的服务器写入 PayPal。

【讨论】:

  • 我注意到了这一点,但在任何地方都看不到任何简单的示例实现。这些物品都将是单一物品“立即购买”样式设置,因此不需要完整的购物车。与我尝试使用的单个帖子提交相比,Paypal 网站上的演练似乎太过分了。
  • 为了进一步补充这一点,Express Checkout 似乎还需要使用他们的 SDK,我宁愿避免这种情况,并且我试图保持这个小而独立(我不也不想遇到与 PHP 版本的第 3 方兼容性问题)。
  • Express Checkout 不需要任何 SDK,这是可选的。如果您的需求如此简单,为什么不使用 PayPal 的托管按钮?你需要什么样的动态性?您对加密按钮有何安全需求?
  • 有数百种产品,每种产品的价格都不同,因此为每种产品手动创建按钮与通过帖子发送产品名称、ID 和价格相比需要很长时间,如上所示。使用 Paypal 不加密帖子数据似乎是个坏主意,因为它可以通过浏览器中的开发人员工具简单地更改为任何内容,尽管这种可能性极小,但仍然存在风险。我不确定如果没有 SDK,Express Checkout 将如何工作,因为他们的 SDK 包含他们在示例中使用的所有功能,以实际将数据发送到 Paypal。
  • 添加更多内容 - 他们的文档也到处都是。您链接到的“devtools-paypal.com/guide/expresscheckout/…”告诉您需要使用甚至不包含所需功能的 SDK。此外,当您尝试下载该 SDK 时,它会告诉您它已被弃用并使用新的 SDK,然后会告诉您许多功能尚不支持。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 2014-12-25
  • 2018-05-06
  • 2020-05-15
  • 2018-05-23
  • 2016-12-04
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多