所以,这对我来说是一个新的。我的 Paypal IPN 已经工作了一段时间,今天开始出现错误。
在使用 PayPal 进行验证的回发期间(添加 cmd=_notify-validate),PayPal 响应者说“不,这不是来自我的”。这个特定条目唯一奇怪的是(我相信)用户指定其地址的方式:
地址街 123 号
#789
其他一切似乎都很正常,IPN 处理程序非常愉快地处理其他通知。
有人见过这样的吗?
所以,这对我来说是一个新的。我的 Paypal IPN 已经工作了一段时间,今天开始出现错误。
在使用 PayPal 进行验证的回发期间(添加 cmd=_notify-validate),PayPal 响应者说“不,这不是来自我的”。这个特定条目唯一奇怪的是(我相信)用户指定其地址的方式:
地址街 123 号
#789
其他一切似乎都很正常,IPN 处理程序非常愉快地处理其他通知。
有人见过这样的吗?
好的,所以我发现了我的错误,是的,它与地址中的换行符有关。
基本上我是这样做的:
foreach ($post_array as $name => $value) {
$value = urlencode($value);
$post_string .= $name . '=' . $value . '&';
}
$post_string .= "cmd=_notify-validate";
当我还需要将 转换/n
为 a/r/n
时,如下所示:
foreach ($post_array as $name => $value) {
$value = urlencode(str_replace("\n", "\r\n", $value));
$post_string .= $name . '=' . $value . '&';
}
$post_string .= "cmd=_notify-validate";
现在贝宝很高兴。
乐叹息。
2018 年更新,因为在将站点从 CI v2 更新到 CI v3 后,我再次遇到了这个错误……
从 CodeIgniter v3 开始,换行标准化现在默认关闭(以前默认开启)。从 CI v3.1.3 开始,standardize_newlines 被认为是 deprecated,所以如果你还没有放弃它,那么是时候放弃它了。
结果是我的 IPN 脚本第一次必须处理带有换行符的地址时,Paypal 的响应是它是无效的。
花了一段时间才弄清楚,因为我没有意识到换行标准化默认值是不同的。但解决方案是简化连接响应字符串以发送回 Paypal 的代码,只需取出该(str_replace("\n", "\r\n", $value)
部分并用 just 替换它$value
(urlencode
尽管如此)。
所以它回到了它最初应该如何工作的方式,本质上......现在贝宝又高兴了。
更多信息,因为我自己花了半天时间在这个错误上。
这似乎是我也在使用的 CodeIgniter 框架引入的一个错误,CodeIgniter 正在标准化新行https://github.com/EllisLab/CodeIgniter/blob/2.1.4/system/core/Input.php#L707
这似乎破坏了 IPN 响应,上面的答案是修复它的最佳方法。
$value = urlencode(str_replace("\n", "\r\n", $value));