使用PHP Curl调用SOAP接口获取Token返回空值,请求排查问题
排查PHP Curl发送SOAP请求返回空的问题
1. 先排查Curl底层错误信息
你的代码定义了$err但未输出,第一步要打印Curl错误和HTTP状态码,直接定位连接或请求层面的问题:
$result = curl_exec($soap_do); $err = curl_error($soap_do); $http_code = curl_getinfo($soap_do, CURLINFO_HTTP_CODE); var_dump($err); var_dump($http_code); curl_close($soap_do); // 务必关闭Curl句柄释放资源
如果出现SSL相关错误,不建议直接禁用CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST,测试环境可临时保留,但优先根据错误提示配置正确CA证书。
2. 修正SOAP请求XML格式
你的$post_string里XML实体被转义成<、",且存在多余换行缩进,会导致SOAP服务器无法解析。直接用单引号包裹原始XML避免转义:
$post_string = '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/"> <soap:Header/> <soap:Body> <tem:GetToken> <tem:WebChanelID>8</tem:WebChanelID> <tem:AccessCode>444555</tem:AccessCode> </tem:GetToken> </soap:Body> </soap:Envelope>';
3. 修复Content-Length计算问题
strlen($post_string)处理多字节字符时可能不准确,且XML多余空白会导致长度计算错误。可以去掉XML冗余空白,或用mb_strlen精准计算:
curl_setopt($soap_do, CURLOPT_HTTPHEADER, [ 'Content-Type: text/xml; charset=utf-8', 'Content-Length: ' . mb_strlen($post_string, 'UTF-8') ]);
也可以直接省略手动设置Content-Length,Curl会自动计算,避免人为错误。
4. 添加SOAPAction请求头
多数SOAP服务要求必须携带SOAPAction头,根据你的命名空间,添加对应头信息:
curl_setopt($soap_do, CURLOPT_HTTPHEADER, [ 'Content-Type: text/xml; charset=utf-8', 'SOAPAction: "http://tempuri.org/GetToken"' ]);
注意部分服务的SOAPAction不需要引号,可参考目标WSDL的定义调整。
5. 确认请求URL正确性
你当前请求的是WSDL文件地址,但SOAP请求应发送到SOAP endpoint地址。访问https://hma.ecvi.ru/service/webform.wsdl.php,查看其中<soap:address location="..." />节点,获取正确的请求URL替换现有地址。
6. 开启调试模式查看请求详情
开启Curl verbose模式,打印实际发送的请求内容,确认是否符合预期:
curl_setopt($soap_do, CURLOPT_VERBOSE, true); $verbose = fopen('php://temp', 'w+'); curl_setopt($soap_do, CURLOPT_STDERR, $verbose); // 执行请求后输出调试日志 rewind($verbose); $verbose_log = stream_get_contents($verbose); echo "请求调试日志:\n" . $verbose_log;
内容的提问来源于stack exchange,提问作者Sergei
相关产品推荐
相关产品推荐

