【问题标题】:SagePay Server URL Encoding accented characters issueSagePay 服务器 URL 编码重音字符问题
【发布时间】:2014-02-19 17:19:10
【问题描述】:

我很难理解通过 cURL 发送到 SagePay 的参数编码。根据他们的文档,所有参数都需要进行 URL 编码。在将参数作为字符串传递给 SagePay 之前,我在参数上使用了 PHP 的 urlencode 方法。以下是部分字符串的示例:-

$data = "BillingFirstnames=Jos%C3%A9+Luis&BillingSurname=Test" ...

但是,它无法在 SagePay 服务器网站上正确呈现带重音的“é”:-

Firstname: José

SagePay 的文档指出,您可以将重音字符作为计费名字(等)的一部分传递,并且该参数应进行 URL 编码。

我们的 cURL 请求看起来像这样(如果这有帮助的话):-

// Set the URL
curl_setopt($cs, CURLOPT_URL, $url);
// No headers, please
curl_setopt ($cs, CURLOPT_HEADER, 0);
// It's a POST request
curl_setopt ($cs, CURLOPT_POST, 1);
// Set the fields for the POST
curl_setopt ($cs, CURLOPT_POSTFIELDS, $data);
// Return it direct, don't print it out
curl_setopt($cs, CURLOPT_RETURNTRANSFER,1); 
// This connection will timeout in 30 seconds
curl_setopt($cs, CURLOPT_TIMEOUT,30); 
curl_setopt($cs, CURLOPT_SSL_VERIFYPEER, FALSE);

$response = preg_split('/$\R?^/m',curl_exec($cs));

有关如何解决此问题以使 SagePay 上的名字显示为“José”的任何建议?

【问题讨论】:

  • Sage Pay 仅在内部处理扩展的 ASCII/ANSI。您的重音字符将从它们的 UTF-8 编码转换为它们的单字节 ANSI 等价物。当然,这意味着将支持非常有限的字符范围 - 主要是带重音的西方字母。

标签: php curl url-encoding opayo


【解决方案1】:

您可以通过http 标头设置utf-8 内容类型。例如:

curl_setopt($cs, CURLOPT_HTTPHEADER, 
    array('Content-Type: application/x-www-form-urlencoded;charset="utf-8"')
);

您已经在问题中提到了 php urlencode,但我没有在您的代码中看到它。所以也再次添加。

$post = "age=15&name=".urlencode("José");

【讨论】:

  • 是的,在我的示例中应该包括我进行 urlencoding 的步骤,我有一个函数,我传入一个数组来清理数据、urlencode 并构建字符串。所以这一切都很好。您的 CURLOPT_HTTPHEADER 建议似乎已经成功了。所以谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多