使用PHP请求SOAP服务。请求XML只不过是相似的

时间:2015-02-16 15:37:43

标签: php xml soap

我正在使用送货上门服务,要求我使用SOAP在我们的网站内创建送货。我之前在PHP中使用过SOAP,它总是一次试错。大多数时候,由于缺乏文档。

下一个XML是他们发给我的,这是对他们服务器的有效SOAP请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:imp="http://localhost:7026/ImprimirECBWebService">
   <soapenv:Header/>
   <soapenv:Body>
      <imp:impresionIntegracionPDFConECBWS>
         <imp:in0>USUARIO</imp:in0>
         <imp:in1>PASWORD</imp:in1>
         <imp:in2><![CDATA[<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
   <exp>
                <bulto>
                    <ci>CLIENTE</ci>
                    <nif>NIF</nif>
                    <ccc>CCC SEUR</ccc>
                    <servicio>31</servicio>
                    <producto>2</producto>
                    <total_bultos>1</total_bultos>
                    <total_kilos>10</total_kilos>
                    <observaciones>Esto es una prueba29</observaciones>
                    <referencia_expedicion>115534</referencia_expedicion>
                    <ref_bulto>EPTTE_31</ref_bulto>
                    <clavePortes>F</clavePortes>
                    <claveReembolso/>
                    <valorReembolso/>
                    <nombre_consignatario>Xavi Lopez Gonzalez</nombre_consignatario>
                    <direccion_consignatario>Avd Torre Mateu n 93</direccion_consignatario>
                    <tipoVia_consignatario>AVD</tipoVia_consignatario>
                    <tNumVia_consignatario>N</tNumVia_consignatario>
                    <numVia_consignatario>93</numVia_consignatario>
                    <escalera_consignatario>.</escalera_consignatario>
                    <piso_consignatario>.</piso_consignatario>
                    <puerta_consignatario>.</puerta_consignatario>
                    <poblacion_consignatario>GETAFE</poblacion_consignatario>
                    <codPostal_consignatario>28905</codPostal_consignatario>
                    <pais_consignatario>ES</pais_consignatario>
                    <telefono_consignatario>937297800</telefono_consignatario>
                    <atencion_de>Xavi</atencion_de>
                    <test_preaviso>S</test_preaviso>
                    <test_reparto>N</test_reparto>
                    <test_email>S</test_email>
                    <email_consignatario>varela@trapido.e.telefonica.net</email_consignatario>

               </bulto>

             </exp>
          </root>
]]></imp:in2>

<imp:in3>fichero.xml</imp:in3>
<imp:in4>NIF</imp:in4>
<imp:in5>54</imp:in5>
<imp:in6>-1</imp:in6>
<imp:in7>MIFARMA</imp:in7>
      </imp:impresionIntegracionPDFConECBWS>
   </soapenv:Body>
</soapenv:Envelope>

...这就是我在PHP中尝试发送成功请求的原因:

<?php

class Seur
{

    public function createShipment($consignatario)
    {
        $data = [
            'cliente'               => Config::get('services.seur.client'),
            'nif'                   => Config::get('services.seur.nif'),
            'ccc'                   => Config::get('services.seur.ccc'),
            'servicio'              => '',
            'producto'              => '',
            'total_bultos'          => '',
            'total_kilos'           => '',
            'observaciones'         => '',
            'referencia_expedicion' => '',
            'referencia_bulto'      => '',
            'clave_portes'          => '',
            'consignatario'         => $this->processCosignatario($consignatario),
        ];

        $xml = View::make('seur.shipment', $data);

        try {
            $client = $this->getClient('ImprimirECBWebService?wsdl');
            $client->impresionIntegracionPDFConECBWS([
                'in0' => Config::get('services.seur.username'),
                'in1' => Config::get('services.seur.password'),
                'in2' => $xml->render(),
            ]);
        } catch (SoapFault $e) {
            File::put(storage_path('logs/soap-' . time() . '.log'), $client->__getLastRequest());

            throw $e;

        }
    }

    protected function getClient($endpoint)
    {
        $baseUrl = Config::get('services.seur.base_url');

        $options = [
            'ssl' => [
                'verify_peer'       => false,
                'allow_self_signed' => true
            ],
        ];

        $uri = $baseUrl . $endpoint;

        $client = new SoapClient(null, [
            'uri'          => $uri,
            'location'     => $uri,
            'cache_wsdl'   => WSDL_CACHE_NONE,
            'trace'        => true,
            'soap_version' => SOAP_1_2,
        ]);

        return $client;
    }

}

$consignatario = [
    'nombre'        => 'Lorem ipsum',
    'direccion'     => 'Test',
    'tipo_via'      => '',
    't_numero_via'  => '',
    'numero_via'    => 'Lorem',
    'escalera'      => '',
    'piso'          => 'Lorem',
    'puerta'        => '',
    'poblacion'     => 'Barcelona',
    'codigo_postal' => '08001',
    'pais'          => 'ES',
    'telefono'      => 'Lorem Ipsum',
    'email'         => 'loremipsum@example.org',
];

$seur = new Seur;
$shipment = $seur->createShipment($consignatario);

我得到的第一件事是错误的版本&#39;异常消息。我尝试过从SOAP_1_1切换到SOAP_1_2同样的事情。我从倾销的请求中看到的是,他们看起来并不像我给出的例子:

SOAP_1_1

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://citpre.seur.com/CIT-war/services/ImprimirECBWebService?wsdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:impresionIntegracionPDFConECBWS><param0 xsi:type="ns2:Map"><item><key xsi:type="xsd:string">in0</key><value xsi:type="xsd:string">wsecomm0810</value></item><item><key xsi:type="xsd:string">in1</key><value xsi:type="xsd:string">ws0810ecomm</value></item><item><key xsi:type="xsd:string">in2</key><value xsi:type="xsd:string">&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;root&gt;
    &lt;exp&gt;
        &lt;bulto&gt;
            &lt;ci&gt;example&lt;/ci&gt;
            &lt;nif&gt;lorem&lt;/nif&gt;
            &lt;ccc&gt;ccc&lt;/ccc&gt;
            &lt;servicio&gt;&lt;/servicio&gt;
            &lt;producto&gt;&lt;/producto&gt;
            &lt;total_bultos&gt;&lt;/total_bultos&gt;
            &lt;total_kilos&gt;&lt;/total_kilos&gt;
            &lt;observaciones&gt;&lt;/observaciones&gt;
            &lt;referencia_expedicion&gt;&lt;/referencia_expedicion&gt;
            &lt;ref_bulto&gt;&lt;/ref_bulto&gt;
            &lt;clavePortes&gt;&lt;/clavePortes&gt;
            &lt;claveReembolso/&gt;
            &lt;valorReembolso/&gt;
            &lt;nombre_consignatario&gt;Lorem Ipsum&lt;/nombre_consignatario&gt;
            &lt;direccion_consignatario&gt;Example&lt;/direccion_consignatario&gt;
            &lt;tipoVia_consignatario&gt;&lt;/tipoVia_consignatario&gt;
            &lt;tNumVia_consignatario&gt;&lt;/tNumVia_consignatario&gt;
            &lt;numVia_consignatario&gt;X&lt;/numVia_consignatario&gt;
            &lt;escalera_consignatario&gt;&lt;/escalera_consignatario&gt;
            &lt;piso_consignatario&gt;Y&lt;/piso_consignatario&gt;
            &lt;puerta_consignatario&gt;&lt;/puerta_consignatario&gt;
            &lt;poblacion_consignatario&gt;Barcelona&lt;/poblacion_consignatario&gt;
            &lt;codPostal_consignatario&gt;08001&lt;/codPostal_consignatario&gt;
            &lt;pais_consignatario&gt;ES&lt;/pais_consignatario&gt;
            &lt;telefono_consignatario&gt;123123123&lt;/telefono_consignatario&gt;
            &lt;atencion_de&gt;Lorem Ipsum&lt;/atencion_de&gt;
            &lt;test_preaviso&gt;S&lt;/test_preaviso&gt;
            &lt;test_reparto&gt;N&lt;/test_reparto&gt;
            &lt;test_email&gt;S&lt;/test_email&gt;
            &lt;email_consignatario&gt;loremipsum@example.org&lt;/email_consignatario&gt;
        &lt;/bulto&gt;
    &lt;/exp&gt;
&lt;/root&gt;
</value></item></param0></ns1:impresionIntegracionPDFConECBWS></SOAP-ENV:Body></SOAP-ENV:Envelope>

SOAP_1_2

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://citpre.seur.com/CIT-war/services/ImprimirECBWebService?wsdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
    <ns1:impresionIntegracionPDFConECBWS>
        <param0 xsi:type="ns2:Map">
            <item>
                <key xsi:type="xsd:string">in0</key>
                <value xsi:type="xsd:string">USERNAME</value>
            </item>
            <item>
                <key xsi:type="xsd:string">in1</key>
                <value xsi:type="xsd:string">PASSWORD</value>
            </item>
            <item>
                <key xsi:type="xsd:string">in2</key>
                <value xsi:type="xsd:string">&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;root&gt;
    &lt;exp&gt;
        &lt;bulto&gt;
            &lt;ci&gt;Lorem&lt;/ci&gt;
            &lt;nif&gt;Loprem Ipsum&lt;/nif&gt;
            &lt;ccc&gt;Lorem&lt;/ccc&gt;
            &lt;servicio&gt;&lt;/servicio&gt;
            &lt;producto&gt;&lt;/producto&gt;
            &lt;total_bultos&gt;&lt;/total_bultos&gt;
            &lt;total_kilos&gt;&lt;/total_kilos&gt;
            &lt;observaciones&gt;&lt;/observaciones&gt;
            &lt;referencia_expedicion&gt;&lt;/referencia_expedicion&gt;
            &lt;ref_bulto&gt;&lt;/ref_bulto&gt;
            &lt;clavePortes&gt;&lt;/clavePortes&gt;
            &lt;claveReembolso/&gt;
            &lt;valorReembolso/&gt;
            &lt;nombre_consignatario&gt;Lorem Ipsum&lt;/nombre_consignatario&gt;
            &lt;direccion_consignatario&gt;Lorem Ipsum&lt;/direccion_consignatario&gt;
            &lt;tipoVia_consignatario&gt;&lt;/tipoVia_consignatario&gt;
            &lt;tNumVia_consignatario&gt;&lt;/tNumVia_consignatario&gt;
            &lt;numVia_consignatario&gt;x&lt;/numVia_consignatario&gt;
            &lt;escalera_consignatario&gt;&lt;/escalera_consignatario&gt;
            &lt;piso_consignatario&gt;Y&lt;/piso_consignatario&gt;
            &lt;puerta_consignatario&gt;&lt;/puerta_consignatario&gt;
            &lt;poblacion_consignatario&gt;Barcleona&lt;/poblacion_consignatario&gt;
            &lt;codPostal_consignatario&gt;08001&lt;/codPostal_consignatario&gt;
            &lt;pais_consignatario&gt;ES&lt;/pais_consignatario&gt;
            &lt;telefono_consignatario&gt;Lorem ipsum&lt;/telefono_consignatario&gt;
            &lt;atencion_de&gt;Lorem ipsum&lt;/atencion_de&gt;
            &lt;test_preaviso&gt;S&lt;/test_preaviso&gt;
            &lt;test_reparto&gt;N&lt;/test_reparto&gt;
            &lt;test_email&gt;S&lt;/test_email&gt;
            &lt;email_consignatario&gt;loremipsum@example.org&lt;/email_consignatario&gt;
        &lt;/bulto&gt;
    &lt;/exp&gt;
&lt;/root&gt;
</value></item></param0></ns1:impresionIntegracionPDFConECBWS></SOAP-ENV:Body></SOAP-ENV:Envelope>

我不确定如何关注,客户端没有在PHP上运行示例。有关如何遵循的任何建议?

提前致谢!

1 个答案:

答案 0 :(得分:0)

测试你的肥皂要求:

<?php
if(isset($_POST['request'])){
    $XML = $_POST['request'];
    $URL = $_POST['url'];
    $ch = curl_init("$URL");
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_TIMEOUT, 60);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$XML);
    $result=curl_exec ($ch);
    curl_close($ch);
}
?>
<form method="post" style="margin: 0; padding: 0;">
    <input name='url' type="text" placeholder="URL here" value="<?php if(isset($_POST['url'])) echo $_POST['url']; ?>" style="height: 10%; width:90%">
    <button style="width: 9%; height: 10%;">LOAD SOAP</button>
    <div style="width: 49%; float:left;">
        <textarea style="width: 100%; height:89%;" placeholder='REQUEST HERE' name="request"><?php if(isset($_POST['request'])) echo $_POST['request']; ?></textarea>
    </div>
    <div style="width: 50%; display: inline;">
        <textarea placeholder="RESPONSE HERE" disabled="true" style="width: 50%; height: 40%;"><?php if(isset($result)) echo strtok($result, '<'); ?></textarea>
        <textarea placeholder="RESPONSE HERE" disabled="true" style="width: 50%; height: 49%;"><?php if(isset($result)) $config = array('indent'=>true,'output-xml'=>true,'input-xml'=> true); $tidyxml = new tidy; $tidyxml->parseString(strstr($result, '<'), $config, 'utf8'); echo $tidyxml;?></textarea>
    </div>
</form>