PHP发送SOAP API请求返回无效凭证,SOAPUI请求正常如何排查解决
问题排查及解决方案
一、无效凭证报错的常见原因
- 未添加接口要求的身份认证信息:大部分SOAP接口的用户名密码要么放在SOAP Header里,要么走HTTP Basic Auth,你当前的代码里这两类认证逻辑都没有配置。SOAPUI中你应该已经提前配置过认证信息,所以请求可以正常运行,PHP代码未配置就会返回校验失败。
- AES加密逻辑和接口要求不一致:你当前使用的AES-128-ECB模式,
openssl_encrypt默认会对明文做PKCS7填充,如果接口要求的是0填充或者其他填充规则,加密出来的tokencode就不匹配,自然会触发凭证校验错误。 - 缺失SOAPAction请求头:绝大多数SOAP接口要求请求头里携带
SOAPAction字段,值对应你调用的接口方法名,你当前的请求头没有添加该参数,也可能导致请求识别异常。
二、更稳定的实现方案
优先使用PHP原生的SoapClient类实现,比手动拼接XML+curl的出错概率低很多,参考代码如下:
<?php $webservice_url = 'https://rsaauthweb.mtn.com.ng/AuthServices/RSAServices?WSDL'; // 替换为接口文档给出的用户名、密码 $api_username = '接口分配的用户名'; $api_password = '接口分配的密码'; $options = [ 'trace' => true, 'exceptions' => true, 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], // 如果接口要求走HTTP Basic Auth,取消注释下面两行 // 'login' => $api_username, // 'password' => $api_password, ]; try { $client = new SoapClient($webservice_url, $options); // 如果接口要求用户名密码放在SOAP Header中,取消注释下面的代码,节点名替换为接口要求的名称 /* $authHeader = new SoapHeader( 'http://service.mtn.rsa.jojief.com/', 'AuthHeader', [ 'username' => $api_username, 'password' => $api_password ] ); $client->__setSoapHeaders($authHeader); */ // 加密逻辑建议先和接口提供方确认填充、编码规则再调整 $tokenData = '666'; $key = 'fgghhj6T1E54567'; $encryptData = openssl_encrypt($tokenData, 'AES-128-ECB', $key, OPENSSL_RAW_DATA); $tokencode = base64_encode($encryptData); $requestParams = [ 'request' => [ 'userId' => 'faketest', 'passcode' => $tokencode ] ]; $response = $client->authenticateUser($requestParams); var_dump($response); // 调试时可以输出请求、返回的XML和SOAPUI里的报文对比 // echo "请求报文:" . htmlspecialchars($client->__getLastRequest()); // echo "返回报文:" . htmlspecialchars($client->__getLastResponse()); } catch (SoapFault $e) { var_dump($e->getMessage()); } ?>
三、用户名密码传递说明
接口文档给出的用户名密码必须在代码中传递,具体传递方式以接口文档要求为准:
- HTTP Basic Auth:curl方式可以添加
CURLOPT_USERPWD参数,SoapClient可以直接在配置项里配置login、password参数 - SOAP Header认证:将用户名密码封装为接口指定的节点放在SOAP Header中,不要放在Body的业务参数里
- 极少数场景是直接放在Body的业务参数中,按接口文档要求配置即可
内容的提问来源于stack exchange,提问作者user2943301
相关产品推荐
相关产品推荐

