你是我最后的希望! 我试图在网站上实施DHL&S评级API。 他们向我发送了示例代码,我尝试使用演示凭证进入演示环境,并且工作正常。 稍后他们会更改端点网址并向我发送永久凭据。 之后,我无法使其发挥作用。我收到以下错误:
SOAP Fault!
FaultCode:WSDL FaultString:SOAP-ERROR:解析WSDL:无法加载 来自' https://wsbexpress.dhl.com:443/gbl/expressRateBook' : 失败 加载外部实体
我的PHP代码是这样的:
<?php
// The url of the service
$url='https://wsbexpress.dhl.com:443/gbl/expressRateBook';
// the soap operation which is called
$action='euExpressRateBook_providerServices_ShipmentHandlingServices_Binder_getRateRequest';
// the xml input of the service
$xmlrequest='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rat="http://scxgxtt.phx-dc.dhl.com/euExpressRateBook/RateMsgRequest">
<soapenv:Header>
<wsse:Security soapenv:mustunderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:id="UsernameToken-5" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<!-- ####Please use your test user credentials here#### -->
<wsse:Username>*************</wsse:Username>
<!-- ####Please use your test user credentials here#### -->
<wsse:Password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">*************</wsse:Password>
<wsse:Nonce encodingtype="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">eUYebYfsjztETJ4Urt8AJw==</wsse:Nonce>
<wsu:Created>2010-02-12T17:40:39.124Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
<soapenv:Header/>
<soapenv:Body>
<rat:RateRequest>
<RequestedShipment>
<DropOffType>REGULAR_PICKUP</DropOffType>
<Account>*********</Account>
<Currency>EUR</Currency>
<UnitOfMeasurement>SI</UnitOfMeasurement>
<Ship>
<Shipper>
<StreetLines>TEST SHIPPER</StreetLines>
<City>ALIMOS</City>
<PostalCode>174 55</PostalCode>
<CountryCode>GR</CountryCode>
</Shipper>
<Recipient>
<StreetLines>Main Street</StreetLines>
<City>GENEVA</City>
<PostalCode>1201</PostalCode>
<CountryCode>CH</CountryCode>
</Recipient>
</Ship>
<Packages>
<RequestedPackages number="1">
<Weight>
<Value>0.5</Value>
</Weight>
<Dimensions>
<Length>3</Length>
<Width>2</Width>
<Height>1</Height>
</Dimensions>
</RequestedPackages>
</Packages>
<ShipTimestamp>2015-12-28T00:01:00GMT+00:00</ShipTimestamp>
<Content>NON_DOCUMENTS</Content>
<PaymentInfo>DAP</PaymentInfo>
</RequestedShipment>
</rat:RateRequest>
</soapenv:Body>
</soapenv:Envelope>';
try {
// the soap client accepts options, we specify the soap version
// The trace option enables tracing of request so faults can be backtraced.
// The exceptions option is a boolean value defining whether soap errors throw exceptions of type SoapFault.
$options = array(
'soap_version'=>SOAP_1_1,
'exceptions'=>true,
'trace'=>1,
);
// create the soapclient and invoke __doRequest method
$client = new SoapClient($url, $options);
$output= $client->__doRequest($xmlrequest, $url, $action, 1);
}
catch (SoapFault $fault) {
echo "<h2>SOAP Fault!</h2><p>";
echo "FaultCode: {$fault->faultcode} <br/>";
echo "FaultString: {$fault->faultstring} <br/>";
echo("</p/>");
}
echo ("<h2>WSDL URL: </h2><p>");
echo ($url);
echo("</p/>");
echo ("<h2>Action: </h2><p>");
echo ($action);
echo("</p/>");
echo("<h2>XMLRequest: </h2><p>");
echo ($xmlrequest);
echo("</p/>");
if (!isset($output)) {
echo "<h2>SOAP Fault!</h2><p>";
echo "FaultCode: {$output->faultcode} <br/>";
echo "FaultString: {$output->faultstring} <br/>";
}else{
echo("<h2>Output: </h2><p>");
echo $output;
echo("</p/>");
}
?>
*********我的实际凭据。 如果我给出端点url
我得到了SOAP架构的响应。 你能帮忙找出什么是错的,我没有得到正确的回应吗?
答案 0 :(得分:0)
尝试尝试以下选项:
$opts = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$options = array (
'encoding' => 'UTF-8',
'verifypeer' => false,
'verifyhost' => false,
'soap_version' => SOAP_1_2,
'trace' => 1,
'exceptions' => 1,
'connection_timeout' => 180,
'stream_context' => stream_context_create($opts),
'cache_wsdl' => WSDL_CACHE_NONE,
//'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 1
);