У меня есть SOAP-сервис, с которым я звоню с встроенным SoapClient в PHP 5.3.1. Первой операцией, которую я должен выполнить в службе, является пользовательская операция аутентификации, и один из необходимых параметров, которые я должен передать, – это зашифрованная строка 3DES, которую я создаю с помощью PHP-скрипта, например:
$encryptionKey = '1234myKey1234'; $currentFormattedDate = date ("Y/m/d H:i"); $encryptedString = mcrypt_encrypt('tripledes', $encryptionKey, $currentFormattedDate, 'ecb');
Если я попытаюсь просто передать $encryptedString
поскольку я получаю его из mcrypt_encrypt()
я получаю фатальную ошибку на моей стороне, и вызов не выполняется:
Неустранимая ошибка: SOAP-ERROR: Encoding: string 'd \ xe0 …' не является допустимой строкой utf-8 в / path / to / file
Однако, если I utf8_encode()
строка как таковая:
$encryptedString = utf8_encode($encryptedString)
Затем выполняется вызов, но их веб-сервис отвечает со следующей ошибкой :
При попытке десериализовать сообщение форматировщик исключил исключение: при попытке десериализации параметра http://tempuri.org/:argStatusDate произошла ошибка. Сообщение InnerException было «Ошибка десериализации объекта типа System.String. Байт 0x19 недействителен в этом месте. Строка 2, позиция 318. '.
Это самое близкое, что я могу добиться успеха в этом процессе, попробовав так много вещей, что вернусь к квадрату. Я проверил, что могу просто передать фиктивную строку, которая приводит к ожидаемому ответу на невозможность аутентификации.
Я не думаю, что это должно иметь какое-то значение, поскольку я считаю, что вызов SOAP в конечном итоге сделан как utf8, но я попытался установить 'encoding' => 'ISO-8859-1' при построении моего SoapClient в PHP, и я получаю то же самое ошибка. Вызов выполняется, но сервер отвечает на ошибку десериализации.
Кто-нибудь знает, лучший способ для меня обработать эту зашифрованную строку, которая понравится как моему клиенту PHP, так и их .Net webservice?
Может быть, проблема в их конце?
FWIW, я также могу попросить изменить метод шифрования на «Rijndael AES Block Cypher» в соответствии с их документацией. Не уверен, что это приведет к упрощению обработки строки.