PHP / DHL Soap 网络服务
PHP / DHL Soap Web service
我遇到了 DHL Soap Web 服务的问题。
我正在尝试使用基本网络服务 (getRateRequest) 创建测试请求,但总是收到有关身份验证的错误。
我认为问题与服务所需的 Soap 基本身份验证有关,
我尝试了不同的方法来完成身份验证,但都没有成功。
这是我的一些测试。
测试 1 - SoapClient 设置中的身份验证
$options = array(
'location' => $endpoint,
'login' => $userName,
'password' => $password,
'soap_version' => SOAP_1_1,
'trace' => 1,
'encoding' => 'utf-8',
'stream_context' => stream_context_create(['header'=> "Content-Type:text/xml"]),
);
$client = new SoapClient("https://wsbexpress.dhl.com:443/sndpt/expressRateBook?WSDL", $options);
并使用 __soapCall 发送请求,传递 soap 方法和一个包含所有参数的数组。
测试 2 - XML 请求中的身份验证(我不知道这是否可以使用 Soap)
<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">
<wsse:Username>'.$userName.'</wsse:Username>
<wsse:Password type="PasswordText">'.$password.'</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>' . date('Y-m-d H:i:s') . '</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
<soapenv:Header/>
并在 post 中使用带有 XML 的 CURL 发送请求。
我认为最好的方法是测试 1,但总是出现关于未授权用户的错误。
当然,我的资历很好,因为我可以使用 SoapUI 等外部工具测试 Soap 服务。我只是觉得我的身份验证有误。
提前致谢
我认为你混淆了一些东西。一开始你提到 Basic Authentication but then your XML example shows a WS-Security header。 Web 服务使用哪一个?
login
和 password
选项仅适用于基本身份验证,如 SoapClient documentation 所述。但是,如果您的服务需要 Ws-Security 作为 SOAP header,那么这将不起作用。
要使用 Ws-Security,您需要扩展 SoapClient 才能发送它,因为 SoapClient 不支持开箱即用的 WS-Security。参见示例:
我遇到了 DHL Soap Web 服务的问题。
我正在尝试使用基本网络服务 (getRateRequest) 创建测试请求,但总是收到有关身份验证的错误。
我认为问题与服务所需的 Soap 基本身份验证有关, 我尝试了不同的方法来完成身份验证,但都没有成功。
这是我的一些测试。
测试 1 - SoapClient 设置中的身份验证
$options = array(
'location' => $endpoint,
'login' => $userName,
'password' => $password,
'soap_version' => SOAP_1_1,
'trace' => 1,
'encoding' => 'utf-8',
'stream_context' => stream_context_create(['header'=> "Content-Type:text/xml"]),
);
$client = new SoapClient("https://wsbexpress.dhl.com:443/sndpt/expressRateBook?WSDL", $options);
并使用 __soapCall 发送请求,传递 soap 方法和一个包含所有参数的数组。
测试 2 - XML 请求中的身份验证(我不知道这是否可以使用 Soap)
<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">
<wsse:Username>'.$userName.'</wsse:Username>
<wsse:Password type="PasswordText">'.$password.'</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>' . date('Y-m-d H:i:s') . '</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
<soapenv:Header/>
并在 post 中使用带有 XML 的 CURL 发送请求。
我认为最好的方法是测试 1,但总是出现关于未授权用户的错误。 当然,我的资历很好,因为我可以使用 SoapUI 等外部工具测试 Soap 服务。我只是觉得我的身份验证有误。
提前致谢
我认为你混淆了一些东西。一开始你提到 Basic Authentication but then your XML example shows a WS-Security header。 Web 服务使用哪一个?
login
和 password
选项仅适用于基本身份验证,如 SoapClient documentation 所述。但是,如果您的服务需要 Ws-Security 作为 SOAP header,那么这将不起作用。
要使用 Ws-Security,您需要扩展 SoapClient 才能发送它,因为 SoapClient 不支持开箱即用的 WS-Security。参见示例: