Php SoapClient Soap-Env 有 'item' 和 'key' 个节点

Php SoapClient Soap-Env has 'item' and 'key' nodes

我在使用 php SoapClient 调用合作伙伴 soap 服务时遇到问题。他的wsdl是https://motrada.net/accounts/test.wsdl

当我将以下数据发送到 php SoapClient

    array (
  'Expert_Status' => 
  array (
    'ChassisNo' => '9998886NZ12345678',
    'MotradaIntVehicleNo' => '757169',
    'MotradaSalesId' => '209448',
    'MotradaWorkflowStatus' => '5-offer_preperation',
    'GrossPriceInclVATAutoi' => '20000',
    'DamageAmountInclVAT' => '1000',
    'MileageExpertise' => '234234',
    'Timestamp' => '2016-05-23T10:14:58+02:00',
  ),
)

php-SoapClient 发送以下请求:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <Expert-Request>
            <item>
                <key>Expert_Status</key>
                <value>
                    <item>
                        <key>ChassisNo</key>
                        <value>9998886NZ12345678</value>
                    </item>
                    <item>
                        <key>MotradaIntVehicleNo</key>
                        <value>757169</value>
                    </item>
                    ...   
                </value>
            </item>
        </Expert-Request>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

请求应如下所示

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <Expert_Status>
            <ChassisNo>9998886NZ12345678</ChassisNo>
            <MotradaIntVehicleNo>757169</MotradaIntVehicleNo>
            ...

我发送到 php SoapClient 的选项是:

array (
  'encoding' => 'UTF-8',
  'verifypeer' => false,
  'verifyhost' => false,
  'soap_version' => 'SOAP_1_1',
  'trace' => true,
  'exceptions' => true,
  'connection_timeout' => 10,
  'login' => 'MOTR_ALE',
  'password' => 'XXXXXXXX',
)

谁能帮我找出问题所在?

仔细查看给定的 WSDL 文件,其中写着:

<wsdl:message name="xmln.Bestand-Request">
    <wsdl:documentation/>
    <wsdl:part xmlns="" name="Bestand-Request" element="Bestand-Request"/>
</wsdl:message>
<wsdl:message name="xmln.Bestand-Response">
    <wsdl:documentation/>
    <wsdl:part xmlns="" name="Bestand-Response" element="Bestand-Response"/>
</wsdl:message>
<wsdl:message name="xmln.Expert-Request">
    <wsdl:part name="Expert-Request" element="Expert-Request"/>
</wsdl:message>
<wsdl:message name="xmln.Expert-Response">
    <wsdl:part name="Expert-Response" element="Expert-Response"/>
</wsdl:message>

你看出区别了吗?在前两部分定义中,有一个空属性 "xmlns",其他部分定义中缺少该属性。 通过此属性扩展这些部分,您应该可以开始了;)

嗯,你只需要从服务器发送答案作为对象

return json_decode(json_encode([
    'response' => [
        'status' => 0, 
        'result' => [
            'error' => [
                'code' => 1111,
                'message' => 'testme'
            ]
        ], 
    ]
]));