我正在尝试使用 SOAP 访问 Magento API。我的代码正常工作,但是客户希望用密码保护 Magento 主文件夹。这样做会中断对 API 的访问并导致错误。
文档表明这不是问题,您可以只指定用户名/密码,但这不起作用。
我使用 PHP 和 IIS,并通过 Plesk 10 设置密码保护。这是否使用基本 HTTP 身份验证或其他方式?
我的访问代码是:
$client = new SoapAuthClient($GLOBALS["magento_api_path"],array(
'login'=>"admin",
'password'=>"password"
)
);
$session = $client->login($GLOBALS["magento_api_user"], $GLOABLS["magento_api_password"] ,
array(
'login'=>"admin",
'password'=>"password"
) );
我得到的错误是:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.domain.co.uk/magento/index.php/api/index/index/wsdl/1/' : failed to load external entity "http://www.domain.co.uk/magento/index.php/api/index/index/wsdl/1/" in C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php:20 Stack trace: #0 C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php(20): SoapClient->__call('login', Array) #1 C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php(20): SoapClient->login('backenduser', 'backendwebuser', Array) #2 {main} thrown in C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php on line 20
所指的行是 $client->login 命令。
有什么建议吗?
我很久以前就遇到过类似的问题。
就我而言,我没有立即意识到在创建
.htaccess
实例时需要使用 SoapClient
凭据,而是将 SOAP API 凭据传递给 login
方法。
我正在传递 SOAP API 凭据,并遇到了与您类似的错误。
这对我有用(不过 1.3.x 版本。截至今天仍然对我有用):
$cProxy = new SoapClient(
URL . 'index.php/api/soap/?wsdl',
array(
'login' => HTACCESS_USER,
'password' => HTACCESS_PASS
)
);
$rSessionId = $cProxy->login(
SOAP_USER,
SOAP_PASS
);
只是为了保存,你没有被打字错误所困:你将
$GLOABLS["magento_api_password"]
作为第二个参数传递给 login
方法,该方法应该是 $GLOBALS["magento_api_password"]
。
最后,您将第三个参数传递给
login
方法,我认为该方法已过时,因为据我所知,它被定义为只有两个参数:
<message name="login">
<part name="username" type="xsd:string" />
<part name="apiKey" type="xsd:string" />
</message>
去过那里,做过那件事:P
$client = new SoapClient("http://${http_user}:${http_pass}@subdomain.domain.com", array(
'login' => $user,
'password' => $pass,
));
问题在于,http 身份验证的使用仅发生在请求期间,而不是在第一个请求上实际获取 wsdl 时发生。要解决这个问题,只需使用我上面发布的格式:http://USERNAME:[电子邮件受保护]/
干杯
此问题可能是因为 Magento 在内部通过本地 HTTP 请求请求它自己的 WSDL。 由于您已使用密码保护访问,因此它不会起作用。 如果请求来自本地主机,请将安全性修改为不需要密码。
如果您查看
Mage_Api_Model_Server_Adapter_Soap::getWsdlUrl()
,您会发现,magento 假定基本身份验证登录名和密码作为环境变量 PHP_AUTH_USER
和 PHP_AUTH_PW
传递。