PHP Pure XML in SOAP


PHP Pure XML in SOAP

我正在尝试使用SOAPclient调用API,但身份验证失败,因为xml中缺少名称空间

XML

除外

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://tourico.com/webservices/" xmlns:trav="http://tourico.com/travelservices/">
   <soapenv:Header>
      <web:LoginHeader>
         <trav:username>*****</trav:username>
         <trav:password>*******</trav:password>
         <trav:culture>en_US</trav:culture>
         <trav:version>7.123</trav:version>
      </web:LoginHeader>
   </soapenv:Header>
   <soapenv:Body>
      <web:CancelReservation>
         <web:nResID>1235456</web:nResID>
      </web:CancelReservation>
   </soapenv:Body>
</soapenv:Envelope>

我实际发送的内容(LoginHeader中没有命名空间)

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tourico.com/webservices/" xmlns:ns2="http://tourico.com/travelservices/">
    <SOAP-ENV:Header>
        <ns2:LoginHeader>
            <username>******</username>
            <password>*******</password>
            <culture>en_US</culture>
            <version>8.0</version>
        </ns2:LoginHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:CancelReservation>
            <ns1:nResID>95665639</ns1:nResID>
        </ns1:CancelReservation>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

My PHP code

    $url = "http://demo-wsnew.touricoholidays.com/ReservationsService.asmx?wsdl";
    $user = "*****";
    $pwd = "********";
    $culture = "en_US";
    $version = "8.0";
    $wsdl = $url;                  
    $client = new SOAPClient($wsdl,array("trace" => true, "exceptions" => true, 'soap_version' => SOAP_1_1));
    $login = new stdClass();
    $login->usernam= $user;
    $login->password = $pwd;
    $login->culture = $culture;
    $login->version = $version;

    // Turn auth header into a SOAP Header
    $header = new SoapHeader('http://tourico.com/travelservices', 'LoginHeader', $login, false);
    // set the header
    $client->__setSoapHeaders($header);

    $r = new stdClass();
    $r->nResID = 123456;
try
{
    $res = $client->CancelReservation($r);
    $results = json_decode(json_encode($res), true);
    Log::error($client->__getLastRequest());
    Log::error(print_r($results , true));
}
catch(Exception $e)
{
    Log::error($client->__getLastRequest());
    Log::error($e->getMessage());
}

是否有一种方法可以将XML字符串发送到SOAPclient ?

您在名称空间上缺少一个尾斜杠,因此这可能是问题的一部分。

在这种情况下,classmap特性可能会有所帮助。试试下面的代码:

$url = "http://demo-wsnew.touricoholidays.com/ReservationsService.asmx?wsdl";
$user = "*****";
$pwd = "********";
$culture = "en_US";
$version = "8.0";
$wsdl = $url;
class MyLoginHeader
{
  public $username;
  public $password;
  public $culture;
  public $version;
}
$classmap = array('LoginHeader' => 'MyLoginHeader');
$client = new SOAPClient($wsdl,array("classmap" => $classmap,"trace" => true, "exceptions" => true, 'soap_version' => SOAP_1_1));
$login = new MyLoginHeader();
$login->username = $user;
$login->password = $pwd;
$login->culture = $culture;
$login->version = $version;

// Turn auth header into a SOAP Header
$header = new SoapHeader('http://tourico.com/travelservices/', 'LoginHeader', $login, false);
// set the header
$client->__setSoapHeaders($header);

$r = new stdClass();
$r->nResID = 123456;
try
{
  $res = $client->CancelReservation($r);
  $results = json_decode(json_encode($res), true);
}
catch(Exception $e)
{
  var_dump($client->__getLastRequest());
  var_dump($e->getMessage());
}
代码生成的XML请求如下所示:
    <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:ns1="http://tourico.com/webservices/" xmlns:ns2="http://tourico.com/travelservices/"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Header>
        <ns2:LoginHeader xsi:type="ns2:LoginHeader">
            <ns2:username>*****</ns2:username>
            <ns2:password>********</ns2:password>
            <ns2:culture>en_US</ns2:culture>
            <ns2:version>8.0</ns2:version>
        </ns2:LoginHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:CancelReservation>
            <ns1:nResID>123456</ns1:nResID>
        </ns1:CancelReservation>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>