道者编程

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,估计延续了这个问题。

这问题有懂行的,欢迎留言讨论!



最新评论:
1楼 日本 发表于 2022-05-05 15:18:12
牛牛牛
共有 1 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚