2009-11-18 128 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