SoapFault:元素 http://schemas.xmlsoap.org/soap/envelope/:Body 上没有 id 属性(代码 wsse:InvalidSecurity)

Posted

技术标签:

【中文标题】SoapFault:元素 http://schemas.xmlsoap.org/soap/envelope/:Body 上没有 id 属性(代码 wsse:InvalidSecurity)【英文标题】:SoapFault: No id attribute on element http://schemas.xmlsoap.org/soap/envelope/:Body (code wsse:InvalidSecurity) 【发布时间】:2020-01-07 02:07:49 【问题描述】:

我是 SOAP 新手,正在尝试使用 php 的内置 SoapClient 连接到 SOAP 服务器。我已经收到此错误好几天了,但没有找到任何解决方案。

这适用于 Linux 服务器。我尝试在 SoapHeaders 中包含时间戳并向请求中添加不同的参数,但仍然没有成功。

这是我的代码:

    $params = array(
        'X' => array(
            'Y' => '0',
            'Z' => '1',
            'Q' => array(
                'W' => array(
                    'E' => '1'
                )
            ),
            'R' => array(
                'T' => 3,
                'Y' => array(
                    'U' => 'x',
                    'I' => 'y'
                )
            ),
            'O' => array(
                'P' => '2'
            )
        ),
        'A' => array(
            'S' => array(
                'D' => 'H',
                'F' => 'J',
                'G' => 'K'
            )
        )
    );

    $client = new SoapClient( 'https://path-to-wsdl', array( 'trace' => 1 ) );

    $timestamp = gmdate("Y-m-d\TH:i:s\Z");
    $timestamp_expires = gmdate("Y-m-d\TH:i:s\Z", strtotime( '+1 hour' ) );


    $authHeader = new stdClass();
    $authHeader->Timestamp->Created = $timestamp;
    $authHeader->Timestamp->Expires = $timestamp_expires;
    $Headers[] = new SoapHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', $authHeader,TRUE);

    // $client->__setSoapHeaders($Headers);

    try
    
        $response = $client->SoapFunction( $params );
    
    catch( SoapFault $fault )
    
        echo 'Request : <br/><xmp>',
        $client->__getLastRequest(),
        '</xmp><br/><br/> Error Message : <br/>',
        $fault->getMessage();

        die;
    

我希望得到服务器的响应,但是却收到了这个错误代码:

元素http://schemas.xmlsoap.org/soap/envelope/:Body没有id属性

编辑:

代码wsse:InvalidSecurity

【问题讨论】:

请也分享 WSDL 文件。 这个问题可能会有所帮助***.com/questions/419563/… @JitendraYadav WSDL 文件是私有的,但也被其他公司使用(并且正在工作)。但不幸的是,没有很多关于它的文档 【参考方案1】:

authHeader 可能不是 stdClass。 尝试使用这个工具:

https://github.com/wsdl2phpgenerator/wsdl2phpgenerator

它将从您的 wsdl 文件中生成 PHP 类。 使用这些类可以更轻松地了解如何构建请求以及您需要发送什么。

【讨论】:

【参考方案2】:

我相信应该有一个与您正在调用的 SOAP API 相关联的证书安全性(.pem 文件)。一旦您将该证书路径与 SOAP 请求一起传递,它应该可以工作。

要在您的 SOAP 请求中添加证书,您只需修改您的 SOAP 调用,如下面的代码。

$client = new SoapClient( 'https://path-to-wsdl', array( 'trace' => 1, local_cert' => dirname(__FILE__) . '/certificatefile.pem'; ) );

【讨论】:

有趣,您能否更具体地使用 SOAP API URL 来检查调用 API 时是否有任何其他要求?

以上是关于SoapFault:元素 http://schemas.xmlsoap.org/soap/envelope/:Body 上没有 id 属性(代码 wsse:InvalidSecurity)的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 SoapFault 异常:HTTP 请求实体太大

SoapFault - faultcode:'SOAP-ENV:android中的异常

为啥在某些情况下会加密 WCF SoapFault 响应?

PHP / SOAP未捕获SoapFault异常:调用未定义的方法

解决SoapFault (looks like we got no XML document)问题

android长textview封面imageview