因为项目要做为第三方应用接入其他平台,需要调用对方的java获取数据,于是对方给出web service接口文档,我方调用。
对方考虑到安全因素,需要WS的客户端在调用服务的时候,请求头需要包含一个验证信息,否则服务将不可访问。以前都是使用nusoap调用接口,但是发现不能封装请求头,于是转而采取php自带的soap接口,当然了,前提是要开启该扩展。由于以前没有这方面调用的经验,碰到一堆问题,其中遇到最多的是这个错误。
ns1:InvalidSecurity An error was discovered processing the header
public function ws() {
$xml = '
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>admin</wsse:Username>
<wsse:Password>PasswordText</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>';
$header = new SoapHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'CallbackHandler', new SoapVar($xml, XSD_ANYXML), TRUE);
$client = new SoapClient($wsdl);
$client->__setSoapHeaders(array($header));
}
【updated】
今天又遇到了一个问题
SoapFault exception: [soap:Server] Fault occurred while processing.
// 两个参数
$info = = turnObjectToArray($this->client->__call('checkUser', array(array('username' => 'username', 'pwd' => 'password'))));
// 没有参数
$info = turnObjectToArray($this->client->__call('getGrades', array()));
// 一个参数
$info = turnObjectToArray($this->client->__call('getUserTeachingClasses', array(array('userId' => $tv['id']))));
// 将object转为array
function turnObjectToArray($obj) {
$obj = is_object($obj) ? get_object_vars($obj): $obj;
foreach ($obj as $key => &$value) {
if (is_object($value) || is_array($value)) {
$value = turnObjectToArray($value);
}
}
return $obj;
}