PHP -> SOAP -> Magento Webservice: получите файлы cookie, установленные Magento - PullRequest
4 голосов
/ 05 апреля 2011

Я новичок в Web-сервисе Magento и должен его расширить. Оболочка Webservice может войти в систему клиента, вернуть мне файл cookie сеанса, чтобы я мог перенаправить его в файл, который снова устанавливает файл cookie, перенаправляет меня, и я могу увидеть свою корзину и перейти к оформлению заказа в магазине Magento.

Проблема: Magento создает cookie-файл (который содержит идентификатор сеанса или что-то еще, я пытался установить это руководство по cookie-файлам, и они вошли в систему) вместо того, чтобы устанавливать сеанс, когда клиент входит в систему. Я несколько часов пытался получить этот cookie, который был установлен magento в моем веб-сервисе magento. Кажется, cookie не установлен, когда я звоню

$session = Mage::getSingleton('customer/session');
return $session->getCookie()->get('frontend');

Вот мой полный код: Magento Webservice Api:

<?php 
class Customapi_Model_Core_Api
{

public function __construct()
{
}

public function checkout($user, $cart)
{
    $ret['cookie'] = $this->login($user);

    //$coreCookie = Mage::getSingleton('core/cookie');
    //$ret['cookie'] = $_COOKIE['frontend'];
    return $ret;
}

function login($user)
{
    Mage::getSingleton('core/session', array('name'=>'frontend'));
    $session = Mage::getSingleton('customer/session');
    try
    {
        $session->loginById($user['id']);
    }
    catch (Exception $e)
    {
    }
    return $session->getCookie()->get('frontend');
}

}
?>

Вот мой вызов Api в Php:

<code><?php
$teambook_path = 'http://localhost/magento/';

$soap = new SoapClient('http://localhost/magento/api/?wsdl');
$soap->startSession();
$sessionId = $soap->login('ApiUser', 'ApiKey');

$userSession = $soap->call(
    $sessionId,
    'customapi.checkout',
    array(
        array(
            'id' => 1,
            'username' => 'Ruf_Michael@gmx.de',
            'password' => '***'
        ),
        array(
        )
    )
);

echo '<pre>';
var_dump($userSession)."\n";
if(isset($userSession['sid']))
    echo '<a href="'.$teambook_path.'session.php?sid='.$userSession['sid'].'" target="_blank">'.$userSession['sid'].'</a>'."\n";
echo '
'; $ Soap-> endSession ($ SESSIONID); ?>

Спасибо за любую помощь! MRU


Извините, я пишу ответ, но в поле для комментариев было отказано в написании более ... писем.

Я попробовал оба кода, которые вы опубликовали, и все, что я получил, это пустой массив или Bool false Я написал статическую функцию:

private static $cookie = array();
public static function cookie($key, $value)
{
    if($key == 'frontend') {
        self::$cookie['key']   = $key;
        self::$cookie['value'] = $value;
    }
}

, который вызывается в Mage_Core_Model_Session_Abstract_Varien :: start, и я получил значение cookie внешнего интерфейса:

Customapi_Model_Core_Api::cookie($sessionName, $this->getSessionId());

в строке 125.

Но это не решило мою основную проблему: Сеанс, созданный в вызове Api, не может быть восстановлен, хотя для него установлено правильное значение.

Спасибо за вашу помощь!

1 Ответ

7 голосов
/ 05 апреля 2011

Вы можете получить массив всех ваших файлов cookie с помощью следующей команды:

Mage::getModel('core/cookie')->get();

Файл внешнего интерфейса можно получить следующим образом:

Mage::getModel('core/cookie')->get('frontend');

Из вашего прокомментированного кода я могувижу, что вы уже знали это.

Насколько я знаю, когда вы входите в систему, пользователь Magento не просто создает новый идентификатор сеанса, он использует идентификатор сеанса активного соединения (которое генерируется).самим PHP).Вы входите в систему пользователя и связываете его с сеансом, который ваш клиент API только что создал с Magento.Таким образом, код, который вы прокомментировали, кажется правильным для того, чего вы пытаетесь достичь.

Теперь вам просто нужно получить возвращенный идентификатор сеанса и использовать его в своем новом запросе в качестве файла cookie внешнего интерфейса..

Редактировать (второй раз)

В Magento разные сеансы внутри одного сеанса PHP, который он использует для разных областей.Например, есть основная область, область клиента и т. Д. Однако область клиента также специфична для данного веб-сайта.Таким образом, вы можете иметь область customer_website_one и customer_website_two.

Если вы хотите войти в систему своего пользователя, вы должны указать Magento, на каком веб-сайте это находится.Возьмите следующий код в качестве примера

// This code goes inside your Magento API class method

// These two lines get your website code for the website with id 1
// You can obviously simply hardcode the $code variable if you prefer
// It must obviously be the website code to which your users will be redirected in the end
$webSites = Mage::app()->getWebsites();
$code = $webSites[1]->getCode();

$session = Mage::getSingleton("customer/session"); // This initiates the PHP session
// The following line is the trick here. You simulate that you 
// entered Magento through a website (instead of the API) so if you log in your user
// his info will be stored in the customer_your_website scope
$session->init('customer_' . $code);
$session->loginById(4);  // Just logging in some example user
return session_id();     // this holds your session id

Если я правильно вас понимаю, вы теперь хотите разрешить пользователю открывать скрипт PHP на вашем сервере, который устанавливает для Magento Cookie то, что вы только что вернули в своем методе API,Я написал следующий пример, к которому вы будете обращаться следующим образом: example.com/set_cookie.php?session=THE_RETURNED_SESSION_ID

<?php
// Make sure you match the cookie path magento is setting
setcookie('frontend', $_GET['session'], 0, '/your/magento/cookie/path');
header('Location: http://example.com');
?>

Это должно сделать это.Ваш пользователь теперь вошел в систему (по крайней мере, я заставил его работать в моей тестовой среде).Одна вещь, которую вы должны иметь в виду, это то, что в Magento есть механизм проверки сессий, который не будет работать, если он включен.Это связано с тем, что в вашем сеансе хранится информация о том, какой браузер вы используете, IP-адрес, с которого вы подключаетесь и т. Д. Эти данные не будут совпадать между вызовами через методы API и браузером позже.Вот пример вывода команды print_r($session->getData()) после установки сеанса в методе API

[_session_validator_data] => Array
(
    [remote_addr] => 172.20.1.1
    [http_via] => 
    [http_x_forwarded_for] => 
    [http_user_agent] => PHP-SOAP/5.3.5
)

Убедитесь, что вы выключили проверку в Magento Admin в Настройках> Конфигурация> Общие> Веб> Проверка сеансаНастройки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...