我刚刚使用普通的“纯文本”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>
&lt;&gt;中的所有内容此时出于安全原因被删除,但这应该可以让您了解加密后发布的内容。
表单很简单,并通过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”。 (使用Sandbox时显示)。发送给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喜欢的签名块?
答案 0 :(得分:0)
作为一种解决方法和高级集成,我建议使用Express Checkout API。
它可以完成标准PayPal按钮可以执行的所有操作,并且可以使用标准按钮接受所有PayPal帐户。
你试过Express Checkout吗?
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帐户。您可以通过在初始SetExpressCheckout API调用中添加SOLUTIONTYPE = Sole来启用完全相同的访客结帐功能。
另一个值得注意的区别是,对于EC,客户将始终在付款完成之前返回您的网站。这是一件好事,因为您将有机会向客户提供订单审核页面并更新任何总计,或者只是立即执行付款,立即获得API响应,并立即感谢或要求客户再试一次
基本上,EC在每个方面都更好。您只需要能够从服务器向PayPal编写HTTPS API调用。