(转)php的SOAP-CLIENT详解

一、概述
SOAP有大体两种模式WSDL模式和non-WSDL模式。WSDL模式访问的url中带有?wsdl,SoapClient在实例化的时候需要传入第一个参数。
无论是何种模式,方法的参数结构都需要根据服务端的要求填写。最好是服务端提供可正常请求的报文【即请求xml文件】。
还有一种比较直接的访问方式是用__doRequest(),直接用自己生成的报文请求,这是用来检验上述两种模式形成的报文是否合格的很好方式。
二、WSDL模式
 1 $wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';
 2 $params = array('track' => 1);
 3 $client = new SoapClient($wsdlUrl, $params = null);
 4 $methodParams = array(); // 为请求的参数,根据数据结构填写
 5 try {
 6      $resoponse = $client->method($methodParams);
 7      var_dump($response);
 8      file_put_contents('./log.txt', $client->__getLastRequest());
 9 } catch (SoapFault $e) {
10      print($e->getMessage);
11      file_put_contents('./log.txt', $client->__getLastRequest());
12 }

三、non-WSDL模式

 1 $params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',
 2     'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',
 3     'trace' => 1);  // location为不带?wsdl的地址,uri为targetNamespace
 4 $client = new SoapClient(null, $params = null);
 5 $methodParams = array(); // 为请求的参数,根据数据结构填写
 6 try {
 7      $resoponse = $client->__soapCall(method, $methodParams);
 8      var_dump($response);
 9      file_put_contents('./log.txt', $client->__getLastRequest());
10 } catch (SoapFault $e) {
11      print($e->getMessage);
12      file_put_contents('./log.txt', $client->__getLastRequest());
13 }

四、直接用已有报文请求

 1 $params = array('track' => 1);
 2 $client = new SoapClient(null, $params = null);
 3 try {
 4      $response = $client->__doRequest($xmlData, 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws', 'invEli', SOAP_1_2);
 5      var_dump($response);
 6      file_put_contents('./log.txt', $client->__getLastRequest());
 7 } catch (SoapFault $e) {
 8      print($e->getMessage);
 9      file_put_contents('./log.txt', $client->__getLastRequest());
10 }
五、SoapVar的使用
SoapVar可以用来设置数据类型,数据类型空间,节点名称,节点命名空间
 
六、示例说明
1、首先看一个请求地址:http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl (航天信息科技的测试地址)
直接在浏览器访问该地址可以看到如下xml信息:
 1 <wsdl:definitions xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.companyInterface.dzfp.fp.aisinogd.com" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com">
 2 <wsdl:types>
 3 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com">
 4 <xsd:complexType name="ElectroniceInfo">...</xsd:complexType>
 5 <xsd:complexType name="ArrayOfElectroniceDetail">...</xsd:complexType>
 6 <xsd:complexType name="ElectroniceDetail">...</xsd:complexType>
 7 <xsd:complexType name="ReturnElectronice">...</xsd:complexType>
 8 <xsd:complexType name="ElectroniceStock">...</xsd:complexType>
 9 </xsd:schema>
10 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com">...</xsd:schema>
11 </wsdl:types>
12 <wsdl:message name="invEliRequest">
13 <wsdl:part name="parameters" element="tns:invEli"/>
14 </wsdl:message>
15 <wsdl:message name="queryEliDataRequest">
16 <wsdl:part name="parameters" element="tns:queryEliData"/>
17 </wsdl:message>
18 <wsdl:message name="queryEliDataResponse">
19 <wsdl:part name="parameters" element="tns:queryEliDataResponse"/>
20 </wsdl:message>
21 <wsdl:message name="queryEliStockRequest">
22 <wsdl:part name="parameters" element="tns:queryEliStock"/>
23 </wsdl:message>
24 <wsdl:message name="sendToInvEliResponse">
25 <wsdl:part name="parameters" element="tns:sendToInvEliResponse"/>
26 </wsdl:message>
27 <wsdl:message name="queryEliStockResponse">
28 <wsdl:part name="parameters" element="tns:queryEliStockResponse"/>
29 </wsdl:message>
30 <wsdl:message name="sendToInvEliRequest">
31 <wsdl:part name="parameters" element="tns:sendToInvEli"/>
32 </wsdl:message>
33 <wsdl:message name="invEliResponse">
34 <wsdl:part name="parameters" element="tns:invEliResponse"/>
35 </wsdl:message>
36 <wsdl:portType name="IEliWebServicePortType">
37 <wsdl:operation name="invEli">
38 <wsdl:input name="invEliRequest" message="tns:invEliRequest"/>
39 <wsdl:output name="invEliResponse" message="tns:invEliResponse"/>
40 </wsdl:operation>
41 <wsdl:operation name="queryEliData">
42 <wsdl:input name="queryEliDataRequest" message="tns:queryEliDataRequest"/>
43 <wsdl:output name="queryEliDataResponse" message="tns:queryEliDataResponse"/>
44 </wsdl:operation>
45 <wsdl:operation name="queryEliStock">
46 <wsdl:input name="queryEliStockRequest" message="tns:queryEliStockRequest"/>
47 <wsdl:output name="queryEliStockResponse" message="tns:queryEliStockResponse"/>
48 </wsdl:operation>
49 <wsdl:operation name="sendToInvEli">
50 <wsdl:input name="sendToInvEliRequest" message="tns:sendToInvEliRequest"/>
51 <wsdl:output name="sendToInvEliResponse" message="tns:sendToInvEliResponse"/>
52 </wsdl:operation>
53 </wsdl:portType>
54 <wsdl:binding name="IEliWebServiceHttpBinding" type="tns:IEliWebServicePortType">
55 <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
56 <wsdl:operation name="invEli">
57 <wsdlsoap:operation soapAction=""/>
58 <wsdl:input name="invEliRequest">
59 <wsdlsoap:body use="literal"/>
60 </wsdl:input>
61 <wsdl:output name="invEliResponse">
62 <wsdlsoap:body use="literal"/>
63 </wsdl:output>
64 </wsdl:operation>
65 <wsdl:operation name="queryEliData">
66 <wsdlsoap:operation soapAction=""/>
67 <wsdl:input name="queryEliDataRequest">
68 <wsdlsoap:body use="literal"/>
69 </wsdl:input>
70 <wsdl:output name="queryEliDataResponse">
71 <wsdlsoap:body use="literal"/>
72 </wsdl:output>
73 </wsdl:operation>
74 <wsdl:operation name="queryEliStock">
75 <wsdlsoap:operation soapAction=""/>
76 <wsdl:input name="queryEliStockRequest">
77 <wsdlsoap:body use="literal"/>
78 </wsdl:input>
79 <wsdl:output name="queryEliStockResponse">
80 <wsdlsoap:body use="literal"/>
81 </wsdl:output>
82 </wsdl:operation>
83 <wsdl:operation name="sendToInvEli">
84 <wsdlsoap:operation soapAction=""/>
85 <wsdl:input name="sendToInvEliRequest">
86 <wsdlsoap:body use="literal"/>
87 </wsdl:input>
88 <wsdl:output name="sendToInvEliResponse">
89 <wsdlsoap:body use="literal"/>
90 </wsdl:output>
91 </wsdl:operation>
92 </wsdl:binding>
93 <wsdl:service name="IEliWebService">
94 <wsdl:port name="IEliWebServiceHttpPort" binding="tns:IEliWebServiceHttpBinding">
95 <wsdlsoap:address location="http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws"/>
96 </wsdl:port>
97 </wsdl:service>
98 </wsdl:definitions>
可以用$client->instance->__getFunctions()); 和$client->instance->__getTypes());方法输出需要请求的方法和携带的参数,但是参数结构是无法通过这里面的信息理清的,最好是能够有一份有效请求的xml。
 
2、再看一份有效请求的xml文件
  1 <?xml version="1.0" encoding="GB2312"?>
  2 <soapenv:Envelope xmlns:web="http://webservice.companyInterface.dzfp.fp.aisinogd.com" xmlns:pojo="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  3    <soapenv:Header/>
  4    <soapenv:Body>
  5       <web:invEli>
  6          <web:in0>
  7             <!--Optional:-->
  8             <pojo:BMB_BBH>1.0</pojo:BMB_BBH>
  9             <!--Optional:-->
 10             <pojo:BZ>测试水费发票</pojo:BZ>
 11             <!--Optional:-->
 12             <pojo:CHYY>冲红原因</pojo:CHYY>
 13             <!--Optional:-->
 14             <pojo:CZDM>10</pojo:CZDM>
 15             <!--Optional:-->
 16             <pojo:DDH>SF201600001</pojo:DDH>
 17             <!--Optional:-->
 18             <pojo:DKBZ>1</pojo:DKBZ>
 19             <!--Optional:-->
 20             <pojo:DSPTBM></pojo:DSPTBM>
 21             <!--Optional:-->
 22             <pojo:EMAIL></pojo:EMAIL>
 23             <!--Optional:-->
 24             <pojo:EWM></pojo:EWM>
 25             <!--Optional:-->
 26             <pojo:FHR></pojo:FHR>
 27             <!--Optional:-->
 28             <pojo:FPQQLSH>751300550901125</pojo:FPQQLSH>
 29             <!--Optional:-->
 30             <pojo:FPZT></pojo:FPZT>
 31             <!--Optional:-->
 32             <pojo:FP_DM></pojo:FP_DM>
 33             <!--Optional:-->
 34             <pojo:FP_HM></pojo:FP_HM>
 35             <!--Optional:-->
 36             <pojo:FP_MW></pojo:FP_MW>
 37             <!--Optional:-->
 38             <pojo:GHFQYLX></pojo:GHFQYLX>
 39             <!--Optional:-->
 40             <pojo:GHF_DZ></pojo:GHF_DZ>
 41             <!--Optional:-->
 42             <pojo:GHF_EMAIL></pojo:GHF_EMAIL>
 43             <!--Optional:-->
 44             <pojo:GHF_GDDH></pojo:GHF_GDDH>
 45             <!--Optional:-->
 46             <pojo:GHF_MC>凤凰新城项目部粤VSX018</pojo:GHF_MC>
 47             <!--Optional:-->
 48             <pojo:GHF_NSRSBH></pojo:GHF_NSRSBH>
 49             <!--Optional:-->
 50             <pojo:GHF_SF></pojo:GHF_SF>
 51             <!--Optional:-->
 52             <pojo:GHF_SJ></pojo:GHF_SJ>
 53             <!--Optional:-->
 54             <pojo:GHF_YHZH></pojo:GHF_YHZH>
 55             <!--Optional:-->
 56             <pojo:HJBHSJE>0</pojo:HJBHSJE>
 57             <!--Optional:-->
 58             <pojo:HJSE>0</pojo:HJSE>
 59             <!--Optional:-->
 60             <pojo:HY_DM></pojo:HY_DM>
 61             <!--Optional:-->
 62             <pojo:HY_MC></pojo:HY_MC>
 63             <!--Optional:-->
 64             <pojo:JQBH></pojo:JQBH>
 65             <!--Optional:-->
 66             <pojo:JYM></pojo:JYM>
 67             <!--Optional:-->
 68             <pojo:KPHJJE>127.36</pojo:KPHJJE>
 69             <!--Optional:-->
 70             <pojo:KPLX>1</pojo:KPLX>
 71             <!--Optional:-->
 72             <pojo:KPR>t</pojo:KPR>
 73             <!--Optional:-->
 74             <pojo:KPRQ></pojo:KPRQ>
 75             <!--Optional:-->
 76             <pojo:KPXM></pojo:KPXM>
 77             <!--Optional:-->
 78             <pojo:KP_NSRMC>新兴县供水工程管理处</pojo:KP_NSRMC>
 79             <!--Optional:-->
 80             <pojo:KP_NSRSBH>440001999999218</pojo:KP_NSRSBH>
 81             <!--Optional:-->
 82             <pojo:NSRDZDAH></pojo:NSRDZDAH>
 83             <!--Optional:-->
 84             <pojo:PYDM></pojo:PYDM>
 85             <!--Optional:-->
 86             <pojo:SJ></pojo:SJ>
 87             <!--Optional:-->
 88             <pojo:SKR></pojo:SKR>
 89             <!--Optional:-->
 90             <pojo:SWJG_DM></pojo:SWJG_DM>
 91             <!--Optional:-->
 92             <pojo:TSCHBZ>0</pojo:TSCHBZ>
 93             <!--Optional:-->
 94             <pojo:TSFS></pojo:TSFS>
 95             <!--Optional:-->
 96             <pojo:XHF_DH>020-22397388</pojo:XHF_DH>
 97             <!--Optional:-->
 98             <pojo:XHF_DZ>广州市珠江东路32号规划设计楼层39层全层(自编楼层41层全层)</pojo:XHF_DZ>
 99             <!--Optional:-->
100             <pojo:XHF_MC>0022</pojo:XHF_MC>
101             <!--Optional:-->
102             <pojo:XHF_NSRSBH>440001999999218</pojo:XHF_NSRSBH>
103             <!--Optional:-->
104             <pojo:XHF_YHZH>721158340233</pojo:XHF_YHZH>
105             <!--Optional:-->
106             <pojo:YFP_DM></pojo:YFP_DM>
107             <!--Optional:-->
108             <pojo:YFP_HM></pojo:YFP_HM>
109             <!--Optional:-->
110             <pojo:appId></pojo:appId>
111             <!--Optional:-->
112             <pojo:authorizationCode></pojo:authorizationCode>
113             <!--Optional:-->
114             <pojo:codeType></pojo:codeType>
115             <!--Optional:-->
116             <pojo:content></pojo:content>
117             <!--Optional:-->
118             <pojo:dataExchangeId></pojo:dataExchangeId>
119             <!--Optional:-->
120             <pojo:details>
121 
122 
123             <pojo:ElectroniceDetail><pojo:DW>66666</pojo:DW><pojo:GGXH>3333</pojo:GGXH><pojo:HSBZ>3333</pojo:HSBZ><pojo:LSLBS>3333</pojo:LSLBS><pojo:SE>0</pojo:SE><pojo:SL>0.17</pojo:SL><pojo:SPBM>10701010102</pojo:SPBM><pojo:XMBM>123321</pojo:XMBM><pojo:XMDJ>5.85</pojo:XMDJ><pojo:XMJE>126.36</pojo:XMJE><pojo:XMMC>3333</pojo:XMMC><pojo:XMSL>21.6</pojo:XMSL><pojo:YHZCBS>3333</pojo:YHZCBS><pojo:ZXBM>3333</pojo:ZXBM><pojo:ZZSTSGL>3333</pojo:ZZSTSGL><pojo:pcguid>3333</pojo:pcguid></pojo:ElectroniceDetail><pojo:ElectroniceDetail><pojo:DW>3333</pojo:DW><pojo:GGXH>3333</pojo:GGXH><pojo:HSBZ>3333</pojo:HSBZ><pojo:LSLBS>3333</pojo:LSLBS><pojo:SE>0</pojo:SE><pojo:SL>0.17</pojo:SL><pojo:SPBM>10701010102</pojo:SPBM><pojo:XMBM>123321</pojo:XMBM><pojo:XMDJ>1</pojo:XMDJ><pojo:XMJE>1</pojo:XMJE><pojo:XMMC>3333</pojo:XMMC><pojo:XMSL>1</pojo:XMSL><pojo:YHZCBS>3333</pojo:YHZCBS><pojo:ZXBM>3333</pojo:ZXBM><pojo:ZZSTSGL>3333</pojo:ZZSTSGL><pojo:pcguid>3333</pojo:pcguid></pojo:ElectroniceDetail></pojo:details>
124             <!--Optional:-->
125             <pojo:encryptCode/>
126             <!--Optional:-->
127             <pojo:interfaceCode/>
128             <!--Optional:-->
129             <pojo:passWord/>
130             <!--Optional:-->
131             <pojo:requestCode/>
132             <!--Optional:-->
133             <pojo:responseCode/>
134             <!--Optional:-->
135             <pojo:terminalCode/>
136             <!--Optional:-->
137             <pojo:userName/>
138             <!--Optional:-->
139             <pojo:version/>
140          </web:in0>
141       </web:invEli>
142    </soapenv:Body>
143 </soapenv:Envelope>

根据以上信息可以确定invEli的数据结构(需要ElectroniceInfo),我们以数组的形式展示如下:

 1 $methodParams = array('in0'=>array(
 2         'userName'=>'14410101',
 3         'passWord'=>'JWVFkqs7IP+++xBb1I9a/qr6/L/qYxyw==',
 4         'FPQQLSH'=>'435351536253',
 5         'DDH'=>'900122',
 6         'KP_NSRSBH'=>'9144060073757157XN',
 7         'KP_NSRMC'=>'即开即传企业',
 8         'DKBZ'=>'1',
 9         'XHF_NSRSBH'=>'9144060073757157XN',
10         'XHF_MC'=>'即开即传企业',
11         'XHF_DZ'=>'测试销方地址',
12         'XHF_DH'=>'02083191299',
13         'XHF_YHZH'=>'21321321321',
14         'GHF_MC'=>'测试购方企业',
15         'KPR'=>'开票员',
16         'KPLX'=>'2',
17         'CZDM'=>'20',
18         'YFP_DM'=>'044001507111',
19         'YFP_HM'=>'14514790',
20         'KPHJJE'=>-100.00,
21         'BZ'=>'备注',
22         'details'=>array(array(
23                 'XMMC'=>'测试商品',
24                 'DW'=>'个',
25                 'GGXH'=>'xxl',
26                 'XMBM'=>'123321',
27                 'XMSL'=>10.00,
28                 'XMDJ'=>10.00,
29                 'HSBZ'=>'1',
30                 'XMJE'=>100.00,
31                 'SL'=>'0.17',
32                 'SE'=>14.53
33         ))
34         )
35 );

3、利用WSDL模式写一个简单的请求

 1 $wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';
 2 $params = array('track' => 1);
 3 $client = new SoapClient($wsdlUrl, $params = null);
 4 try {
 5      $resoponse = $client->invEli($methodParams);
 6      var_dump($response);
 7      file_put_contents('./log.txt', $client->__getLastRequest());
 8 } catch (SoapFault $e) {
 9      print($e->getMessage);
10      file_put_contents('./log.txt', $client->__getLastRequest());
11 }

4、使用non-WSDL模式请求

 1 $params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',
 2     'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',
 3     'trace' => 1);  // location为不带?wsdl的地址,uri为targetNamespace
 4 $client = new SoapClient(null, $params = null);
 5 $methodParams = array(); // 为请求的参数,根据数据结构填写
 6 try {
 7      $resoponse = $client->__soapCall(method, $methodParams);
 8      var_dump($response);
 9      file_put_contents('./log.txt', $client->__getLastRequest());
10 } catch (SoapFault $e) {
11      print($e->getMessage);
12      file_put_contents('./log.txt', $client->__getLastRequest());
13 }
14 数组中每一个参数可以用SoapVar设置类型和命名空间和节点
15 如使用$this->FPQQLSH = new SoapVar($params['FPQQLSH'], XSD_STRING, 'string', null, null, 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'); //可将FPQQLSH设置成包含
16 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'作为前缀的节点。

转自:https://blog.csdn.net/godfy1990/article/details/54405871

posted @ 2018-06-07 09:45  顾遥  阅读(2008)  评论(0编辑  收藏  举报