Paypal IPN覆盖字符集

时间:2012-09-05 15:01:04

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

我有这个paypal IPN的问题。 我看到,很多人都有。

我尝试以用户身份付款:ÁrvíztűrőTükörfúrógép 在这个名字中,有所有特殊的字符,匈牙利的ABC。

我是匈牙利的PHP开发人员。

好的,我试图在谷歌搜索很多。 首先要检查paypal语言设置: http://jlchereau.blogspot.hu/2006/10/paypal-ipn-with-utf8.html

每个设置都是UTF-8。

当paypal调用我的通知网址时,我(之前的开发人员)会构建请求网址。 当我记录这个网址时,我看到,字符集不是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";
   }

}

这是有趣的事情。我找回了一个完全商品化的用户名。 所以我通过char转储char。

第一个名字是: 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名字?

我发送的网址: CMD = _notify-验证&安培; mc_gross = 10.00&安培; protection_eligibility =合格&安培; address_status =确认&安培; payer_id = JA3YMCJFKSCNJ&安培;税务= 0.00&安培; address_street = 1 +主+ ST&安培; PAYMENT_DATE = 07%3A41%3A40 +月+ 05%2C + 2012 + PDT&安培; PAYMENT_STATUS =完成* &安培;字符集= 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%远%F3G%E9P&安培; notify_version = 3.6&安培;定制= lolka_bolka%3Bfalse%3B%3B%3B%3BHungary%3B%3B%3B%3B%3B %3B和放大器; payer_status =验证和放大器;商业= vaso_1346830963_biz%40mydomain.hu和放大器; ADDRESS_COUNTRY =美+美国和放大器; ADDRESS_CITY =圣+何塞&放大器;数量= 1&安培; verify_sign = AVVJjJNeVwHbYcMDVfj2N1DqWwUdAtNQIpb9KIP99gZ2PY-LPoOYzSCc和放大器; PAYER_EMAIL = test_1346830232_per%40mydomain.hu和放大器; txn_id = 4J747779YW528551F和放大器; payment_type =即时&安培;姓氏= T%FCK%F6rf%远%F3G%E9P&安培; ADDRESS_STATE = CA&安培; RECEIVER_EMAIL = vaso_1346830963_biz%40mydomain.hu&安培; payment_fee = 0.59&安培; receiver_i d = TGEHBCMG336WE&安培; txn_type = web_accept&安培; ITEM_NAME = 510 +丝绸安培; 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&安培;航运= 0.00&安培; ipn_track_id = 6fe12a7a34b74

2 个答案:

答案 0 :(得分:40)

您应该在Paypal更改设置。

End page

答案 1 :(得分:3)

Lenart的答案很棒且非常有用,但我想我会添加一些不适合评论的内容。

  • 澄清一下:在您的网站上设置charset,在您的订单中(例如:通过隐藏的输入)是不够的,您还需要设置默认编码 - 正如Lenart的回答所解释的那样。
    • 那是因为该选项仅适用于您自己的数据,而默认设置适用于PayPal发送到您的IPN处理脚本的数据。
    • 例如:您的订单上可能有UTF-8作为隐藏输入,但PayPal IPN仍在windows-1252。您只能通过更改PayPal帐户中的默认设置来解决此问题。
  • 出于测试目的,您还需要为您的Sandbox商家帐户设置该编码选项! (只需使用您的Sandbox商家详细信息登录https://sandbox.paypal.com。)
  • 设置默认编码后,如果再次返回设置以检查其值,它将显示默认值而不是您设置的值。这是一个错误(并说明了PayPal工作的质量),并且您之前设置的值实际上仍然设置。
    • 因此,如果您想确定charset到底是什么,请通过检查POST消息中charset的值,在IPN处理脚本中执行此操作。
  • PayPal使用的默认字符集无法正常工作。
    • 例如:Western European Languages (including English)会导致法语重音字符不起作用。
    • 最好在任何地方使用UTF8(在IPN中显示为UTF-8。)

§

EDIT。最后但同样重要的是:

如果你想用特殊或重音字符测试你的IPN处理脚本,你(理论上)有几个不同的选项,但大多数在实践中都不起作用。

这是一个回顾:

  • 使用IPN Simulator将无法正常工作,因为它无法验证请求(它会产生虚假请求,而不是真实请求。)
  • 遗憾的是,
  • Creating a PayPal Sandbox customer account在名字或姓氏中包含特殊字符是不可能的。
    • 用户界面不支持它,并会要求您Only enter letters(原文如此)。
    • 批量帐户上传功能并不好,导致Something went wrong. One or more sandbox accounts could not be uploaded. Try again.
  • 一个有效的选项:使用PayPal沙盒服务器测试您的网站,然后选择在没有PayPal帐户的情况下付费
    • 这样,您就可以输入名字和姓氏的重音/特殊字符。
    • (您将从“Developer/Sandbox Accounts> 您的客户帐户>个人资料>资金中获取信用卡号,类型和到期日期 - 任何号码都可以用于CVV值。)

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

§

使用PayPal并不好玩,浪费时间。我希望这会帮助你节省一些时间。如果可以的话,把你的事业带到别处。