我正在尝试使用SOAP / wsdl连接到web服务并进行身份验证,但我经常收到错误:
<b>Fatal error</b>: Uncaught SoapFault exception: [a:InternalServiceFault] Object reference not set to an instance of an object. in /path/install.php:16
以下是我目前的代码:
<?php
header("Content-Type: text/plain");
$userinfo = array(
'Username'=>'test',
'Password'=>'test'
);
$wsdl_url = 'https://ws-e-distribution.kmd.dk/standard/ServiceAutorisation/ServiceAutorisation.svc?wsdl';
$client = new SoapClient($wsdl_url);
print_r($client->__getFunctions());
print_r($client->__getTypes());
//This is the problematic line:
$response = $client->__soapCall('LogOn', array('LogOn' => $userinfo));
var_dump($response);
我已尝试过各种方法来包装我可以设想的用户名和密码参数,或者找到任何人建议:
stdClass
SoapVar
SoapParam
我尝试调用$client->__soapCall('LogOn', [milliontries])
以及$client->LogOn([milliontries])
......没有任何作用,请帮助。
更新
我终于设法得到了一个不同的错误(这表明至少我遇到了一些稍微错误的东西)。我的代码现在看起来像这样:
$response = $client->LogOn(array('logon' => array('Username' => 'test','Password' => 'test')));
这给了我一个关于LogOnType
不受支持的错误(丹麦语,这告诉我至少我现在有一些与服务器的连接)。用户名和密码数组无效,我可以替换空字符串并获得相同的结果,产生差异的是小写logon
。
如果有人可以设置一个给出错误incorrect username or password
的工作示例,我会永远感激...但任何指针都会非常感激。
据我所知,wsdl提供了执行此操作所需的所有信息,我只是[your_pick]
得到它太多了??
答案 0 :(得分:10)
令人难以置信!编写这16行代码只花了9个小时。
<?php
header("Content-Type: text/plain");
$userinfo = array(
'Username'=>'test',
'Password'=>'test'
);
$wsdl_url = 'https://ws-e-distribution.kmd.dk/standard/ServiceAutorisation/ServiceAutorisation.svc?wsdl';
$client = new SoapClient($wsdl_url, array('trace' => 1, "exception" => 0));
print_r($client->__getFunctions());
print_r($client->__getTypes());
//This actually works ! :) :) :)
$response = $client->LogOn(array('logon' => new SoapVar($userinfo, SOAP_ENC_OBJECT, 'LogOnUsername', 'http://schemas.datacontract.org/2004/07/WebServiceAutorisation.BL')));
var_dump($response);
我如此接近几次,结果发现命名空间(URL)是我遗漏的神奇位。在使用SoapVar
的所有尝试中,我一直在使用主wsdl中的命名空间(或根本没有命名空间)。
现在,关于登录的实际目的,可能不会更容易