#session #soap #magento
#сессия #soap #magento
Вопрос:
У меня возникают большие проблемы с тем, чтобы заставить клиента оставаться в системе после того, как я создал новую учетную запись. Я создаю им учетную запись и добавляю товары в корзину с внешнего сайта, а затем отправляю их в Magento store. Чего я хочу, так это:
- Клиент переходит на страницу регистрации и вводит соответствующую информацию.
- Они переходят на новую страницу, где они могут выбрать добавление бесплатных образцов в свою корзину.
- После отбора образцов. их учетная запись создается, и они перенаправляются в Magento store с образцами в их корзине.
Проблема, с которой я сталкиваюсь, находится между шагами 2 и 3. Я создаю учетную запись, используя SOAP API Magento со следующим:
$customerInfo = array('firstname' => $custFirstname, 'lastname' => $custLastname, 'email' => $email, 'password_hash' => md5( $new_password ), 'store_id' => 34, 'website_id' => 25,'group_id' => 9);
// Call API method customer.create
$newCustomerId = $client->call( $session, 'customer.create', array( $customerInfo ) );
Затем я возвращаю их идентификатор клиента, который я передаю другой функции, которая фактически регистрирует их и добавляет товары в их корзину:
public static function _addSamplesToCart($customer_id, $sample_one, $sample_two, $sample_three){
Mage::getSingleton("core/session", array("name" => "frontend"));
$customerSession = Mage::getSingleton('customer/session', array("name" => "frontend"));
$customerSession->init("customer_bn_us");
$customerSession->loginById($customer_id);
$cart = Mage::getSingleton('checkout/cart');
$cart->addProductsByIds($idArray);
$cart->save();
$cart->getCheckoutSession()->setCartWasUpdated(true);
}
Эти функции на самом деле вызываются из запросов AJAX post, поэтому, когда я получаю успешное возвращаемое значение из _addSamplesToCart, я выполняю простое перенаправление javascript (window.местоположение =»http://www.myhostname.net/welcome «) и это правильно приводит меня туда, но я не вошел в систему.
Я весь день искал и пробовал несколько разных вещей, и ничего не сработало. Я также пытался выполнить скрытую отправку формы в / customer / account / loginPost, и это все еще не работает. Я проверил, что он правильно создает учетную запись в Magento. Моя единственная догадка заключается в том, что я делаю это с помощью AJAX и PHP, поэтому каким-то образом файлы cookie или сеансы перепутываются?
Ответ №1:
Если вы пытаетесь войти в систему с именем хоста, отличным от того, которое используется магазином Magento, это не сработает. Вы можете убедиться в этом, проверив, создается ли файл cookie интерфейса после вызова AJAX.
Я предлагаю вам создать новый контроллер в Magento, который получает идентификатор только что созданного клиента и выполняет код, который вы написали в своей функции:
www.myhostname.net/autologin/myaction/13 (где 13 — это идентификатор только что созданного клиента).
Очевидно, вам следует добавить что-то еще, чтобы избежать проблем с безопасностью.
Комментарии:
1. Спасибо за ответ. Дело в том, что я захожу не с другого имени хоста. У меня есть страница, внешняя из Magento, на hostname.net/signup , и основное хранилище находится только в hostname.net. Однако я немного покопался в файлах cookie и обнаружил, что идентификатор сеанса, возвращаемый сеансом клиента Magento, не совпадает с файлом cookie интерфейса. Я предполагаю, что мне нужно установить для внешнего интерфейса cookie тот же идентификатор, что и для сеанса клиента, верно?
2. Нет, я установил во внешнем файле cookie тот же идентификатор сеанса, что и у сеанса клиента, и он по-прежнему не указывает, что я вошел в систему. Прямо сейчас я устанавливаю cookie непосредственно перед тем, как вернуться к вызову AJAX, который перенаправляет меня на / welcome. Я проверил, что он также заменяет предыдущий файл cookie интерфейса.
3. Извините за все повторяющиеся сообщения, но у меня почти получилось. Я последовал совету Фабрицио и просто начал использовать контроллер входа. Прямо сейчас он успешно регистрирует меня, но теперь я застрял при добавлении товаров в свою корзину. Я посмотрел, как правильно добавлять продукты, и я действительно уверен, что делаю это правильно. Однако после некоторого изучения Mage::log я проследил проблему вплоть до метода setQty () Sales_Model_Quote_Item. Похоже, что проблема с этим методом отправки события:
Mage::dispatchEvent('sales_quote_item_qty_set_after', array('item'=>$this))
4. Если я создаю блок try-catch при попытке добавить продукт, все работает нормально. Я зарегистрировал исключение, и это то, что я получаю от Magento: товарная позиция для продукта недействительна. Однако не имеет смысла, что он все равно успешно добавит мои товары в корзину.
5. Похоже, вы управляете запасом в Magento. Если вам не нужна эта функция, вы можете отключить ее в панели администратора. В противном случае я предлагаю попробовать цикл for для всех ваших идентификаторов ($ idArray) и использовать функцию $cart->addProduct($product_id, null); вместо $ cart-> addProductsByIds($ idArray);