You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:48:03