php 调用webservice
一:首先安装soap扩展,其实用curl也可以,本质就是POST xml,不过此扩展是用C写的,封装了很多东西,性能也更好,使用更方便友好。
二:连接调用:
这里有个腾讯的webservice,点击
webservice地址:http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
请求参数:
1:通过方法名称直接调用:
try { $client = new \SoapClient('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl'); $result = $client->qqCheckOnline([ //调用方法,数组方式传参 'qqCode' => 1000000 ]); } catch (\Exception $e) { $e->getMessage() } $result = get_object_vars($result); //返回数组
2:通过__soapCall调用:
try { $client = new \SoapClient('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl'); $result = $client->__soapCall('qqCheckOnline', [ //调用方法,数组方式传参 ['qqCode' => 1000000] ]); } catch (\Exception $e) { $e->getMessage() }
3: 区别::
1:方法1 是直接通过方法名调用,方法2 也差不多,不过是个二维数组。
2:方法2 可以给单个接口添加 SOAP Header信息try { $client = new \SoapClient('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl'); //添加header $auth = array( 'UserName'=>'USERNAME', 'Password'=>'PASSWORD', 'SystemId'=> array('_'=>'DATA','Param'=>'PARAM'), ); $header = new SoapHeader('NAMESPACE','Auth',$auth,false); $client->__setSoapHeaders($header); //给所有接口添加 $result = $client->__soapCall('qqCheckOnline', [ //调用方法,数组方式传参 ['qqCode' => 1000000] ],null,$header); //单个接口添加,必须用 __soapCall } catch (\Exception $e) { $e->getMessage() }
4:还有种比较恶心的情况,垃圾server端必须要有 CDATA 端,那边才能接受数据,不能省略。而我们发送的都是数组,如:
qqCode可以用数组,但红框里面那玩意儿不行,这时候怎么办?可以用xml传输,这种情况必须要用到另外一个东西:
SoapVar
$xml = "'1000000']]>"; //把红框里面那玩意儿拼凑进来 $param = new \SoapVar($xml, XSD_ANYXML); //这样 $param = new \SoapVar([new \SoapVar($xml,XSD_ANYXML)],SOAP_ENC_OBJECT); //如果还不行,就这样 $result = $client->__soapCall('qqCheckOnline', ['parameters' => $param]);
三:https的问题
有一次对方的soap地址不是http,而是https,开始寡人以为很简单,不用改什么,后来这个问题搞了我几个小时,差点放弃怀疑人生。
$client = new \SoapClient($url); #我平时就这么干换成https后,报:Not Found
搜索了半天发现点有用的信息:
$client = new \SoapClient($url,['location' => $url]); //这样干就可以了,也就是加一个location参数,再定义一下地址老外的解释:I found the problem. The host I was trying to connect is redirecting to another domain name. For some reason, PHP 5.6 doesn't carry the location automatically. So i defined the same soap url in the location options.
但这里是用的php7.2,估计延续了这个问题。
这问题有懂行的,欢迎留言讨论!