Soap error, Encoding: object has no 'RecordId' property

元气小坏坏 提交于 2019-12-19 03:12:44

问题


I am doing a registration form online that connects to a soap web service and should be able to save payment information through it. The PHP is like this

    function create_member_fee()
      {
        $wsdl = 'WSDL LOCATION';
        $client = new mySoap($wsdl, array('trace' => 1));
        $request = array(
           'obj'=>array(
                  'Member'=>array('Number'=>$NUMBER),
                  'Amount'=>$PRICE,
                  'CreditCard'=>array(
                                'TComboBox_ARCreditCardType'=>$_POST['CT'],
                                'CardNumber'=>$_POST['CN'],
                                'ExpDate'=>mktime(0,0,0,$_POST['CM'],1,$_POST['CY']),
                                'SSNumber'=>$NUMBER_PAYER
                                )
             ),
           'opt'=>array('MemberAction'=>new SoapParam('_ActionInsert','ns1:TActionMethod'))
          );
        $result = $client->__call('CreateMemberFee',$request);
        return $result;
      }

And here is the WSDL function and complex types.

<message name="CreateMemberFee85Request">
<part name="obj" type="ns1:TMemberFee"/>
<part name="opt" type="ns1:TMemberFeeOptions"/>
</message>

<xs:complexType name="TMemberFee">
<xs:sequence>
<xs:element name="Member" type="ns1:TMemberV2"/>
<xs:element name="Payer" type="ns1:TPerson"/>
<xs:element name="ItemCode" type="xs:string"/>
<xs:element name="Amount" type="xs:double"/>
<xs:element name="CreditCard" type="ns1:TCreditCard"/>
<xs:element name="Saleperson" type="xs:string"/>
<xs:element name="ContactName" type="xs:string"/>
<xs:element name="DiscountPercent" type="xs:double"/>
<xs:element name="ReductionPayment" type="xs:double"/>
<xs:element name="DiscountValidUntil" type="xs:dateTime"/>
<xs:element name="PaymentTerm" type="xs:string"/>
<xs:element name="PaymentMode" type="xs:string"/>
<xs:element name="Memo" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="TMemberV2">
<xs:sequence>
<xs:element name="RecordID" type="xs:int"/>
<xs:element name="Number" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="SSNumber" type="xs:string"/>
<xs:element name="Address1" type="xs:string"/>
<xs:element name="Address2" type="xs:string"/>
<xs:element name="Address3" type="xs:string"/>
<xs:element name="Address4" type="xs:string"/>
<xs:element name="ZipCode" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="CountryCode" type="xs:string"/>
<xs:element name="CountryName" type="xs:string"/>
<xs:element name="CountyCode" type="xs:string"/>
<xs:element name="Phone" type="xs:string"/>
<xs:element name="PhoneLocal" type="xs:string"/>
<xs:element name="PhoneMobile" type="xs:string"/>
<xs:element name="PhoneFax" type="xs:string"/>
<xs:element name="Telex" type="xs:string"/>
<xs:element name="Email" type="xs:string"/>
<xs:element name="Password" type="xs:string"/>
<xs:element name="Group" type="xs:string"/>
<xs:element name="Tag" type="xs:string"/>
<xs:element name="SalesPerson" type="xs:string"/>
<xs:element name="Discount" type="xs:double"/>
<xs:element name="ItemReceivers" type="ns1:ArrayOfItemReceiver"/>
<xs:element name="Contacts" type="ns1:ArrayOfContacts"/>
<xs:element name="PaymentType" type="xs:string"/>
<xs:element name="CurrencyCode" type="xs:string"/>
<xs:element name="NoVat" type="xs:boolean"/>
<xs:element name="LedgerCode" type="xs:string"/>
<xs:element name="RecordCreated" type="xs:dateTime"/>
<xs:element name="RecordModified" type="xs:dateTime"/>
<xs:element name="Blocked" type="xs:boolean"/>
<xs:element name="Dead" type="xs:boolean"/>
<xs:element name="Retierd" type="xs:boolean"/>
<xs:element name="Disabled" type="xs:boolean"/>
<xs:element name="Points" type="xs:double"/>
<xs:element name="BankCode" type="xs:string"/>
<xs:element name="BankAccGroup" type="xs:string"/>
<xs:element name="BankAccount" type="xs:string"/>
<xs:element name="MemberSubGroups" type="ns1:ArrayOfMemberSubGroups"/>
<xs:element name="Carrer" type="ns1:ArrayOfMemberCarrer"/>
<xs:element name="Membership" type="ns1:ArrayOfMemberMemberships"/>
<xs:element name="Education" type="ns1:ArrayOfMemberEducations"/>
<xs:element name="Applications" type="ns1:ArrayOfMemberApplication"/>
<xs:element name="Funds" type="ns1:ArrayOfMemberFunds"/>
<xs:element name="CreditCard" type="ns1:TCreditCard"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="TPerson">
<xs:sequence>
<xs:element name="Number" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
<xs:element name="SSNumber" type="xs:string"/>
<xs:element name="Address1" type="xs:string"/>
<xs:element name="Address2" type="xs:string"/>
<xs:element name="Address3" type="xs:string"/>
<xs:element name="Address4" type="xs:string"/>
<xs:element name="ZipCode" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="CountryCode" type="xs:string"/>
<xs:element name="CountryName" type="xs:string"/>
<xs:element name="CountyCode" type="xs:string"/>
<xs:element name="Phone" type="xs:string"/>
<xs:element name="PhoneLocal" type="xs:string"/>
<xs:element name="PhoneMobile" type="xs:string"/>
<xs:element name="PhoneFax" type="xs:string"/>
<xs:element name="Email" type="xs:string"/>
<xs:element name="RecordCreated" type="xs:dateTime"/>
<xs:element name="RecordModified" type="xs:dateTime"/>
<xs:element name="Blocked" type="xs:boolean"/>
<xs:element name="Gender" type="ns1:TGender"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="TCreditCard">
<xs:sequence>
<xs:element name="CardType" type="ns2:TComboBox_ARCreditCardType"/>
<xs:element name="CardNumber" type="xs:string"/>
<xs:element name="ExpDate" type="xs:dateTime"/>
<xs:element name="SSNumber" type="xs:string"/>
<xs:element name="Name" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="TMemberFeeOptions">
<xs:sequence>
<xs:element name="MemberAction" type="ns1:TActionMethod"/>
</xs:sequence>
</xs:complexType>

<xs:simpleType name="TActionMethod">
<xs:restriction base="xs:string">
<xs:enumeration value="_ActionUse"/>
<xs:enumeration value="_ActionInsert"/>
<xs:enumeration value="_ActionEdit"/>
<xs:enumeration value="_ActionInsertEdit"/>
<xs:enumeration value="_ActionInsertMerge"/>
<xs:enumeration value="_ActionUseInsert"/>
</xs:restriction>
</xs:simpleType>

The error generated when calling create_member_fee() is like this

Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'RecordID' property in...

I am relatively new at PHP and im given this massive assignment to finish before the weekend, and frankly im at a loss, if anyone can help and tell me why this error is being generated i will be greatful. The $client->__getLastRequest() does not work so i dont know how the xml in the request looks like, wich makes my life more difficult.


回答1:


I just solved the problem, it was a matter of using objects instead of the huge and confusing array. You must hoewer not forget to map the objects exactly as they appear in the wsdl. And you must assign value to all of them in your instance, if emty just use ''. Here is my code.

    class TMemberV2 
        { 
            public $RecordID;
            public $Number;
            public $Name;
            public $SSNumber;
            public $Address1;
            public $Address2;
            public $Address3;
            public $Address4;
            public $ZipCode;
            public $City;
            public $CountryCode;
            public $CountryName;
            public $CountyCode;
            public $Phone;
            public $PhoneLocal;
            public $PhoneMobile;
            public $PhoneFax;
            public $Telex;
            public $Email;
            public $Password;
            public $Group;
            public $Tag;
            public $SalesPerson;
            public $Discount;
            public $ItemReceivers;
            public $Contacts;
            public $PaymentType;
            public $CurrencyCode;
            public $NoVat;
            public $LedgerCode;
            public $RecordCreated;
            public $RecordModified;
            public $Blocked;
            public $Dead;
            public $Retierd;
            public $Disabled;
            public $Points;
            public $BankCode;
            public $BankAccGroup;
            public $BankAccount;
            public $MemberSubGroups;
            public $Carrer;
            public $Membership;
            public $Education;
            public $Applications;
            public $Funds;
            public $CreditCard;
        } 

        class TCreditCard
        {
            public $CardType;
            public $CardNumber;
            public $ExpDate;
            public $SSNumber;
            public $Name;
        }

        class TMemberFee 
        { 
            public $Member;
            public $Payer;
            public $ItemCode;
            public $Amount;
            public $CreditCard;
            public $Saleperson;
            public $ContactName;
            public $DiscountPercent;
            public $DiscountValidUntil;
            public $PaymentTerm;
            public $PaymentMode;
            public $Memo;
        } 

        $member = new TMemberV2(); 
                $member->RecordID = $id;
                $member->Number = $kennitala;
                $member->Name = $nafn;
                $member->SSNumber = $kennitala;
                $member->Address1 = $heimilisfang;
                $member->Address2 = '';
                $member->Address3 = '';
                $member->Address4 = '';
                $member->ZipCode = $postnumer;
                $member->City = $sveitarfelag;
                $member->CountryCode = 'IS';
                $member->CountryName = 'Ísland';
                $member->CountryCode = 'IS';
                $member->Phone = $simanumer;
                $member->PhoneLocal = '';
                $member->PhoneMobile = $farsimi;
                $member->PhoneFax = '';
                $member->Telex = '';
                $member->Email = $netfang;
                $member->Password = '';
                $member->Group = '';
                $member->Tag = '';
                $member->SalesPerson = '';
                $member->Discount = '$';
                $member->ItemReceivers = '';
                $member->Contacts = '';
                $member->PaymentType = 'test';
                $member->CurrencyCode = '';
                $member->NoVat = '';
                $member->LedgerCode = '';
                $member->RecordCreated = '';
                $member->RecordModified = '';
                $member->Blocked = '';
                $member->Dead = '';
                $member->Retierd = '';
                $member->Disabled = '';
                $member->Points = '';
                $member->BankCode = '';
                $member->BankAccGroup = '';
                $member->BankAccount = '';
                $member->MemberSubGroups = '';
                $member->Carrer = '';
                $member->Membership = '';
                $member->Education = '';
                $member->Applications = '';
                $member->Funds = '';
                $member->CreditCard = '';

$creditCard = new TCreditCard();
        $creditCard->CardType = $_POST['CT'];
        $creditCard->CardNumber = $_POST['CN'];
        $creditCard->ExpDate = mktime(0,0,0,$_POST['CM'],1,$_POST['CY']);
        $creditCard->SSNumber = $kt_forradamanns;

        $memberFee = new TMemberFee();
        $memberFee->Member = $member;
        $memberFee->Payer = '';
        $memberFee->ItemCode = '';
        $memberFee->Amount = $namskeid_verd;
        $memberFee->CreditCard = $creditCard;
        $memberFee->Saleperson = '';
        $memberFee->ContactName = '';
        $memberFee->DiscountPercent = '';
        $memberFee->ReductionPayment = '';
        $memberFee->DiscountValidUntil = strtotime("now");
        $memberFee->PaymentTerm = '';
        $memberFee->PaymentMode = '';
        $memberFee->Memo = '';

$wsdl = 'SOME WSDL';
    $client = new mySoap($wsdl, array('trace' => 1));
    $param = new SoapParam($memberFee, 'ns1:TMemberFee');
    $param1 = new SoapParam('_ActionInsertEdit', 'ns1:TMemberFeeOptions');
        $result = $client->__call('CreateMemberFee',array('obj'=>$param, 'opt'=>$param1));



回答2:


The best way without having to declare classes is to use the stdClass. To make it work, preserve the name of the fields in your object and object properties.

    $TMemberFee = new stdClass();
    $TMemberV2 = new stdClass();
    ...
    $TMemberV2->RecordID = $id_holder_var;

    ...
    $TMemberFee->Member = $TMemberV2;
    ...

This worked for me, I hope it works for you.




回答3:


Define all the fields he's claiming as "Missing property"

So if you're using an array, and it says it's missing property 'GetData', do:

$requestArray['GetData'] = '';

and so on with each field, until it's working.




回答4:


I was once puzzeled by an error like this. It turned out the property wasn't missing in the request but in the response. The error message did not contain any specification.




回答5:


See also https://bugs.php.net/bug.php?id=50997 - it looks like you hit that bug - namely PHP seems to have problems with sequences when not using objects.



来源:https://stackoverflow.com/questions/7269268/soap-error-encoding-object-has-no-recordid-property

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!