当PayPal在POST中向IPN侦听器发送错误的字符集时,IPN验证返回INVALID

时间:2014-10-28 22:58:19

标签: php utf-8 paypal paypal-ipn url-encoding

所有以下内容都在PayPal沙箱中:

我有一个PayPal订阅/定期付款设置,它使用IPN侦听器作为在我的网站数据库中创建或更新用户订阅的最后一步。但是,当我从paypal收到POST数据并将其发回以进行验证时,我收到的唯一回复是“无效”。

我知道我的代码正确地将POST数据发送回PayPal,因为当我通过使用“IPN Message”值硬编码POST数据字符串来模仿对我的侦听器的正确POST时,我得到“验证”响应。 PayPal的IPN历史页面。

所以我的代码将POST数据发送回PayPal进行最终验证,我的IPN监听器正在接收事务的POST变量。我的IPN侦听器创建的POST数据字符串与发送回PayPal和PayPal期望接收的POST数据字符串有所区别。

PayPal声明IPN侦听器必须使用PayPal发送的相同值,顺序和编码发送回收到的POST数据。

我认为问题是编码问题,因为在我的监听器的PayPal POST中,“charset”的值为“windows-1252”,应为“UTF-8”。但是,“form_charset”具有正确的值“UTF-8”。

我已在卖家PayPal个人资料的两个输入字段中将编码设置为UTF-8,并在初始PayPal表单/按钮中隐藏输入,名称为“charset”,值为“UTF-8”。请告诉我是否有其他方法来设置我错过的编码。

PayPal声称要发送的POST数据字符串的一部分包括“& notify_version = 3.8”,后跟更多变量。当我手动插入此字符串以测试我的代码时,“& not”在打印到页面时会转换为“¬”,据我所知,这意味着正在使用的字符编码是“windows-1252”,因为“¬”是在windows-1252字符集中,但“¬”不在UTF-8字符集中,因此如果使用UTF-8,则“& not”不会像这样转换。

如何让PayPal使用UTF-8字符编码将数据实际POST到我的IPN侦听器?请注意,这是经常性付款,因此某些方面可能会有所不同。

我认为问题不在我的最后,因为我尝试了不同的方法,编码/解码发布数据的不同方式,外部库,cUrl / sockets,不同版本的SSL,不同的标题,重新启动服务器,重新创建购买等 所以Paypal发送错误的POST数据或者我错误地形成了帖子字符串。后者是可能的,但我已经尝试了每种方法,我可以找到形成post字符串,但没有工作。

我一直在研究这个问题几天无济于事,所以任何帮助或指示都会非常感激。

PS: 一些可能相关或不相关的注释:

  • 这个订阅系统是几个月前创建的,并且在过去几周的某个时刻才停止了莫名其妙的工作。当时AFAIK没有更改相关代码。

  • 我开始调试此问题的第一天,沙箱的卖家帐户的数据完全不正确,当它应该是商家帐户时,它被列为个人帐户,这意味着没有任何IPN设置可用。第二天,同一个帐户莫名其妙地工作,并且首先显示为商业帐户。我不知道我的任何行动导致了这种变化。也许PayPal发送错误的字符编码是一个类似的问题?一个cron工作的缓存系统?我只是在猜测,我真的不知道。

  • 关于我的最后一点,登录卖家沙盒帐户非常不可靠。有时我尝试在会话超时后重新登录并收到错误代码,这只在注册新帐户的情况下才有意义。其他时间登录不起作用,结果是我尝试在会话超时后登录的次数的一小部分,我必须清除我的cookie以便重新登录工作。

2 个答案:

答案 0 :(得分:3)

这是一个tldr;

根据Miles的经验,似乎PayPal Sandbox中存在一个错误,意味着字符集设置无效。

我发现此错误已经解决。

更改PayPal设置中的字符集

  • 登录您的商家帐户
  • 点击个人资料
  • 在“销售首选项”下,单击“语言编码”
  • 按"更多选项"按钮

First Page - Language Encoding

  • 选择您网站的编码,然后在“是”
  • 上保留使用相同的设置按钮

Second Page - More encoding options

  • 保存您的设置。

答案 1 :(得分:1)

最终解决方案是同时使用IPN侦听器和PDT,只需确保两个脚本都检查以确认事务尚未收到,因此不会多次收到事务。

因此,只需跟踪数据库中的paypal事务,并在IPN侦听器和PDT脚本中检查该数据库。