Mil*_*efe 5 php paypal utf-8 url-encoding paypal-ipn
以下所有内容均位于 PayPal 沙箱中:
\n\n我有一个 PayPal 订阅/定期付款设置,它使用 IPN 侦听器作为在我的网站数据库中创建或更新用户订阅的最后一步。但是,当我收到来自 paypal 的 POST 数据并将其发回进行验证时,我收到的唯一响应是“无效”。
\n\n我知道我的代码正确地将 POST 数据发送回 PayPal,因为当我通过使用 PayPal\ 上看到的“IPN Message”值硬编码 POST 数据字符串来模仿正确的 POST 到监听器时,我会得到“VERIFIED”响应的 IPN 历史页面。
\n\n因此,我将 POST 数据发送回 PayPal 进行最终验证的代码有效,并且我的 IPN 侦听器正在接收交易的 POST 变量。我的 IPN 侦听器创建的发送回 PayPal 的 POST 数据字符串与 PayPal 期望接收的 POST 数据字符串之间存在差异。
\n\nPayPal 规定,IPN 侦听器必须发回其收到的 POST 数据,其值、顺序和编码与 PayPal 发送的数据相同。
\n\n我认为问题是编码问题,因为在 PayPal POST 中,“charset”的值为“windows-1252”,应该是“UTF-8”。但是,“form_charset”的正确值是“UTF-8”。
\n\n我已将卖家 PayPal 个人资料上的两个输入字段的编码设置为 UTF-8,并在初始 PayPal 表单/按钮中隐藏了一个名为“charset”和值“UTF-8”的输入。请告诉我是否有其他方法来设置我错过的编码。
\n\nPayPal 声称要发送的 POST 数据字符串的一部分包括“¬ify_version=3.8”,后跟更多变量。当我手动插入此字符串来测试我的代码时,“¬”在打印到页面时会转换为“\xc2\xac”,据我了解,这意味着正在使用的字符编码是“windows-1252”,因为“\xc2” \xac" 属于 windows-1252 字符集,但 "\xc2\xac" 不属于 UTF-8 字符集,因此如果使用 UTF-8,则 "¬" 不会这样转换。
\n\n如何让 PayPal 使用 UTF-8 字符编码将数据实际 POST 到我的 IPN 侦听器?请记住,这是定期付款,因此某些方面可能会有所不同。
\n\n我不认为问题出在我这边,因为我尝试了不同的方法、不同的编码/解码发布数据的方式、外部库、cUrl/sockets、不同版本的 SSL、不同的标头、重新启动服务器、重新创建购买等。\n因此 Paypal 向我发送了错误的 POST 数据,或者我错误地形成了 post 字符串。后者是可能的,但我已经尝试了我能找到的用于形成帖子字符串的所有方法,但没有一个有效。
\n\n我已经研究这个问题好几天了,但没有成功,所以任何帮助或指示将非常感激。
\n\nPS:\n一些可能相关也可能不相关的注释:
\n\n这个订阅系统是几个月前创建的,直到最近几周的某个时候才莫名其妙地停止工作。据我所知,当时没有更改相关代码。
我第一天开始调试这个问题时,沙盒的卖家账户数据完全不正确,本应是企业账户却被列为个人账户,这意味着没有任何 IPN 设置可用。第二天,同一个帐户莫名其妙地工作起来,并显示为企业帐户,因为它本来就应该如此。我不知道我的任何操作导致了这一变化。也许 PayPal 发送错误的字符编码也是类似的问题?某个 cron 作业上的缓存系统?我现在只是猜测,我真的没有任何线索。
关于我的最后一点,登录卖家沙箱帐户非常不可靠。有时,我尝试在会话超时后重新登录,并收到错误代码,该代码仅在注册新帐户的情况下才有意义。其他时候,登录不起作用,结果是,在会话超时后尝试登录的一小部分时候,我必须清除 cookie 才能重新登录才能工作。
这是一个 tldr;
根据 Miles 的经验,PayPal Sandbox 中似乎存在一个错误,导致字符集设置无效。
我发现这个bug已经解决了。
更改 PayPal 设置中的字符集
最终的解决方案是同时使用 IPN 侦听器和 PDT,只需确保两个脚本都进行检查以验证尚未收到交易,以便不会多次收到交易。
因此,只需在数据库中跟踪 paypal 交易并在 IPN 侦听器和 PDT 脚本中检查该数据库即可。
| 归档时间: |
|
| 查看次数: |
2063 次 |
| 最近记录: |