Я подключаюсь к динамику 365. Раньше он работал отлично, я заворачиваюсь, чтобы получить токен, затем я использую его как заголовок авторизации вместе с php soapclient, и он работает, я подключаюсь, я создаю клиента и могу звонить мои методы.
Внезапно он решил не работать, и где он использовал для подключения, как SOAP 1.1, теперь он принудительно SOAP 1.2 После изменения с SOAP 1.1 на SOAP 1.2 (потому что я получил ошибка несоответствия привязки, в которой было указано ожидаемое приложение / soap + xml и текст / xml). Таким образом, я изменил версии, и эта ошибка исчезла, и ее заменили ERROR Fetching HTTP Headers.
Эта ошибка застряла дольше всего, люди предлагали увеличить тайм-аут, но я все равно поднял его до 500 800 5000.
И вдруг он начал давать мне SOAP ОШИБКА. Элемент схемы синтаксического анализа уже определен. Я не изменил свой код, я какое-то время играл с заголовками, но безрезультатно, я даже удалил заголовок авторизации, просто чтобы посмотреть, что происходит, и это ничего не дало, я продолжал получать ту же ошибку.
SOAP-ERROR: Parsing Schema: element 'http://schemas.datacontract.org/2004/07/Microsoft.Dynamics.Ax.Xpp:XppObjectBase' already defined [string:Exception:private]
каждый раз, когда я пытаюсь подключиться, я получаю различную ошибку синтаксического анализа, хотя я ничего не меняю в своем коде:
SOAP-ERROR: Parsing Schema: element 'http://schemas.microsoft.com/2003/10/Serialization/:anyType' already defined [string:Exception:private]
и еще один
SOAP-ERROR: Parsing Schema: element 'http://schemas.datacontract.org/2004/07/Microsoft.Dynamics.AX.KernelInterop:ProxyBase' already defined [string:Exception:private]
, а затем иногда проходит через секунду, но с извлечением ошибки заголовка http снова ..
, поэтому я не могу больше создавать экземпляр клиента сейчас ... где раньше я мог создать экземпляр клиента, но я получаю ошибку, когда я вызвать метод «Ошибка получения заголовков HTTP»
что-то определенно не является стабильным, потому что мои ошибки не единичны.
Теперь некоторые утверждают, что wsdl может быть неисправен, но это Microsoft, и человек, с которым я общаюсь, постоянно говорит, что он ничего не может с этим поделать.
Справка: это проблема PHP, проблема с динамикой или проблема с wsdl.
И как ее решить.
Спасибо.
ОБНОВЛЕНИЕ
Извините, я упоминал ранее, что это Dynamics AX, оказывается, это Dynamics 365 D365. Я буду держать динамический топор на случай, если он поможет кому-то, кому нужны решения.
ОБНОВЛЕНИЕ Ниже приведен код подключения, который я использую:
function getAuthenticationHeader()
{
//Each variable has the values for our server
//resource
$appResource = urlencode($appADResource);
//clientID
$appClientID = urlencode($appADClientId);
//appSecret
$appSecret = urlencode($appADSecret);
//username
$appUserID = urlencode($appUserID);
// Password
$appUserPassword = urlencode($password);
// Construct the body for the STS request
$authenticationRequestBody = 'resource='.$appResource.'&client_id='.$appClientID.'&client_secret='.$appSecret.'&grant_type=password&username='.$appUserID.'&password='.$appUserPassword.'&scope=openid';
//Using curl to post the information to STS and get back the authentication response
$ch = curl_init();
// set url
$stsUrl = 'https://login.microsoftonline.com/'.$appTenantId.'/oauth2/token';
curl_setopt($ch, CURLOPT_URL, $stsUrl);
// Get the response back as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Set the parameters for the request
curl_setopt($ch, CURLOPT_POSTFIELDS, $authenticationRequestBody);
// By default, HTTPS does not work with curl.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// read the output from the post request
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
// decode the response from sts using json decoder
$tokenOutput = json_decode($output);
return $tokenOutput->{'token_type'}.' '.$tokenOutput->{'access_token'};
}
try
{
//WSDL Link
$url = "https://urlToOurServer/services/webservice?wsdl";
$authorizationToken = getAuthenticationHeader();
$context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
),
'https' => array(
'curl_verify_ssl_peer' => false,
'curl_verify_ssl_host' => false
),
'http' => array(
'header' =>'Authorization: '.$authorizationToken
)
));
//Create array of Soap Options
$arrOpt = array(
"soap_version" => SOAP_1_2,
"cache_wsdl" => WSDL_CACHE_NONE,
"exceptions" => true,
'trace' => true,
'encoding' => 'UTF-8',
'stream_context' => $context
);
}catch(Exception $e)
{
print_r($e);
}
Я также нашел это в моем wsdl
<sp:IssuedToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<sp:RequestSecurityTokenTemplate>
<trust:TokenType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0
</trust:TokenType>
<trust:KeyType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer
</trust:KeyType>
</sp:RequestSecurityTokenTemplate>
<wsp:Policy>
<sp:RequireInternalReference/>
Как я могу подключиться к SAML для токена?