尝试SOAP调用时,对象引用未设置为对象错误的实例

时间:2014-07-04 12:47:49

标签: php soap wsdl

我正在尝试使用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
  • 使用简单数组
  • double wrapped array
  • 以上的很多组合。

我尝试调用$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]得到它太多了??

1 个答案:

答案 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中的命名空间(或根本没有命名空间)。

现在,关于登录的实际目的,可能不会更容易