正如堆栈溢出中所建议的,我确保登录到https://developer.paypal.com,在尝试SetExpressCheckout流之前为沙箱开发设置cookies。
我从我的SetExpressCheckout电话中得到了成功的响应,回复如下:
TOKEN=EC%2d2D3179619P0352202&TIMESTAMP=2014%2d08%2d08T01%3a58%3a29Z&CORRELATIONID=ca8756c977f0&ACK=Success&VERSION=116&BUILD=12301660
使用_-checkout命令:重定向到PayPal时,我的问题出现了
我提取令牌值,并以HTTP形式传递它,下面显示了GET和POST变体。我使用的是Perl,但是表单只是普通的HTML,下面的表单是直接从我的Perl脚本生成的页面源代码中获取的。
form using GET:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="GET">
<input type="hidden" name="cmd" value="_express-checkout">
<input type="hidden" name="token" value="EC%2d1BH04005UH441943R">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_SM.gif" border="0" alt="PayPal - The safer, easier way to pay online!">
</form>
form URL: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC%252d1BH04005UH441943R&x=61&y=11
lands on: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_flow&SESSION=S4XbHMPLePuv_A93vhHvqIo4GEYOpsQCYkn6iiIE6AeRfMEkXHzSPWYeH3G&dispatch=50a222a57771920b6a3d7b606239e4d529b525e0b7e69bf0224adecfb0124e9b61f737ba21b08198a0586321b47f5ae7b54ee269d9200b8b
( PayPal page with "This transaction is invalid. Please return to the recipient's website to complete your transaction using their regular checkout flow." )
form using POST:
<form action=https://www.sandbox.paypal.com/cgi-bin/webscr METHOD='POST'>
<input type=hidden name='cmd' value='_express-checkout'>
<input type=hidden name='token' value=EC%2d9MK58577ER8913409>
<input type=image src=https://www.paypalobjects.com/en_US/i/btn/btn_buynow_SM.gif border=0 alt='PayPal - The safer, easier way to pay online!'>
</form>
form URL: https://www.sandbox.paypal.com/cgi-bin/webscr
lands on: https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_flow&SESSION=MQjOoKQ1FNeHGrVOsukD0Ln8K8LvfvfrejsDm9XZq3JeLThBanMZ2vC1Wtm&dispatch=50a222a57771920b6a3d7b606239e4d529b525e0b7e69bf0224adecfb0124e9b61f737ba21b08198a0586321b47f5ae7b54ee269d9200b8b
( PayPal page with "This transaction is invalid. Please return to the recipient's website to complete your transaction using their regular checkout flow." )奇怪的是,如果我使用手动输入的URL,该URL将是使用method=GET的表单的“action=”URL,所有这些都可以:
Manual cut-n-paste of form URL: https://www.sandbox.paypal.com/cgi-bin/webscr&cmd=_express-checkout&token=EC%2d00D71751FM635411H (with or w/o appending &x=nn&y=nn)
lands on: https://www.sandbox.paypal.com/cgi-bin/webscr&cmd=_express-checkout&token=EC%2d00D71751FM635411H
( Sandbox test store, showing order summary and buyer PayPal account login prompts, as expected )在我看来,PayPal的会话缓存存在一些问题,因为我的表单URL被转换为带有parms "_cmd=flow&SESSION={long session ID}“的URL,但是在登录到developer.paypal.com之前,我清除了(Safari)浏览器cookie。
我在另一台计算机上也有类似的行为,使用Firefox和IE浏览器。
发布于 2014-08-10 08:09:00
PayPal不会接受您的令牌,因为您将它作为百分比编码的发送回两次。
SetExpressCheckout响应是包含一系列参数名称和值的字符串。这个字符串是百分比编码,这意味着您需要对它进行解码以提取实际值。
最重要的是,您对TOKEN=EC%2d2D3179619P0352202部分感兴趣,其中%2d表示字符-。
当您将字符串直接注入表单输入时,如您的问题所示,%2d只表示字符% 2 d的序列。此外,当作为GET请求发送到PayPal时,序列本身将被百分比编码,百分比符号被编码到%25,从而得到您观察到的序列% 2 5 2 d。所以标记在翻译中丢失了。
您需要输入的是令牌的解码版本:
<input type="hidden" name="token" value="EC-1BH04005UH441943R">在Perl中,可以使用CPAN的URI::转义模块来实现解码。
https://stackoverflow.com/questions/25223780
复制相似问题