PHP Magento soap登录调用返回空会话ID

时间:2017-06-08 15:04:30

标签: php magento curl soap

如果我使用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方法调用的任何提示?

1 个答案:

答案 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'))之前它将无效。