使用以下 Guzzle 调用我得到了成功的响应:
$client = new Client();
$body = '<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetAuthenticationToken xmlns="http://tempuri.org/"> <username>'. config('services.tmw.username') .'</username> <password>'. config('services.tmw.username') .'</password> <applicationName>testing</applicationName> </GetAuthenticationToken> </soap:Body> </soap:Envelope> ';
$wsdl = '*** MASKED URL ***Service.svc';
$res = $client->request('POST', $wsdl, [
'headers' => ['Content-Type' => 'text/xml; charset=utf-8', 'SOAPAction' => 'http://tempuri.org/IDRTrackWebService/GetAuthenticationToken'],
'body' => $body]);
$body = $res->getBody();
dd($body->getContents());
庆幸的是,这可行,但使用 SoapClient 会简单得多。所以我这样做了:
$svcUrl = '---MASKED URL ---Service.svc';
$wsdl = '---MASKED URL ---Service.svc?wsdl';
$client = new \SoapClient($wsdl, array('trace' => 1));
$params = new \stdClass();
$params->username = 'username';
$params->password = 'password';
$params->applicationName = 'testing';
$result = $client->__soapCall('GetAuthenticationToken', ['GetAuthenticationToken' => $params]);
dd($result);
我已经使用和不使用 ?wsdl 进行了测试,并且得到了相同的响应:
SOAP-错误:解析 WSDL:无法从“---MASKED URL ---Service.svc?wsdl”加载:无法加载外部实体“---MASKED URL ---Service.svc?wsdl”
如果我访问没有 ?wsdl 的 url,它会向我显示说明,如果我访问带有 ?wsdl 的 url,它会向我显示完整的 xml。
我还验证了 wsdl:service => port =>soap:address 与 $svcUrl 相同。 最后,我在 SoapUI 中进行了呼叫设置和运行,效果也很好。
我失去了理智,因为这应该可行。有任何想法吗?短暂性脑缺血发作。
我认为你需要使用一个数组来传递参数,然后将该数组包装在另一个数组中进行调用。试试这个:
$params = [
'username' => 'username',
'password' => 'password',
'applicationName' => 'testing',
]
$result = $client->__soapCall('GetAuthenticationToken', [$params]);
dd($result);
如果它有效,请现在告诉我们,因为我无法测试它,因为缺少“真实”网址。