如果我使用curl调用magento的SOAP webservice,它会返回一个会话ID:
电话:
curl -vkS --data-binary @login.xml https://environment.dev/index.php/api/v2_soap/index
我的login.xml:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<loginParam xmlns="urn:Magento">
<username xmlns="">test</username>
<apiKey xmlns="">123456</apiKey>
</loginParam>
</soap:Body>
</soap:Envelope>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento">
<SOAP-ENV:Body>
<ns1:loginResponseParam>
<result>da8a07fb2b28edfdcfd1e6436aba6a8a</result>
</ns1:loginResponseParam>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
结果标记内的字符串是会话ID。
现在,如果我尝试以编程方式获取会话ID:
$login = Mage::getModel('api/user')->login('test', '123456');
结果var_dump($login)
:
protected $_data => array(13) {
'user_id' =>
string(1) "3"
'firstname' =>
string(4) "test"
'lastname' =>
string(4) "test"
'email' =>
string(17) "test@devenv.com"
'username' =>
string(4) "test"
'api_key' =>
string(65) "54a919b24f9bbaba5aa6b93c22705b7c:l53rKBtY57W42aCMbXfUi9SPNNIiLf4G"
'created' =>
string(19) "2017-06-06 13:08:36"
'modified' =>
string(19) "2017-06-06 13:10:53"
'lognum' =>
string(2) "16"
'reload_acl_flag' =>
string(1) "0"
'is_active' =>
string(1) "1"
'sessid' =>
NULL
'logdate' =>
string(19) "2017-06-08 14:25:15"
除sessid
NULL
以外的所有数据已填满。
有关为什么它适用于curl而不是使用magento方法调用的任何提示?
答案 0 :(得分:1)
免责声明:我讨厌Magento!做你想做的事情是不友好的(尝试编写测试,呃?)。对于您的问题,IMHO的最佳解决方案是为您的应用程序使用其他东西。
虽然你无法改变你的情况,但这里有解决方案。
事实证明,您正试图从错误的模型中获取会话ID。会话ID不是由api/user
模型(Mage_Api_Model_User
)生成的,而是由api/session
模型(Mage_Api_Model_Session
)生成的,此模型需要进行一些准备以保持有效会话。
以下是如何获得有效的会话ID(当然,假设您已经引导了应用程序):
$session = Mage::getSingleton('api/session');
$session->init('api', 'api');
$session->login('test', '123456');
$sessionId = $session->getSessionId();
注意$session->init('api', 'api')
。这是生成新会话ID的行,但在将正确的凭据传递给登录($session->login('username', 'password')
)之前它将无效。