PayPal PHP IPN 示例指的是哪些 POST 序列化问题?

Posted

技术标签:

【中文标题】PayPal PHP IPN 示例指的是哪些 POST 序列化问题?【英文标题】:What POST serialization issues does PayPal PHP IPN example refer to? 【发布时间】:2012-12-10 02:12:30 【问题描述】:

PayPal 的 php IPN 侦听器示例代码在顶部有以下注释/代码:

// reading posted data from directly from $_POST causes serialization 
// issues with array data in POST
// reading raw POST data from input stream instead. 
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) 
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
     $myPost[$keyval[0]] = urldecode($keyval[1]);

有人能解释一下这条评论指的是什么序列化问题吗?虽然我可以这样做,但如果知道为什么要这样做,我会更自在。

【问题讨论】:

不确定这在上下文中意味着什么,但$_POST 并不总是包含与php://input 相同的内容。例如:key=val1&key=val2 将导致key$_POST 数组中只有一个条目。而且,php://input 是只读的,而 $_POST 不是。 查看我放置的测试页面,果然$raw_post_array 将包含两个key 条目,在一个索引数组中。但是,示例代码的其余部分最终将原始数据解析为数组。比较这两个数组,它们的自定义$myPost 数组与$_POST 相同。即:保留最后声明的$key = 'val2' 为什么在世界中他们这样做而不是仅仅使用parse_str?他们可能指的是它所做的一些奇怪的事情吗?毕竟,它使用生成$_GET$_POST 的相同代码... 示例代码将是最糟糕的! 我在 paypal 找到的一些代码是多余的。您可以使用if(get_magic_quotes_gpc())curl_setopt_array() 【参考方案1】:

我无法告诉你 paypal 的动机,但我可以猜到:php 喜欢更改来自 http 请求的传入变量的键。

例如,名称 a.b [ 将显示为 $_POST['a_b__']。 php 将用下划线替换空格、点和左括号: 来源:http://php.net/manual/en/language.variables.external.php

此外,php 会将变量名中格式正确的匹配括号解析为嵌套数组。例如,arr[a][b] 将显示为 $_POST['arr']['a']['b']。 http://php.net/manual/en/faq.html.php#faq.html.arrays

此外,当括号格式不正确时,php 会表现出各种疯狂和错误: https://bugs.php.net/bug.php?id=48597

另外,magic_quotes_gpc 曾经在每个 php 安装中都有它的爪子,在某些情况下也会更改变量的名称。 http://php.net/manual/en/security.magicquotes.php

另外,php 有arg_seperator.input 设置,有些人喜欢将其设置为& 而不仅仅是&。 Paypal 无法知道您喜欢哪个,并且显然在制作 url 和/或 post body 来请求时总是使用&,导致您的 php 引擎解析参数错误。 http://php.net/manual/en/ini.core.php#ini.arg-separator.input

此外,尽管是不好的做法,但在 php 中,代码/库自动修改请求输入(例如 $_POST)并不少见,例如对它们进行“清理”或其他此类横切问题。 $_POST 是一个可写/可修改的变量,而 php://input 是只读的,所以保证不会被库弄乱。

通过手动解析输入,您可以避免所有这些潜在问题。这个决定对他们来说似乎是一项很好的工程。

【讨论】:

很棒的答案。也感谢您的参考! 好答案。现在说得通了。 谢谢。让我也很困惑。

以上是关于PayPal PHP IPN 示例指的是哪些 POST 序列化问题?的主要内容,如果未能解决你的问题,请参考以下文章

贝宝 IPN 订阅 (php)

PayPal IPN 脚本未重定向到 ipn.php

PHP Paypal“官方”IPN 监听器无法正常工作

PayPal IPN HTTP 错误 400 - PHP - 使用 PayPal GIT 代码

Paypal IPN 协议:为啥示例中没有发送空的 HTTP 200 响应?

如何配置paypal定期付款IPN url