Paypal IPN覆盖字符集

26
我有一个关于Paypal IPN的问题。 我看到很多人都遇到了这个问题。
我尝试以用户身份支付:Árvíztűrő Tükörfúrógép 在这个名字中,有所有匈牙利字母表中的特殊字符。
我是一名匈牙利PHP开发者。
好的,我尝试在Google上搜索了很多内容。 第一件事是检查Paypal语言设置: http://jlchereau.blogspot.hu/2006/10/paypal-ipn-with-utf8.html 所有设置都是UTF-8。
当Paypal调用我的通知URL时,我(之前的开发者)构建了请求URL。 当我记录下这个URL时,我发现字符集不是UTF-8,因此我强制脚本使用UTF-8。
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
   if ($key == 'charset') {
      $req .= "&charset=utf-8";
   } else {
      $value = urlencode(stripslashes($value));
      $req .= "&$key=$value";
   }

以下是有趣的事情。我得到了一个完全格式不正确的用户名。所以我逐个字符地进行转储。

第一个名字将是: CHARS: 193、114、118、237、122、116、26、114、26

很糟糕。 我尝试了一切办法来获取我的真实utf-8名称。 mb_detect_encoding为UTF-8。

我尝试使用iconv、mb_convert_encoding、utf8_encode和decode。 没有成功。尝试不对名称进行urlencode,仍然没有成功。

有人能告诉我,为什么会这样,我该如何找回真正的utf8名称吗?

我发送的URL: cmd = _notify-validate&mc_gross = 10.00&protection_eligibility = Eligible&address_status = confirmed&payer_id = JA3YMCJFKSCNJ&tax = 0.00&address_street = 1 + Main + St&payment_date = 07%3A41%3A40 + Sep + 05%2C + 2012 + PDT&payment_status = Completed * &charset = utf-8 *&address_zip = 95131&first_name =%C1rv%EDzt%1Ar%1A&mc_fee = 0.59&address_country_code = US&address_name =%C1rv%EDzt%1Ar%1A + T%FCk%F6rf%FAr%F3g%E9p&notify_version = 3.6&custom = lolka_bolka%3Bfalse%3B%3B%3B%3BHungary%3B%3B%3B%3B%3B%3B&payer_status = verified&business = vaso_1346830963_biz%40mydomain.hu&address_country = United + States&address_city = San + Jose&quantity = 1&verify_sign = AVVJjJNeVwHbYcMDVfj2N1DqWwUdAtNQIpb9KIP99gZ2PY-LPoOYzSCc&payer_email = test_1346830232_per%40mydomain.hu&txn_id = 4J747779YW528551F&payment_type = instant&last_name = T%FCk%F6rf%FAr%F3g%E9p&address_state = CA&receiver_email = vaso_1346830963_biz%40mydomain.hu&payment_fee = 0.59&receiver_id = TGEHBCMG336WE&txn_type = web_accept&item_name = 510 + Silk&mc_currency = USD&item_number =&residence_country = US&test_ipn = 1&handling_amount = 0.00&transaction_subject = lolka_bolka%3Bfalse%3B%3B%3B%3BHungary%3B%3B%3B%3B%3B%3B&payment_gross = 10.00&shipping = 0.00&ipn_track_id = 6fe12a7a34b74

1
您的PayPal配置文件中是否启用了UTF-8?请参阅http://shwup.blogspot.sg/2009/05/paypal-ipn-issues-with-unicode.html。 - Ja͢ck
@jack:这是我的第一步:“好的,我在谷歌上尝试了很多搜索。首先要检查PayPal的语言设置:http://jlchereau.blogspot.hu/2006/10/paypal-ipn-with-utf8.html” - vaso123
好的,现在当我检查我的URL时,意识到我发送了错误的名字:first_name =%C1rv%EDzt%1Ar%1A其中űő相同,%1A。所以现在我将尝试逐个字符地对名称进行urlencode。 - vaso123
好的,我想我找到了问题所在。我已经在所有地方设置了UTF-8,但这并不重要,因为我无法在沙盒模式下设置它。 - vaso123
另外一件我使用 http_build_query($_POST) 而不是 foreach 循环的事情,它似乎能够很好地处理它。从来没有遇到过这样的问题。 - Sergey Romanov
2个回答

53

此外,在您的IPN页面中,应将编码大写:$req = 'cmd=_notify-validate'; foreach($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req.= "&$key=$value"; } $req = str_replace('=utf-8', '=UTF-8', $req); - toni07
2
谁能想到IPNS的编码在“PayPal按钮语言编码”下面...感谢这个提示! - Paludis
3
很高兴这个链接还能用,因为“我的销售工具”在新的PayPal设计中消失了。 - Aidas
5
当前界面已无法操作。请访问神奇地址https://www.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-language-encoding。 - David Spector
在花费了数小时的时间后,我终于找到了为什么无法将IPN插入数据库的原因(即使我可以使用IPN模拟器结果)。原来问题出在字符编码上。当然,模拟器使用的是英文字母,而真实支付并不一定如此(例如address_street)。这是一个很好的答案,我只是想知道它如何适用于遇到类似问题的人(即IPN插入问题)。 - Szél Lajos

8

Lenart的回答非常好且非常有用,但我想补充一些无法放在评论中的内容。

  • 澄清一下:在您的站点上设置charset,在订单表格中设置(例如:通过隐藏输入),是不够的,您还需要设置默认编码 - 如Lenart的答案所解释的那样。
    • 这是因为该选项仅适用于您自己的数据,而默认设置适用于PayPal发送到您的IPN处理脚本的数据。
    • 例如:您在订单表格中具有UTF-8,但PayPal IPN仍然使用windows-1252。您只能通过更改PayPal帐户中的默认设置来修复此问题。
  • 出于测试目的,您也需要为Sandbox商家账户设置编码选项!(只需使用Sandbox商家详细信息登录https://sandbox.paypal.com
  • 设置默认编码后,如果您再次返回设置以检查其值,则会显示默认值而不是您设置的值。这是一个漏洞(并可说明PayPal工作质量的水平),您之前设置的值实际上仍然设置。
    • 因此,如果要确保字符集是什么,请在IPN处理脚本内部通过检查POST消息中的charset值来检查。
  • PayPal使用的默认字符集无法正常工作。
    • 例如:西欧语言(包括英语)会导致法语重音字符无法正常工作。
    • 最好在所有地方都使用UTF8(在IPNs中将显示为UTF-8)。

§

编辑。最后但同样重要:

如果您想测试带有特殊或重音字符的IPN处理脚本,理论上有几个不同的选项,但其中大多数实际上无法正常工作。

以下是一个总结:

  • 使用 IPN模拟器 无法起作用,因为它无法验证请求(生成的是假请求,而不是真实请求)。
  • 创建一个PayPal沙盒客户帐户 在名字或姓氏中使用特殊字符是不可能的。
    • 用户界面不支持,会提示您:只输入字母(如此等)。
    • 批量帐户上传功能也不理想,结果是:出错了。无法上传一个或多个沙盒帐户,请重试。
  • 有效的方法:使用PayPal沙盒服务器测试您的网站,并选择“无需PayPal帐户付款”。
    • 这样,您就可以输入带重音符号/特殊字符的名字和姓氏。
    • (您可以从“开发者/沙盒账户 您的客户帐户 › 配置文件 › 资金”中获取信用卡号码、类型和过期日期 - 对于CVV值,任何数字都可以。)

我几个月前向PayPal报告了这个问题,但没有任何改变。

§

与PayPal合作不是一件有趣的事情,也是很浪费时间的。如果可以的话,请将您的业务带到其他地方。


很棒的回答。更新:沙盒用户现在可以在PayPal的结帐过程中更改他的地址并输入特殊字符... - DIDoS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接