如何在PHP中使用CDATA创建SOAP请求并将XML放入请求头
代码调整方案
核心问题说明
现有代码主要有3个导致请求失败的问题:
- 密码字符串使用双引号包裹,其中的
$符号会被PHP识别为变量前缀做解析,实际发送的密码值和预期不符 strEntrada参数使用XSD_ANYXML类型封装不符合接口要求,该参数本身是字符串类型的请求头,不需要指定为XML节点类型- 额外包裹的CDATA标签会导致接口接收的XML内容不符合格式要求,接口要求的是直接传入XML字符串,不需要额外套CDATA
修正后完整代码
<?php // 密码用单引号包裹,避免$被解析为变量 $TokenValue = array( 'usuario' => "WSEMPJALISCO", 'password' => 'AU77O$21', ); $providerConsultas = 'http://www5.abaseguros.com/PersonaConnect/PCRegistro.svc?wsdl'; $_clientConsultas = new SoapClient($providerConsultas, array('trace' => true, "exceptions" => true)); // 去掉外层的CDATA包裹,直接保留XML内容 $xml = '<XML> <DP> <TP>0</TP> <FISICA> <RFC>CARJ800701</RFC> <HCVE></HCVE> <PNOM>JORGE</PNOM> <SNOM>LEONARDO</SNOM> <APP>CARO</APP> <APM>RAMIREZ</APM> <SEXO>1</SEXO> <EDOCIVIL>1</EDOCIVIL> </FISICA> <DOMICILIO> <TIPODIR>1</TIPODIR> <CALLE>VALLE DEL YAQUI 2177</CALLE> <NUMEXT>350</NUMEXT> <NUMINT></NUMINT> <COL>PARQUES DE LA CA-ADA</COL> <CP>45720</CP> <POB>SALTILLO</POB> </DOMICILIO> <TELEFONO> <LADA>33</LADA> <NUMERO>26766476</NUMERO> </TELEFONO> <CELULAR> <LADA>33</LADA> <NUMERO>26766476</NUMERO> </CELULAR> <CORREO>LEONARDO.CARO@OUTLOOK.COM</CORREO> </DP> </XML>'; $headers = array(); $headers[] = new SoapHeader('http://tempuri.org/', 'Token', $TokenValue); // 直接传字符串即可,不需要用SoapVar封装为XSD_ANYXML $headers[] = new SoapHeader('http://tempuri.org/', 'strEntrada', $xml); $_clientConsultas->__setSoapHeaders($headers); try { $result = $_clientConsultas->ConsultaRegistraPersona(); $data = $result->strSalida; echo $data; // 调试时可以打开下方注释输出请求内容确认格式 // echo "REQUEST:\n" . $_clientConsultas->__getLastRequest() . "\n"; } catch (SoapFault $fault) { echo 'SoapFault exception: ', $fault->getMessage(), "\n"; // 调试时可以打开下方注释输出请求内容定位问题 // echo "REQUEST:\n" . $_clientConsultas->__getLastRequest() . "\n"; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } ?>
内容的提问来源于stack exchange,提问作者supernova
相关产品推荐
相关产品推荐

