使用 PHP 使用此 SOAP 服务的正确方法

Right way to consume this SOAP service with PHP

我正在尝试通过 php 使用此 Web 服务。 首先,我需要调用 API 方法进行登录。 这是我的代码:

     try {
    $opts = array(
        'http' => array(
            'user_agent' => 'PHPSoapClient'
        )
    );
    $context = stream_context_create($opts);

    $wsdlUrl = 'http://172.20.2.18:1024/ADInterface/services/ModelADService?wsdl';

    $soapClientOptions = array(
        'stream_context' => $context,
        'cache_wsdl' => WSDL_CACHE_NONE);

    $checkVatParameters = array(
        'user'=>'WebService',
        'pass'=>'WebService',
        'lang'=>'es_CL',
        'ClientID'=>'1000000',
        'RoleID'=>'1000014',
        'OrgID'=>'1000000',
        'WarehouseID'=>'1000001',
        'stage'=>'0');

    $modelCrud = array(
        'serviceType' => 'WSBPartner',
        'TableName' => 'XX_WEB_WSBPartner',
        'RecordID' => 0,
        'Filter' => '',
        'Action' => 'Read',
        'DataRow' => array(
               'field' => array(
                   'type' => 'integer',
                   'column' => 'C_BPartner_ID',
                   'lval' => '',
                   'disp' => '',
                   'edit' => '',
                   'error' => '',
                   'errorVal' => '',
                   'val' => 1000643,
               )
           )
      );

    $client = new SoapClient($wsdlUrl, $soapClientOptions);

    $result = $client->queryData(
        'ModelCRUDRequest', array(
            'ModelCRUD' => $modelCrud,
            'ADLoginRequest' => $checkVatParameters,
        )
    );

    print_r($result);
}
catch(Exception $e) {
    echo $e->getMessage();
}

here's the error: Parameter ModelCRUDRequest does not exist!

我希望能够像 queryData 那样调用那些方法。我希望我解释得很好,这是我第一次使用网络服务。

有时 SoapClient 只是 "broken tool"。我会尝试使用 curl 或 Guzzle 作为 HTTP 客户端并手动构建 SOAP 请求。我用过SoapUI to generate a sample SOAP request according to the WSDL.

例子

<?php

// Change the url
$endpoint = 'http://172.20.2.18:1024/ADInterface/services/ModelADService';
$soapMethod = 'queryData';

// Basic Auth (optional)
$soapUser = ''.
$soapPassword = '';

// Created with SoapUI
$soap = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:adin="http://3e.pl/ADInterface">
   <soapenv:Header/>
   <soapenv:Body>
      <adin:queryData>
         <adin:ModelCRUDRequest>
            <adin:ModelCRUD>
               <adin:serviceType>?</adin:serviceType>
               <adin:TableName>?</adin:TableName>
               <adin:RecordID>?</adin:RecordID>
               <adin:Filter>?</adin:Filter>
               <adin:Action>?</adin:Action>
               <!--Optional:-->
               <adin:DataRow>
                  <!--Zero or more repetitions:-->
                  <adin:field type="?" column="?" lval="?" disp="?" edit="?" error="?" errorVal="?">
                     <adin:val>?</adin:val>
                     <!--Optional:-->
                     <adin:lookup>
                        <!--Zero or more repetitions:-->
                        <adin:lv val="?" key="?"/>
                     </adin:lookup>
                  </adin:field>
               </adin:DataRow>
            </adin:ModelCRUD>
            <adin:ADLoginRequest>
               <adin:user>?</adin:user>
               <adin:pass>?</adin:pass>
               <adin:lang>?</adin:lang>
               <adin:ClientID>?</adin:ClientID>
               <adin:RoleID>?</adin:RoleID>
               <adin:OrgID>?</adin:OrgID>
               <adin:WarehouseID>?</adin:WarehouseID>
               <adin:stage>?</adin:stage>
            </adin:ADLoginRequest>
         </adin:ModelCRUDRequest>
      </adin:queryData>
   </soapenv:Body>
</soapenv:Envelope>';

$headers = array(
    'Content-type: text/xml;charset="utf-8"',
    'Accept: text/xml',
    'Cache-Control: no-cache',
    'Pragma: no-cache',
    // Maybe change this url
    'SOAPAction: ' . $endpoint . '/' . $soapMethod,
    'Content-length: ' .strlen($soap),
); 

// PHP cURL for https connection with auth
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
// Basic Auth (optional)
curl_setopt($ch, CURLOPT_USERPWD, $soapUser. ':' .$soapPassword);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soap);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// Invoke request
$response = curl_exec($ch);
if($response === false) {
    echo 'HTTP error: ' . curl_error($ch);
    exit;
}

$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$xml = trim(substr($response, $headerSize));

curl_close($ch);

// Convert response to DOM document
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);

echo $dom->saveXML();