2009-11-18 59 views
0

如果我运行这个PHP肥皂是地狱

$HostTransactionInfo = new HostTransactionInfo(); // std Object 
$HostTransactionInfo->SecurenetID = $cc->merchant->data[$this->name]['secure_net_id']; 
$HostTransactionInfo->SecureKey = $cc->merchant->data[$this->name]['secure_key']; 
$HostTransactionInfo->Test = self::TEST; 

$securenet = new SoapClient(self::WSDL, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS)); 
$host_trans_info = new SoapVar($HostTransactionInfo, SOAP_ENC_OBJECT); 
var_dump($host_trans_info); 

$save = $securenet->Process_Save($host_trans_info); 

我收到这在每一个变化:“服务器无法处理请求--->未将对象引用设置到对象的实例。”

我SoapClient的:: __ getTypes()请求给了我这样的:

array(
[2] => struct HostTransactionInfo { 
string SecurenetID; 
string SecureKey; 
string Test; 
} 
[6] => struct Process_Save { 
HostTransactionInfo oTi; 
} 
) 

我SoapClient的:: __ getFunctions()请求给了我这样的:

array (
    [2] => Process_SaveResponse Process_Save(Process_Save $parameters) 
) 

没有人有任何线索,以什么我做错了?

+4

不要丢弃SOAP。 – 2009-11-18 01:07:10

回答

2

该错误由securenet webservice返回。为什么不联系他们的support

但是在任何情况下,服务器都应该返回比“对象引用未设置为对象实例”更多信息的消息。事实上,他们的代码在得到某些意外的输入时将空指针引用,这对于那些应该是“安全的”支付系统的东西来说并不是一个好兆头。

+0

然后什么都不能说,但你不知道它的一半。 – DampeS8N 2011-11-09 13:05:24

1

请检查被发送到服务器和XML响应的XML请求你回来:

// ... 
$securenet = new SoapClient(self::WSDL, array(
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS, 
    'trace' => true // that's important for the debugging methods to work 
)); 
// ... 
$save = $securenet->Process_Save($host_trans_info); 
var_dump($securenet-> __getLastRequestHeaders()); 
var_dump($securenet-> __getLastRequest()); 
var_dump($securenet-> __getLastResponseHeaders()); 
var_dump($securenet-> __getLastResponse()); 

这将有助于让你发生了什么事在电线上的概述。如果您可以排除任何与服务器相关的问题,那么错误很可能与未包含所需格式的XML-SOAP请求相关。

1

你好,这可能是迟到了原来的提问者,但任何人谁可能有同样的错误......

这是一招,当我与M $ .NET或C#(CVS工作我学到)或M $ SOAP服务器的其他任何味道... M $的东西改变的信封,这是哪里出了问题......

class MSSoapClient extends SoapClient { 
    function __doRequest($request, $location, $action, $version) { 
     $namespace = "http://tempuri.org/"; 

     $request = preg_replace('/<ns1:(\w+)/', '<$1 xmlns="'.$namespace.'"', $request, 1); 
     $request = preg_replace('/<ns1:(\w+)/', '<$1', $request); 
     $request = str_replace(array('/ns1:', 'xmlns:ns1="'.$namespace.'"'), array('/', ''), $request);   

     // parent call 
     return parent::__doRequest($request, $location, $action, $version); 
    } 
} 

这将纠正信封和纠正在大多数情况下错误。 ..看看变量$namespace = "http://tempuri.org/";确保这是基于WSDL文件是正确的

我不知道这是否会解决用户的错误,但它可能会帮助其他类似错误的人

+0

这是一个很好的技术。我已经将它应用于我使用过的其他实例。谢谢! – zmonteca 2011-05-12 20:03:24