我们必须将SOAP Web服务集成到我们的PHP应用程序中(我们使用的是YII框架)。
我们需要通过这个API发送以下示例XML请求;
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ver="https://xmlns.customcompany.nl">
<soapenv:Body>
<companyName:RequestCompanyNameBreakDownAssistance>
<companyName:requestInfo>
<companyName:Product>
<companyName:BreakDownAssistanceProductType>Basic</companyName:BreakDownAssistanceProductType>
<companyName:ProductLanguage>NL</companyName:ProductLanguage>
<companyName:CoveredArea>NLPlusEurope</companyName:CoveredArea>
<companyName:HasCarReplacementCoverage>false</companyName:HasCarReplacementCoverage>
<companyName:HasTrailerAndCaravanCoverage>false</companyName:HasTrailerAndCaravanCoverage>
<companyName:LicensePlate>sfssffssf</companyName:LicensePlate>
<companyName:Brand>VOLVO</companyName:Brand>
<companyName:Model>V50</companyName:Model>
<companyName:ColorId>4</companyName:ColorId>
<companyName:FuelType>Diesel</companyName:FuelType>
<companyName:WeightKilogram>1316</companyName:WeightKilogram>
<companyName:BodyType>Combi</companyName:BodyType>
<companyName:VehicleInformationType>Car</companyName:VehicleInformationType>
<companyName:ConstructionYear>2006</companyName:ConstructionYear>
<companyName:ConstructionMonth>1</companyName:ConstructionMonth>
</companyName:Product>
<companyName:Contract>
<companyName:ProductIdentifier>SFSFSFF</companyName:ProductIdentifier>
<companyName:StartDate>2015-11-13</companyName:StartDate>
<companyName:PaymentTerm>Yearly</companyName:PaymentTerm>
<companyName:FormOfPayment>INC</companyName:FormOfPayment>
<companyName:OriginalRequestId>00000000-0000-0000-0000-000000000000</companyName:OriginalRequestId>
<companyName:ExternalReference/>
<companyName:PrefillRequestId>00000000-0000-0000-0000-000000000000</companyName:PrefillRequestId>
<companyName:IntermediaryCommissionDiscountPercentage>0</companyName:IntermediaryCommissionDiscountPercentage>
<companyName:IsIndexActive>false</companyName:IsIndexActive>
<companyName:CreateInvoiceWhenAccepted>false</companyName:CreateInvoiceWhenAccepted>
<companyName:CommercialProductType>NLPlusEurope</companyName:CommercialProductType>
<companyName:UnstructuredProductInfo></companyName:UnstructuredProductInfo>
</companyName:Contract>
<companyName:AnsweredFinalQuestions>
<companyName:FinalQuestion>
<companyName:QuestionId>MELDING01</companyName:QuestionId>
<companyName:Question>Zijn er bijzonderheden?</companyName:Question>
<companyName:QuestionDetails>Zijn er bijzonderheden?</companyName:QuestionDetails>
<companyName:QuestionAnswer>Yes</companyName:QuestionAnswer>
<companyName:QuestionAnswerDetails/>
</companyName:FinalQuestion>
</companyName:AnsweredFinalQuestions>
</companyName:requestInfo>
<companyName:entityInfo>
<companyName:Entities>
<companyName:ContractEntityInfo>
<companyName:CustomerNumber>20151100518456</companyName:CustomerNumber>
<companyName:LogicalId>20151100518456</companyName:LogicalId>
<companyName:ExternalCustomerNumber/>
<companyName:FirstName/>
<companyName:Prefix/>
<companyName:Initials/>
<companyName:Inserts/>
<companyName:LastName/>
<companyName:Suffix/>
<companyName:Nationality>NL</companyName:Nationality>
<companyName:PreferredLanguage>NL</companyName:PreferredLanguage>
<companyName:Gender>Legal</companyName:Gender>
<companyName:Phone>0123456678</companyName:Phone>
<companyName:Mobile/>
<companyName:Email>john@doe.com</companyName:Email>
<companyName:AllowEmailNotifications>true</companyName:AllowEmailNotifications>
<companyName:AllowMailings>false</companyName:AllowMailings>
<companyName:AllowSmsNotifications>false</companyName:AllowSmsNotifications>
<InformPhysically>false</InformPhysically>
<companyName:Address>
<companyName:Street>Street</companyName:Street>
<companyName:HouseNumber>1</companyName:HouseNumber>
<companyName:HouseNumberAddition/>
<companyName:City>Yew York</companyName:City>
<companyName:ZipCode>1234 AZ</companyName:ZipCode>
<companyName:CountryCode>NL</companyName:CountryCode>
<companyName:IsPostbus>false</companyName:IsPostbus>
</companyName:Address>
<companyName:ModificationState>Added</companyName:ModificationState>
<companyName:HasBusinessDetail>true</companyName:HasBusinessDetail>
<companyName:BusinessDetails>
<companyName:CompanyName>Company 1</companyName:CompanyName>
<companyName:KVKNumber/>
<companyName:CompanyAddress>
<companyName:Street>Street</companyName:Street>
<companyName:HouseNumber>1</companyName:HouseNumber>
<companyName:HouseNumberAddition/>
<companyName:City>New Yor</companyName:City>
<companyName:ZipCode>1234 AZ</companyName:ZipCode>
<companyName:CountryCode>NL</companyName:CountryCode>
<companyName:IsPostbus>false</companyName:IsPostbus>
</companyName:CompanyAddress>
</companyName:BusinessDetails>
<companyName:CrmStatus>Customer</companyName:CrmStatus>
<companyName:MaritalStatus>Unknown</companyName:MaritalStatus>
<companyName:NumberOfAdultsInFamily>0</companyName:NumberOfAdultsInFamily>
<companyName:NumberOfChildrenInFamily>0</companyName:NumberOfChildrenInFamily>
<companyName:BankAccountIBAN>IBAN</companyName:BankAccountIBAN>
<companyName:BankAccountOwner>John Doe</companyName:BankAccountOwner>
</companyName:ContractEntityInfo>
<companyName:ContractEntityInfo>
<companyName:CustomerNumber/>
<companyName:LogicalId>1</companyName:LogicalId>
<companyName:ExternalCustomerNumber/>
<companyName:FirstName>John</companyName:FirstName>
<companyName:Initials>J</companyName:Initials>
<companyName:Inserts></companyName:Inserts>
<companyName:LastName>Doe</companyName:LastName>
<companyName:Gender>Male</companyName:Gender>
</companyName:ContractEntityInfo>
</companyName:Entities>
<companyName:Roles>
<companyName:ContractRole>
<companyName:LogicalId>20151100518456</companyName:LogicalId>
<companyName:RoleCode>Ensured</companyName:RoleCode>
<companyName:OrderWithinRole>1</companyName:OrderWithinRole>
<companyName:ModificationState>Added</companyName:ModificationState>
</companyName:ContractRole>
<companyName:ContractRole>
<companyName:LogicalId>20151100518456</companyName:LogicalId>
<companyName:RoleCode>Owner</companyName:RoleCode>
<companyName:OrderWithinRole>1</companyName:OrderWithinRole>
<companyName:ModificationState>Added</companyName:ModificationState>
</companyName:ContractRole>
<companyName:ContractRole>
<companyName:LogicalId>1</companyName:LogicalId>
<companyName:RoleCode>Driver</companyName:RoleCode>
<companyName:OrderWithinRole>1</companyName:OrderWithinRole>
<companyName:ModificationState>Added</companyName:ModificationState>
</companyName:ContractRole>
</companyName:Roles>
</companyName:entityInfo>
<companyName:options>
<companyName:Credentials>
<companyName:UserId>username</companyName:UserId>
<companyName:PasswordHash>PasswordHash</companyName:PasswordHash>
<companyName:Affinity>AFF01</companyName:Affinity>
<companyName:TargetAffinity>conv01</companyName:TargetAffinity>
</companyName:Credentials>
<companyName:DisplayLanguage>NL</companyName:DisplayLanguage>
<companyName:RequestType>Request</companyName:RequestType>
</companyName:options>
</companyName:RequestCompanyNameBreakDownAssistance>
</soapenv:Body>
</soapenv:Envelope>
正如您所看到的,有使用的自定义名称空间,也有自定义数组的名称空间。
当我尝试使用PHP中的默认SoapClient发送此消息时,我会得到以下XML请求输出;
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://xmlns.customcompany.nl">
<SOAP-ENV:Body>
<ns1:RequestCompanyNameBreakDownAssistance/>
<param1><item>
<key>Entities</key>
<value>
<item>
<key>ContractEntityInfo</key>
<value>
<item>
<key>CustomerNumber</key>
<value/>
</item><item>
<key>LogicalId</key>
<value>1</value>
</item><item>
<key>ExternalCustomerNumber</key>
<value/>
</item><item>
<key>FirstName</key>
<value>John</value>
</item><item>
<key></key>
<value>J</value>
</item><item>
<key>Inserts</key>
<value/>
</item><item>
<key>LastName</key>
<value>Doe</value>
</item><item>
<key>Gender</key>
<value>Male</value>
</item>
</value>
</item><item>
<key>Roles</key>
<value><item>
<key>0</key>
<value><item>
<key>LogicalId</key>
<value>20151100994790</value>
</item><item>
<key>RoleCode</key>
<value>Ensured</value>
</item><item>
<key>OrderWithinRole</key>
<value>1</value>
</item><item>
<key>ModificationState</key>
<value>Added</value>
</item></value>
</item><item>
<key>1</key>
<value><item>
<key>LogicalId</key>
<value>20151100994790</value>
</item><item>
<key>RoleCode</key>
<value>Owner</value>
</item><item>
<key>OrderWithinRole</key>
<value>1</value>
</item><item>
<key>ModificationState</key>
<value>Added</value>
</item></value>
</item><item>
<key>3</key>
<value><item>
<key>LogicalId</key>
<value>1</value>
</item><item>
<key>RoleCode</key>
<value>Driver</value>
</item><item>
<key>OrderWithinRole</key>
<value>1</value>
</item><item>
<key>ModificationState</key>
<value>Added</value>
</item></value>
</item></value>
</item>
</value>
</item></param1>
<param2><item>
<key>Credentials</key>
<value><item>
<key>UserId</key>
<value>UserName</value>
</item><item>
<key>PasswordHash</key>
<value>PasswordHash</value>
</item><item>
<key>Affinity</key>
<value>AFF01</value>
</item><item>
<key>TargetAffinity</key>
<value>AFF02</value>
</item><item>
<key>DisplayLanguage</key>
<value>NL</value>
</item></value>
</item></param2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如何根据此Web服务所需的结构发送请求(代码示例1)?我需要自定义SoapClient来执行此操作吗?或者我可以使用附带的带有不同选项、名称空间和数组结构的PHP SoapClient吗?
谢谢。
我建议您使用nuSoap SOAP客户端。将其用于Yii Framework(在Yii 1.1.15上测试),将nusoap
文件夹复制到受保护的/供应商中,然后在您的代码中您可以探索您的自定义需求。这里有一个小样本:
Yii::import('application.vendors.nusoap.*');
require_once "lib/nusoap.php";
$client = new nusoap_client('YOUR_SOAP_URL_WITHOUT_WSDL_SUFFIX');
$result = $client->call('method_name', array('parameter_name' => $parameterValue));
我强烈建议您使用WSDL到PHP生成器,这样您就可以构建XML,而不必考虑如何实现,因为每个参数都将使用其PHP"镜像"类定义。如果你在一个元素中有多次相同类型的参数(例如几个companyName),那么你只需要创建一个多个companyName PHP对象的数组,然后将这个数组传递给父对象。
要做到这一点,您可以使用PackageGenerator,它应该可以工作并简化您的工作。
就我个人而言,我使用了nuSOAP或SoapClient,但它从来没有真正帮助理解如何构建请求!