1

我正在尝试签署一个 XML 文件,并且在我提出的所有请求中都收到错误“哈希值不匹配”。

这是我的 XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://ws.hc2.dc.com/v1">
    <soapenv:Body wsu:Id="id-2DCB6C8D1D61184E481607306401918160" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <v1:consultarHC2>
            <v1:solicitud>
                <v1:clave>75URP</v1:clave>
                <v1:identificacion>888888881</v1:identificacion>
                <v1:primerApellido>PRUEBAS</v1:primerApellido>
                <v1:producto>64</v1:producto>
                <v1:tipoIdentificacion>1</v1:tipoIdentificacion>
                <v1:usuario>830514264</v1:usuario>
            </v1:solicitud>
        </v1:consultarHC2>
    </soapenv:Body>
</soapenv:Envelope>

这是在 SoapUI oyEmssDWuGqQejZ4krpKmv2/KJc=中计算的 DigestValu=但是在 PHP 中计算的值是BzmNrO3Pdl1R6I1MWHw/QG5cn08=

我的规范化 Body 元素 (c14n) 如下所示:

<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://ws.hc2.dc.com/v1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-2DCB6C8D1D61184E481607306401918160">            <v1:consultarHC2>              <v1:solicitud>                <v1:clave>75URP</v1:clave>                <v1:identificacion>888888881</v1:identificacion>                <v1:primerApellido>PRUEBAS</v1:primerApellido>                <v1:producto>64</v1:producto>                <v1:tipoIdentificacion>1</v1:tipoIdentificacion>                <v1:usuario>830514264</v1:usuario>              </v1:solicitud>            </v1:consultarHC2>          </soapenv:Body>

DigestValue 在 PHP 中计算如下:

//$data is equal to XML
$data = str_replace(["\r", "\n"], ['', ''], $data);
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadXML($data);
$bodyNode = $doc->getElementsByTagName('Body')->item(0);
$canonicalized = $bodyNode->C14N();
//OR
$canonicalized = $bodyNode->C14N(true);
//OR
$canonicalized = $bodyNode->C14N(false,false);
$digest = base64_encode(hash('SHA1', $canonicalized, true));
//OR
$digest = base64_encode(pack("H*", sha1($canonicalized)));

请告诉我我做错了什么,我需要帮助我还没有设法在 SoapUI 中获得生成的值。

4

0 回答 0