2014-01-03 4 views
1
$client = new SoapClient("http://soap.m4u.com.au/?wsdl", array("trace" => 1)); 
$params = array(

     "authentication" => array(
     "userId" => "user", 
     "password" => "pass" 
    ), 
     "requestBody" => array(
     "messages" => array(
      "message" => array(
       "recipients" => array("recipient" => array("1" => "9799996899")), 
       "content" => "Message Content" 
      ) 
     ) 
    ) 

); 

$response = $client->__soapCall("sendMessages", array($params)); 

Но я получаю следующую ошибкуФатальная ошибка: Uncaught SoapFault исключение: [SOAP-ENV: Client] Запрос либо не правильно сформированным или не действует в отношении соответствующей схемы

Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Client] The request is either not well-formed or is not valid against the relevant schema. 

I нужен формат запроса, как показано ниже.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://xml.m4u.com.au/2009"> 
<soapenv:Header/> 
<soapenv:Body> 
    <ns:sendMessages> 
     <ns:authentication> 
      <ns:userId>Username</ns:userId> 
      <ns:password>Password</ns:password> 
     </ns:authentication> 
     <ns:requestBody> 
      <ns:messages> 
       <ns:message format="SMS" sequenceNumber="1"> 
        <ns:recipients> 
         <ns:recipient uid="1">61400000001</ns:recipient> 
         <ns:recipient uid="2">61400000002</ns:recipient> 
        </ns:recipients> 
       <ns:content>Message Content</ns:content> 
       </ns:message> 
      </ns:messages> 
     </ns:requestBody> 
    </ns:sendMessages> 
</soapenv:Body> 
</soapenv:Envelope> 

Как я могу достичь этого, пожалуйста, помогите.

ответ

0

У вас там сложный.

У меня нет времени на его полное решение, но похоже, что формат WSDL означает, что SoapClient ДОЛЖЕН предоставить структуру объекта.

Я не могу думать с верхней части моей головы, как представить несколько записей узлов без использования массивов (которые видят, чтобы затем разлагаются перед отправкой)

Я знаю, что это не полное решение, но я подумайте, что это движется по правому краю (как доказательство концепции)

Обратите внимание на использование __getLastRequest против SoapClient, чтобы получить именно то, что вы отправляете на сервер. Это очень полезно ...

<?php 

class authentication { 

    public $userId; 
    public $password; 

    function __construct($userId, $password) { 
     $this->userId = $userId; 
     $this->password = $password; 
    } 
} 

class message { 

    public $recipients; 
    public $content; 

    function __construct($recipients, $content) { 
     $this->recipients = $recipients; 
     $this->content = $content; 
    } 
} 

class requestBody { 

    public $messages; 

    function __construct($messages) { 
     $this->messages = $messages; 
    } 
} 

$client = new SoapClient("http://soap.m4u.com.au/?wsdl", array("trace" => 1)); 
$params = array(
     "authentication" => new authentication('user', 'pass'), 
     "requestBody" => new requestBody(array(new message(array('1' => '61400000001') 
                  , 'message content') 
               ) 
             ) 
    ); 

try { 
    $response = $client->sendMessages($params); 
} catch(SoapFault $e) { 
    file_put_contents('request.xml', $client->__getLastRequest()); 
    throw $e; 
} 


?> 

Я думаю, что вам лучше связаться с поставщиком услуг, чтобы найти, если кто-либо другой связан через PHP.

Извините, я не могу больше помогать - надеюсь, это полезно!