Magento — Клиент не вошел в систему После перенаправления с внешней страницы

#session #soap #magento

#сессия #soap #magento

Вопрос:

У меня возникают большие проблемы с тем, чтобы заставить клиента оставаться в системе после того, как я создал новую учетную запись. Я создаю им учетную запись и добавляю товары в корзину с внешнего сайта, а затем отправляю их в Magento store. Чего я хочу, так это:

  1. Клиент переходит на страницу регистрации и вводит соответствующую информацию.
  2. Они переходят на новую страницу, где они могут выбрать добавление бесплатных образцов в свою корзину.
  3. После отбора образцов. их учетная запись создается, и они перенаправляются в 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);