2012-05-29 42 views
3

我明白這個「對象引用沒有設置爲對象的實例」已經出現了很多,但我所看到的所有答案似乎都沒有幫助我。未將對象引用設置爲對象的實例。 php

這裏是我的WSDL:https://app.20-20insights.com/testepos/servicetrx.svc?wsdl

我想調用的BeginTrx()函數,但我得到一個錯誤。

任何意見或幫助,非常感謝。

謝謝, 馬丁。

設置TrxIdentifier對象

$trxIdentifier = new TrxIdentifier; 

$trxIdentifier->ClientId = 9372490002639296; 
$trxIdentifier->DeviceId = "123"; 
$trxIdentifier->OpId = "123"; 
$trxIdentifier->PosDescription = "123"; 
$trxIdentifier->PosId = "123"; 
$trxIdentifier->PosTxnId = "123"; 
$trxIdentifier->SiteId = "12312"; 
$trxIdentifier->Token = "3"; 
$trxIdentifier->TrxdateTime = new DateTime; 

進行電話...

$client = new SoapClient($wsdl, array('trace'=>true, 
'exceptions'=>true, 
'classmap'=>array('TrxIdentifier'=>"TrxIdentifier", 'MemberInfo'=>"MemberInfo", 'Response'=>"Response", 'MemberDetail'=>"MemberDetail"))); 

$response = $client->BeginTrx($trxIdentifier); 

錯誤:發生

Object reference not set to an instance of an object. 
a:InternalServiceFaultObject reference not set to an instance of an object.Object reference not set to an instance of an object. at CatalystSpsTrx.Contracts.Service.ServiceTrx.BeginTrx(MemberInfo& mem, TrxIdentifier conTrx) in C:\Projects\2010\CatTrxServices\CatalystSpsTrx.Contracts\Service\ServiceTrx.cs:line 38 
at _dynamic_CatalystSpsTrx.Contracts.Service.ServiceTrx.BeginTrx(Object , Object[]) 
at Spring.Reflection.Dynamic.SafeMethod.Invoke(Object target, Object[] arguments) 
at Spring.Aop.Framework.DynamicMethodInvocation.InvokeJoinpoint() 
at Spring.Aop.Framework.Adapter.AfterReturningAdviceInterceptor.Invoke(IMethodInvocation invocation) 
at Spring.Aop.Framework.Adapter.ThrowsAdviceInterceptor.Invoke(IMethodInvocation invocation) 
at CompositionAopProxy_d0e73463863e4ccd9c2db0a96530bd0d.BeginTrx(MemberInfo& mem, TrxIdentifier conTrx) 
at ServiceTrx.BeginTrx(MemberInfo& mem, TrxIdentifier conTrx) 
at SyncInvokeBeginTrx(Object , Object[] , Object[]) 
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)System.NullReferenceException 
+0

由服務器,而不是PHP產生的錯誤:

繼再次WSDL作爲,TrxIdentifier定義。您必須查看服務器代碼或通知API管理員您正在使用的服務。 – drew010

+0

謝謝,我給他們發了一封電子郵件,我正在等待他們回覆。 – Martin

回答

3

那錯誤,因爲你的輸入結構是錯誤的。您的WSDL說,它具有以這種方式被稱爲:

$response = $client->BeginTrx(array('trx' => $trxIdentifier)); 

看看的WSDL,這裏是服務BeginTrx根輸入定義:

<wsdl:message name="IServiceTrx_BeginTrx_InputMessage"> 
    <wsdl:part name="parameters" element="tns:BeginTrx"/> 
</wsdl:message> 

正如你所看到的,輸入是類型BeginTrx。如果按照WSDL,你會發現,被定義爲:

<xs:element name="BeginTrx"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="0" name="trx" nillable="true" type="tns:TrxIdentifier"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

所以你可以看到,BeginTrxtrx設置了一個param名稱和TrxIdentifier類型的值。

<xs:complexType name="TrxIdentifier"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="ClientId" type="xs:int"/> 
    <xs:element minOccurs="0" name="DeviceId" nillable="true" type="xs:string"/> 
    ................. 
    </xs:sequence> 
</xs:complexType> 
+0

嗨,那很好。它接受了我的要求。它確實給了我另一個錯誤,我不得不看看: 值'9372490002639296'不能被解析爲類型'Int32' 赦免我的無知,但你在WSDL中看到它必須被傳遞在使用'trx'? – Martin

+0

'ClientId'是一個32位整數,你傳遞的數字遠遠超過'2147483647'的最大值。如果您需要傳遞該號碼,服務提供商將不得不將數據類型更改爲字符串以避免32位限制。我解釋了'trx'的來源,看看我的第二個WSDL代碼片段。 – MrCode

+0

你是英雄我的好人! 非常感謝您的幫助。這非常感謝。 這個錯誤的最佳解釋我見過。 – Martin

相關問題