首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PayPal经典API SetExpressCheckout重定向给出“事务无效”

PayPal经典API SetExpressCheckout重定向给出“事务无效”
EN

Stack Overflow用户
提问于 2014-08-09 22:37:57
回答 1查看 806关注 0票数 1

正如堆栈溢出中所建议的,我确保登录到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脚本生成的页面源代码中获取的。

代码语言:javascript
复制
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,所有这些都可以:

代码语言:javascript
复制
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浏览器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-10 08:09:00

PayPal不会接受您的令牌,因为您将它作为百分比编码的发送回两次。

SetExpressCheckout响应是包含一系列参数名称和值的字符串。这个字符串是百分比编码,这意味着您需要对它进行解码以提取实际值。

最重要的是,您对TOKEN=EC%2d2D3179619P0352202部分感兴趣,其中%2d表示字符-

当您将字符串直接注入表单输入时,如您的问题所示,%2d只表示字符% 2 d的序列。此外,当作为GET请求发送到PayPal时,序列本身将被百分比编码,百分比符号被编码到%25,从而得到您观察到的序列% 2 5 2 d。所以标记在翻译中丢失了。

您需要输入的是令牌的解码版本:

代码语言:javascript
复制
<input type="hidden" name="token" value="EC-1BH04005UH441943R">

在Perl中,可以使用CPAN的URI::转义模块来实现解码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25223780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档