php – 当PayPal在POST中向IPN侦听器发送错误的字符集时,IPN验证返回INVALID
作者:互联网
所有以下内容都在PayPal沙箱中:
我有一个PayPal订阅/定期付款设置,它使用IPN监听器作为在我的网站数据库中创建或更新用户订阅的最后一步.但是,当我从paypal收到POST数据并将其发回以进行验证时,我收到的唯一响应是“INVALID”.
我知道我的代码正确地将POST数据发送回PayPal,因为我通过使用PayPal的IPN上显示的“IPN Message”值对POST数据字符串进行硬编码来模仿对我的侦听器的正确POST时得到“验证”响应历史页面.
所以我的代码将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 /套接字,不同版本的SSL,不同的头,重新启动服务器,重新创建购买等
所以Paypal发送错误的POST数据或者我错误地形成了帖子字符串.后者是可能的,但我已经尝试了我可以找到的每个方法来形成post字符串,但没有一个工作.
我一直在研究这个问题几天无济于事,所以任何帮助或指针都将非常感激.
PS:
一些可能相关或不相关的注释:
>这个订阅系统是几个月前创建的,并且在过去几周的某个时刻才停止了莫名其妙的工作.当时AFAIK没有更改相关代码.
>我开始调试此问题的第一天,沙箱的卖家帐户有完全不正确的数据,当它应该是一个企业帐户时,它被列为个人帐户,这意味着没有任何IPN设置可用.第二天,同一个帐户莫名其妙地工作,并且首先显示为商业帐户.我不知道我的任何行动导致了这种变化.也许PayPal发送错误的字符编码是一个类似的问题?一个cron工作的缓存系统?我只是在猜测,我真的不知道.
>关于我的最后一点,登录卖家沙箱帐户非常不可靠.有时我尝试在会话超时后重新登录并收到错误代码,这只在注册新帐户的情况下才有意义.其他时间登录不起作用,结果是我尝试在会话超时后登录的一小部分时间,我必须清除我的cookie以重新登录工作.
解决方法:
这是一个tldr;
根据Miles的经验,似乎PayPal Sandbox中存在一个错误,意味着charset设置无效.
我发现这个bug已经解决了.
更改PayPal设置中的字符集
>登录您的商家帐户
>单击配置文件
>在销售首选项下单击语言编码
>按“更多选项”按钮
>选择您网站的编码,然后在yes上保留使用相同的设置按钮
>保存您的设置.
标签:php,utf-8,url-encoding,paypal,paypal-ipn 来源: https://codeday.me/bug/20190624/1276812.html