php SoapClient override __dorequest在str_replace之后不更改xml

1bqhqjot  于 2022-12-02  发布在  PHP
关注(0)|答案(2)|浏览(161)

我重写了phpSoapClient类,以便向元素添加一个属性。XML似乎已按预期更改,但在通过__getLastRequest查看XML时()XML看起来一点都没有改变。在代码中我试着给元素添加一个属性。也许有人知道为什么$request_new XML字符串没有发送到服务器?(OutputXML()只是一些很好的格式,可以转换为html)

class SoapClientDebug extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        // change / add whatever needed
        $request_new = str_replace( '<env:Body', '<env:Body ns1:Id="TheBody"', $request );
        // debug out
        OutputXML($request_new);
        // calling parent
        return parent::__doRequest($request_new, $location, $action, $version, $one_way);
    }
}

在调用parent__doRequest之前检查输出的XML

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://logius.nl/digipoort/koppelvlakservices/1.2/" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://schemas.xmlsoap.org/soap/security/2000-12">
 <env:Header>
  <ns3:Security env:mustUnderstand="true">
   <ns2:Signature>
    <ns2:SignedInfo>
     <ns2:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    <ns2:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
   <ns2:Reference>
    <ns2:Transforms>
     <ns2:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    </ns2:Transforms>
   <ns2:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
  <ns2:DigestValue>$6hpmccmjxQmAI143OhQfIWpkryw=</ns2:DigestValue>
   </ns2:Reference>
  </ns2:SignedInfo>
 <ns2:SignatureValue>sv8n4h0rV4Xmbl+M+w+MLl7lVA8KFsoWRx5DqSKkwSie32jOFoJt0WvH6UWRQI</ns2:SignatureValue>
  <ns2:KeyInfo>
   <ns2:X509Data>
    <ns2:X509IssuerName>CN=TestSignCert</ns2:X509IssuerName>
     <ns2:X509SerialNumber>75496503122422458150193540449068096025</ns2:X509SerialNumber>
      </ns2:X509Data>
     </ns2:KeyInfo>
    </ns2:Signature>
   </ns3:Security>
  </env:Header>
 <env:Body ns1:Id="TheBody">
  <ns1:aanleverRequest>
   <ns1:berichtsoort>Omzetbelasting</ns1:berichtsoort>
    <ns1:aanleverkenmerk>Happyflow</ns1:aanleverkenmerk>
     <ns1:identiteitBelanghebbende>
      <ns1:nummer/>
     <ns1:type/>
    </ns1:identiteitBelanghebbende>
   <ns1:rolBelanghebbende>Intermediair</ns1:rolBelanghebbende>
    <ns1:berichtInhoud>
     <ns1:mimeType/>
    <ns1:bestandsnaam/>
   <ns1:inhoud/>
  </ns1:berichtInhoud>
 <ns1:autorisatieAdres>https://secure.inepd.nl/inloon</ns1:autorisatieAdres>
  </ns1:aanleverRequest>
 </env:Body>
</env:Envelope>

通过__getLastRequest查看XML

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://logius.nl/digipoort/koppelvlakservices/1.2/" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://schemas.xmlsoap.org/soap/security/2000-12">
 <env:Header>
  <ns3:Security env:mustUnderstand="true">
   <ns2:Signature>
    <ns2:SignedInfo>
     <ns2:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    <ns2:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
   <ns2:Reference>
    <ns2:Transforms>
     <ns2:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    </ns2:Transforms>
   <ns2:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
  <ns2:DigestValue>$6hpmccmjxQmAI143OhQfIWpkryw=</ns2:DigestValue>
   </ns2:Reference>
  </ns2:SignedInfo>
 <ns2:SignatureValue>sv8n4h0rV4Xmbl+M+w+MLl7lVA8KFsoWRx5DqSKkwSie32jOFoJt0WvH6UWRQI</ns2:SignatureValue>
  <ns2:KeyInfo>
   <ns2:X509Data>
    <ns2:X509IssuerName>CN=TestSignCert</ns2:X509IssuerName>
     <ns2:X509SerialNumber>75496503122422458150193540449068096025</ns2:X509SerialNumber>
      </ns2:X509Data>
     </ns2:KeyInfo>
    </ns2:Signature>
   </ns3:Security>
  </env:Header>
 <env:Body>
  <ns1:aanleverRequest>
   <ns1:berichtsoort>Omzetbelasting</ns1:berichtsoort>
    <ns1:aanleverkenmerk>Happyflow</ns1:aanleverkenmerk>
     <ns1:identiteitBelanghebbende>
      <ns1:nummer/>
     <ns1:type/>
    </ns1:identiteitBelanghebbende>
   <ns1:rolBelanghebbende>Intermediair</ns1:rolBelanghebbende>
    <ns1:berichtInhoud>
     <ns1:mimeType/>
    <ns1:bestandsnaam/>
   <ns1:inhoud/>
  </ns1:berichtInhoud>
 <ns1:autorisatieAdres>https://secure.inepd.nl/inloon</ns1:autorisatieAdres>
  </ns1:aanleverRequest>
 </env:Body>
</env:Envelope>
os8fio9y

os8fio9y1#

我想出了为什么,这可能是一个有点奇怪的回答我自己的问题,但也许它可能会帮助别人在未来;在这种情况下,__getLastRequest()不是实际的最后一个请求,所以覆盖__doRequest是一个选项,但在这种情况下不要使用__getLastRequest!

rhfm7lfc

rhfm7lfc2#

正如您所发现的,__getLastRequest()返回发送到__do_Request()的请求,而不是通过网络发出的请求...
您有两个选择:
a)覆盖__getLastRequest(除了__doRequest之外)
B)向__doRequest方法添加几行代码,以更新SoapClient的私有__last_request属性

if (PHP_VERSION_ID >= 80100) {
        $lastRequestRef = new \ReflectionProperty('SoapClient', '__last_request');
        $lastRequestRef->setAccessible(true);
        $lastRequestRef->setValue($this, $modifiedRequest);
    } else {
        $this->__last_request = $modifiedRequest;
    }

相关问题