Bonjour,
J’ai un souci pour signer un xml que je dois envoyer à un webservice.
Sur SoapUI tout marche bien et j’arrive à avoir une réponse de mon serveur, mais dans mon script php je ne trouvepas le même hash SHA1. Et du coup je reçois une erreur…
Voici la requête :
<soapenv:Envelope xmlns:elc="http://schemas.datacontract.org/2004/07/toto" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body wsu:Id="id-C412303BE3B390B3D114265182390668" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<tem:SendMessage>
<tem:request>
<elc:XmlData><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<REMITTable1 xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<reportingEntityID>
<ace>Z99999999.CH</ace>
</reportingEntityID>
<contractList>
<contract>
<contractId>NA</contractId>
<contractName>BILCONTRACT</contractName>
<contractType>FW</contractType>
<energyCommodity>NG</energyCommodity>
<settlementMethod>P</settlementMethod>
<organisedMarketPlaceIdentifier>
<bil>XBIL</bil>
</organisedMarketPlaceIdentifier>
<contractTradingHours>
<startTime>00:00:00Z</startTime>
<endTime>24:00:00Z</endTime>
</contractTradingHours>
<deliveryPointOrZone>10YEU-EUROGAS--8</deliveryPointOrZone>
<deliveryStartDate>2014-08-01</deliveryStartDate>
<deliveryEndDate>2014-09-01</deliveryEndDate>
<loadType>GD</loadType>
<deliveryProfile>
<loadDeliveryStartTime>06:00:00</loadDeliveryStartTime>
<loadDeliveryEndTime>06:00:00</loadDeliveryEndTime>
</deliveryProfile>
</contract>
</contractList>
<TradeList>
<TradeReport>
<RecordSeqNumber>1</RecordSeqNumber>
<idOfMarketParticipant>
<ace>Y99999999.CH</ace>
</idOfMarketParticipant>
<traderID>
<traderIdForOrganisedMarket>Trader12345</traderIdForOrganisedMarket>
</traderID>
<otherMarketParticipant>
<lei>a1b2c3d4e5f6g7h8i9l0</lei>
</otherMarketParticipant>
<tradingCapacity>P</tradingCapacity>
<buySellIndicator>B</buySellIndicator>
<contractInfo>
<contractId>NA</contractId>
</contractInfo>
<organisedMarketPlaceIdentifier>
<bil>XBIL</bil>
</organisedMarketPlaceIdentifier>
<transactionTime>2014-07-15T10:27:00.000+02:00</transactionTime>
<uniqueTransactionIdentifier>
<uniqueTransactionIdentifier>K1W9M4K1T0T5</uniqueTransactionIdentifier>
</uniqueTransactionIdentifier>
<priceDetails>
<price>21</price>
<priceCurrency>EUR</priceCurrency>
</priceDetails>
<notionalAmountDetails>
<notionalAmount>156240</notionalAmount>
<notionalCurrency>EUR</notionalCurrency>
</notionalAmountDetails>
<quantity>
<value>10</value>
<unit>MW</unit>
</quantity>
<totalNotionalContractQuantity>
<value>7440</value>
<unit>MWh</unit>
</totalNotionalContractQuantity>
<actionType>N</actionType>
</TradeReport>
<TradeReport>
<RecordSeqNumber>2</RecordSeqNumber>
<idOfMarketParticipant>
<ace>Y99999999.CH</ace>
</idOfMarketParticipant>
<traderID>
<traderIdForOrganisedMarket>Trader12345</traderIdForOrganisedMarket>
</traderID>
<otherMarketParticipant>
<lei>a1b2c3d4e5f6g7h8i9l0</lei>
</otherMarketParticipant>
<tradingCapacity>P</tradingCapacity>
<buySellIndicator>B</buySellIndicator>
<contractInfo>
<contractId>NA</contractId>
</contractInfo>
<organisedMarketPlaceIdentifier>
<bil>XBIL</bil>
</organisedMarketPlaceIdentifier>
<transactionTime>2014-07-15T10:27:00.000+02:00</transactionTime>
<uniqueTransactionIdentifier>
<uniqueTransactionIdentifier>K1W9M4K1T0T5</uniqueTransactionIdentifier>
</uniqueTransactionIdentifier>
<priceDetails>
<price>21</price>
<priceCurrency>EUR</priceCurrency>
</priceDetails>
<notionalAmountDetails>
<notionalAmount>156240</notionalAmount>
<notionalCurrency>EUR</notionalCurrency>
</notionalAmountDetails>
<quantity>
<value>10</value>
<unit>MW</unit>
</quantity>
<totalNotionalContractQuantity>
<value>7440</value>
<unit>MWh</unit>
</totalNotionalContractQuantity>
<actionType>E</actionType>
</TradeReport>
</TradeList>
</REMITTable1>
]]></elc:XmlData>
</tem:request>
</tem:SendMessage>
</soapenv:Body>
</soapenv:Envelope>
Je dois calculer le hash sur le tag body, après avoir fait une canonisation en c14n.
Et là SoapUI trouve : xAK/FTSK4eyiM9vX2V6DV9fAi+E=
Et mon script : aN7y/rSiIKzgh+RJzqRAA1zb3KE=
Mon code pour le calcul
// hash function
private function base64SHA1($str) {
return base64_encode(sha1($str, true));
}
// Calcul le hash
private function setDigestValues() {
$doc = new DOMDocument();
$doc->loadXML($this->xml);
foreach($doc->getElementsByTagName('Body') as $elm) {
$this->data['BodyDigestValue'] = $this->base64SHA1($elm->C14N(true));
}
}
Merci d'avance :)
Afficher la suite
4 déc. 2015 à 12:12
base64_encode(sha1($str, true)) ?
8 déc. 2015 à 16:13