Клиент SOAP с несколькими уровнями и атрибутами - PullRequest
0 голосов
/ 03 июня 2019

Я потратил часы, пытаясь понять это, и ничего из того, что я пробовал из предложений SO на PHP.net, не сработало. Я пытаюсь заставить SOAP Call работать, когда у меня есть несколько вложенных уровней XML, и есть атрибуты на верхнем уровне, а также подуровни, и кажется, что ничего не работает. Куда я не так с моим кодом?

Я пробовал то, что похоже на все, из SO и PHP.net, но ни один из ответов, кажется, не описывает достаточно глубоко или несколько уровней XML, все они, кажется, предполагают, что вы углубляетесь только на один уровень.

Я пробовал оба ниже, в дополнение к большему:

    $params = array("Request"=>array("_"=>array("Credentials"=>array("UserNumberCredentials"=>array("UserNumber"=>$userNumber,"Password"=>$password)),"DeviceInformation"=>array("_"=>"","DeviceType"=>$this->deviceType,"DeviceNumber"=>$this->deviceNumber)),"MessageId"=>$this->messageId));
    $params = array("Request"=>array("_"=>array("Credentials"=>array("_"=>array("UserNumberCredentials"=>array("_"=>array("UserNumber"=>$userNumber,"Password"=>$password)))),"DeviceInformation"=>array("_"=>"","DeviceType"=>$this->deviceType,"DeviceNumber"=>$this->deviceNumber)),"MessageId"=>$this->messageId));

И ожидаемый XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
   <soapenv:Header/>
   <soapenv:Body>
      <user:logon>
         <!--Optional:-->
         <Request MessageId="messageId">
            <!--Optional:-->
            <Credentials>
               <!--Optional:-->
               <UserNumberCredentials>
                  <!--Optional:-->
                  <UserNumber>value</UserNumber>
                  <!--Optional:-->
                  <Password>value</Password>
               </UserNumberCredentials>
            </Credentials>
            <!--Optional:-->
            <DeviceInformation DeviceType="deviceType" DeviceNumber="number" />
         </Request>
      </user:logon>
   </soapenv:Body>
</soapenv:Envelope>

Я передаю параметры в вызов SOAP следующим образом:

    $results = $this->client->logon($params);

Я пробовал несколько способов, и он либо возвращает ошибку проверки, где он говорит, что в теге запроса отсутствует атрибут MessageId, либо когда он возвращает ошибку мыла, сообщающую, что информация об устройстве или учетные данные неверны, и я знаю, что они ' оба они правильно набраны и правильно переданы в переменные функции-обертки, поэтому они правильно передаются через мыльный вызов. Но так как он возвращает ошибку мыла, я не могу сказать, какой именно XML он передает.

UPDATE: Приведенные ниже параметры являются своего рода правильными, но я думаю, что оба атрибута DeviceInformation не отправляются. Я думаю, что это только отправка одного, поэтому сервер отклоняет вызов. Сам тег DeviceInformation является пустым, но атрибуты DeviceNumber и DeviceType являются обязательными для этого тега, и я думаю, что только один или ни один не отправляется в вызове. Но он возвращает ошибку, поэтому я не могу увидеть XML.

$params = array("Request"=>array("_"=>array("Credentials"=>array("UserNumberCredentials"=>array("UserNumber"=>$userNumber,"Password"=>$password)),"DeviceInformation"=>array("_"=>"","DeviceType"=>$this->deviceType,"DeviceNumber"=>$this->deviceNumber)),"MessageId"=>$this->messageId));

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Видимо, ниже показано, как массив должен был быть отформатирован для получения атрибутов в параметрах. Я получил пример кода от кого-то, кто использовал тот же сервис, и это было похоже на то, как они его отформатировали, и это сработало. Что не похоже на то, что я гуглил, но, возможно, это поможет кому-то в будущем. Для справки, мой SoapClient находится в режиме WSDL.

            $params = array(
                "Request"=>array(
                    "MessageId"=>$this->messageId,
                    "Credentials"=>array(
                        "UserNumberCredentials"=>array(
                            "UserNumber"=>$userNumber,
                            "Password"=>$password
                        )
                    ),
                    "DeviceInformation"=>array(
                        "DeviceType"=>$this->deviceType,
                        "DeviceNumber"=>$this->deviceNumber
                    )
                )
            );
0 голосов
/ 03 июня 2019

Вот как я обычно вхожу в систему и отправляю свои SOAP-запросы:

<?php
// The form
$params = array(
    "Request"=>array(
        "MessageId"=>$this->messageId,
        "Credentials"=>array(
            "UserNumberCredentials"=>array(
                "UserNumber"=>$userNumber,
                "Password"=>$password
            )
        ),
        "DeviceInformation"=>array(
            "DeviceType"=>$this->deviceType,
            "DeviceNumber"=>$this->deviceNumber
        )
    )
);

// API Configs
$config = array(
    "wsdl" => "https:// ... the wsdl url ... ", // WSDL URL Here
    "namespace" => "http://schemas.xmlsoap.org/soap/envelope/",
    "username" => "", // Username
    "password" => "", // Password
    "soap_options" => array(
        "exceptions" => true,
        "trace" => 1,
        /* If you need a proxy, uncomment
        "proxy_host" => "",
        "proxy_port" => 80,
        */
        "cache_wsdl" => WSDL_CACHE_NONE
    ),
    // For SSL..
    "stream_context" => stream_context_create(array(
        "ssl" => array(
            // set some SSL/TLS specific options
            "verify_peer" => false,
            "verify_peer_name" => false,
            "allow_self_signed" => true
        )
    ))
);

// Initialize soap client object
$client = new SoapClient($config, $config["soap_options"]);

// Credentials
$credentials = array(
    "userName" => $config["username"], 
    "password" => $config["password"]
);
$authvalues = new SoapVar($credentials, SOAP_ENC_OBJECT);

// Headers
$header = new SoapHeader($config["namespace"], "AuthenticationInfo", $authvalues, false);
$client->__setSoapHeaders(array($header));

// Response
$resp = array(
    "status" => "success"
);

// Request
$req = array();
try {
    // SOAP Request 
    $req = $client->logon($params); // Here is the WS Method you want to call.
    $resp["result"] = $req;
} catch(Exception $e) {
    $resp["status"] = "error";
    $resp["details"] = $e;
    $resp["result"] = $req;
    $resp["soap_form"] = $form;
}

echo json_encode($resp);
...