У меня есть php версии 7.1 на моем локальном хосте. Я внес изменения в мой файл php.ini для запуска SOAP с моего локального хоста.
Мне нужно сгенерировать первичный и вторичный токен сеанса, передав идентификатор входа и пароль клиентскому API SOAP.
Как только токен сеанса аутентифицирован, он вернет некоторый график скорости. Мой код генерирует токены сессии. Но когда я передаю этот ключ токена следующему методу в SOAP Client api, он всегда выдает ошибку типа «Недопустимый токен сеанса» или «Недопустимая аутентификация». Однако те же токены работают хорошо в SOAP UI exe. Я имею в виду, я установил exe SOAP UI и с помощью wsdl «http://cnx.test.dat.com:9280/wsdl/TfmiFreightMatching.wsdl«и используя метод» Login «и» LookupRate «, он работает все нормально. То, как мне это нужно.
Но всякий раз, когда я использую эти токены в php localhost, он всегда выдает ошибку аутентификации клиента SOAP.
Я делюсь своим кодом ниже.
$wsdl = "http://cnx.test.dat.com:9280/wsdl/TfmiFreightMatching.wsdl";
$client = new SoapClient($wsdl, array('trace' => true));
$params = array('loginOperation'=>array('loginId'=>'ryder_cnx1','password'=>'ryder1','thirdPartyId'=>'dl'));
$client->Login($params);
$data = $client->__getLastResponse();
$p = xml_parser_create();
xml_parse_into_struct($p, $data, $vals, $index);
xml_parser_free($p);
$token = [];
foreach ($vals as $key => $value) {
foreach ($value as $key1 => $value1) {
if($key1 == "value")
$token[] = $value1;
}
}
echo "Primary Token = ".$token[0];
echo "<br> Secondary Token = ".$token[1];
//echo "<br> Expiry Date = ".$token[2];
$params_session = array("sessionToken"=> array("primary"=>$token[0], "secondary"=>$token[1]));
$namespace = 'http://www.tcore.com/TcoreTypes.xsd'; // I am not sure about this namespace. Whether its correct or not.
$header = new SoapHeader($namespace,'sessionHeader',$params_session,true);
$client->__setSoapHeaders($header);
$params_data = array('lookupRateOperations'=> array(
'equipment'=>'Vans',
'origin'=>array('postalCode'=>array('country'=>'US','code'=>'30004')),
'destination'=>array('postalCode'=>array('country'=>'US','code'=>'10001'))
));
try{
$result = $client->LookupRate($params_data);
print_r($result);
}catch (SoapFault $exception){
//or any other handling you like
print_r(get_class($exception));
enter code hereprint_r($exception);
}
если у кого-нибудь есть идеи, пожалуйста, поделитесь ими со мной.
В ожидании любого ответа.
Заранее большое спасибо 🙂
Я знаю, что это очень старо, и, скорее всего, ОП понял это. Но в случае, если кто-нибудь еще придет, я смог заставить его работать с двумя небольшими изменениями.
Первый,
$namespace = 'http://www.tcore.com/TcoreTypes.xsd';
Должно быть
$namespace = 'http://www.tcore.com/TcoreHeaders.xsd';
Во-вторых,
$params_session = array("sessionToken"=> array("primary"=>$token[0], "secondary"=>$token[1]));
должно быть
$params_session = array(
"sessionToken"=> array(
"primary"=>base64_decode($token[0]),
"secondary"=>base64_decode($token[1])
)
);
Остальная часть моего кода достаточно похожа, поэтому, если вышеупомянутые изменения сделаны, он должен работать. Я также воздержался бы от публикации реальных имен пользователей и паролей, кстати.
Других решений пока нет …