始终在soap客户端php中作为无效会话令牌获得响应

时间:2017-02-24 10:33:19

标签: php web-services wsdl soapui soap-client

我的localhost中有php 7.1版。我在php.ini文件中进行了更改,以便从我的localhost运行SOAP。

我需要通过将登录ID和密码传递给SOAP客户端API来生成主会话令牌和辅助会话令牌。

一旦会话令牌被验证,它将返回一些速率图表。我的代码正在生成会话令牌。但是当我将该令牌密钥传递给SOAP Client api中的下一个方法时,它总是给我一个错误,例如"无效的会话令牌"或"无效的身份验证"。但是,相同的令牌在SOAP UI exe中运行良好。我的意思是我已经安装了SOAP UI exe并使用了wsdl" http://cnx.test.dat.com:9280/wsdl/TfmiFreightMatching.wsdl"并使用方法"登录"和" 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);
}

如果有人有任何想法,请与我分享。

等待任何回复。

提前多多感谢:)

1 个答案:

答案 0 :(得分:0)

我知道这已经很老了,OP很可能已经解决了。但是如果有其他人出现,我可以通过两个小的改动就可以使它工作。

首先

$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])
    )
);

我其余的代码足够相似,因此,如果进行了上述更改,它应该可以工作。我还要避免发布真实的用户名和密码,顺便说一句。