xml — PHP SoapClient автоматически экранирует уже экранированные символы

Я отправляю некоторые данные на сервис SoapService, который содержит экранированные символы валюты. Например  € для символа евро. Однако когда SoapClient::__soapCall называется, строки снова экранированы, так что в конечном итоге выглядит как  €

Вот как я делаю звонок:

$params = new \stdClass();
$params->recipient = new \stdClass();
$params->recipient->name = "Some buyer";
$params->recipient->email = "test@test.com";
$params->data = new \stdClass();
$params->data->name = "total";
$params->data->value = "91,04 €"
$soap = new \SoapClient(); //Skipping the usual settings for the sake of brevity
$soap->__soapCall('send', [$params]);

Я на самом деле использую класс, который расширяет SoapClient чтобы заглушить метод, который вызывает SoapClient::__soapCall, но это не влияет на полезную нагрузку. Я проверил это до того момента, когда SoapClient::__soapCall называется все выглядит как описано выше.

Есть идеи, как этого избежать?

0

Решение

Данные кодируются, меняются  € в  € для того, чтобы избежать его для вставки в XML. Если вы посмотрите на него на приемном конце, то когда он выйдет, он будет преобразован обратно в  €, Так то, что вы положили в это то, что выходит.

Таким образом, в большей степени необходимо убедиться, что вы отправляете данные в формате, в котором нуждающаяся сторона должна их содержать. Если ваши данные имеют сущности HTML, но получающая сторона нуждается в обычной версии, не являющейся сущностью, тогда html_entity_decode() данные. Это так же, как если бы вы делали вызов локально, если этот локальный метод не работает с сущностями, то вам лучше декодировать эти сущности заранее.

Если вы делаете кодировку именно потому, что знаете, что она будет вставлена ​​в XML, то вы делаете дополнительный шаг, поскольку мыльный клиент уже делает это для вас. Просто придерживайтесь того, что должно быть на другом конце.

0

Другие решения

Других решений пока нет …