Я отправляю некоторые данные на сервис SoapService, который содержит экранированные символы валюты. Например  €
для символа евро. Однако когда SoapClient::__soapCall
называется, строки снова экранированы, так что в конечном итоге выглядит как  €
Вот как я делаю звонок:
$params = new \stdClass();
$params->recipient = new \stdClass();
$params->recipient->name = "Some buyer";
$params->recipient->email = "[email protected]";
$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
называется все выглядит как описано выше.
Есть идеи, как этого избежать?
Данные кодируются, меняются  €
в  €
для того, чтобы избежать его для вставки в XML. Если вы посмотрите на него на приемном конце, то когда он выйдет, он будет преобразован обратно в  €
, Так то, что вы положили в это то, что выходит.
Таким образом, в большей степени необходимо убедиться, что вы отправляете данные в формате, в котором нуждающаяся сторона должна их содержать. Если ваши данные имеют сущности HTML, но получающая сторона нуждается в обычной версии, не являющейся сущностью, тогда html_entity_decode()
данные. Это так же, как если бы вы делали вызов локально, если этот локальный метод не работает с сущностями, то вам лучше декодировать эти сущности заранее.
Если вы делаете кодировку именно потому, что знаете, что она будет вставлена в XML, то вы делаете дополнительный шаг, поскольку мыльный клиент уже делает это для вас. Просто придерживайтесь того, что должно быть на другом конце.
Других решений пока нет …