php通过soap扩展调用WebService接口

本文中的PHP版本:PHP Version 7.4.13


都2022年了。。有的接口方还在提供WebService接口。。居然不是http的接口。。!!这不。。最近要跟一个第三方进行接口对接,但是。。人家第三方的接口是用.NET写的WebService接口,c#调用通过,现在需要使用php来进行调用,折腾了好久,参考了各种资料!!经过各种探索,相关的PHP调用webservice的过程如下:

打开php相关扩展:

soap.so(windows系统对应的扩展后缀为:.dll)该扩展必须要开启

curl.so(windows系统对应的扩展后缀为:.dll)该扩展必须要开启

openssl.so(windows系统对应的扩展后缀为:.dll)视情况而开启,如果webservice接口服务端 是https,则该扩展需要开启

第三方接口信息(由于隐私设置,只展示第三方接口的部分参数信息)

接口地址:http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx

1、accessCode参数:
公安:gongan
环保:huanbao
消防:xiaofang
应急:yingji
市场监管:shichangjianguan
城管:chengguan
 
2、inCodeInfo参数:test123

3、诉求提交接口
方法名称:SetAppealInterface(string accessCode,string inCodeInfo,string dataInfo)

入参:
string accessCode:加密的接入码
string inCodeInfo:校验码
string dataInfo:数据信息,格式如下
    <root><element des="信件信息">
    <attribute id="Title" des="标题">信件标题</attribute>
    <attribute id="username" des="网民用户名">网民用户名</attribute>
    <attribute id="address" des="地址">地址</attribute>
    <attribute id="email" des="邮箱">邮箱</attribute>
    <attribute id="mobile" des="手机">手机</attribute>
    </element>
    </root>
    

出参:
成功:唯一数据查询码(十位数字)
失败:0

php调用webserice接口代码如下:

//$client = new \SoapClient('http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx')

/*
注意:上面这样写会报:PHP Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: 
Couldn't load from 'http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx' : 
EndTag: '</' not found
*/ 

正确写法是 在webservice地址后面加上?wsdl 即:下面这个正确写法:
$client = new \SoapClient('http://192.168.148.149/MailWebServiceForZxy/ZfxxServiceForWebSite.asmx?wsdl');

//dataInfo参数比较多,这里我们单独使用一个变量来存储使用,注意:下面的xml串 不能有空格、换行
$datainfo_xml_str = '<root><element des="信件信息"><attribute id="Title" des="标题">测试标题</attribute><attribute id="username" des="网民用户名">test</attribute><attribute id="userid" des="网民用户id">123456</attribute><attribute id="sex" des="性别">1</attribute><attribute id="address" des="地址">测试地址</attribute><attribute id="email" des="邮箱">test@qq.com</attribute><attribute id="mobile" des="手机">13954569999</attribute></element></root>';

//参数这样传递 先包装一下
$param = array('accessCode' => 'huanbao', 'inCodeInfo' => 'test123', 'dataInfo' => $datainfo_xml_str);

//使用__soapCall()方法来进行调用
$p = $client->__soapCall('SetAppealInterface', array('parameters' => $param)); //参数1:是webservice中的方法名  参数2:是 往方法里面传入的具体参数

print_r($p->SetAppealInterfaceResult); //输出:2203284111(对应上面接口信息中的成功出参(10位数字))  当然了,这里也可以先输出一下变量$p,看看输出结果是什么

注意,在php调用某个方法后,其soap对象 就会自动产生一个对应的Result方法 用来显示调用结果,如 上面的 被调用端的WebService中的"SetAppealInterface"方法,调用端就有相应的"SetAppealInterfaceResult"方法。

关于php的soap扩展的缓存问题:

php对soap的wsdl默认是开启缓存的,缓存时间默认1天,如果对方的webservices接口中的几个方法是用来查询的话,那对我们就不友好了。。。假如说 第一次调用对方的接口,对方webservices接口返回 空数据,如果对方接口在1天之内修改了返回数据,那我们再去调用的话,就会拿不到对方接口最新的数据,因为上一次调用接口返回的 空数据 被php的soap扩展给缓存了,解决办法就是关闭缓存,关闭方式如下:


代码中临时更改:

ini_set("soap.wsdl_cache", 0);
ini_set("soap.wsdl_cache_enabled", 0);
ini_set("soap.wsdl_cache_ttl", 0);


php.ini配置文件中进行修改

soap.wsdl_cache=1(改为0)
soap.wsdl_cache_enabled=1(改为0)
soap.wsdl_cache_ttl=86400(改为0)

改完php.ini后不要忘记重启php 使配置生效

尾声

关于php的soap扩展还有好多相关内置方法及使用方式,可以自行查看php官网或网上搜索使用资料 来解锁php soap扩展的更多使用姿势~!


当然了。。不仅是只能调用.NET写的webservice接口。。也可以调用java写的webservice接口,不区分语言,只要符合webservice规范,php都可以调用




声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与
  1. 1楼
    便捷摄影工作室

    好牛,已测试

    2016-02-28 12:04:01 回复
  2. 2楼
    naive

    浏览器换了无数个都看不到密码

    2017-02-23 04:06:13 回复
    • King 作者

      @naive 现在已被屏蔽。我再放上去,我的网站就被屏蔽咯

      2017-02-24 01:46:37 回复

电子邮件地址不会被公开。 必填项已用 *标注

loading