Заполнение корзины покупок в Magento через веб-сервис (с использованием C ++) - PullRequest
1 голос
/ 03 февраля 2012

Я использую Webservice API версии 2 Magento через Soap.Я использовал gSoap для генерации Wrapper / Proxy-Classes для Soap-Calls и до сих пор все работает отлично.Я могу

  • получить товары в магазине
  • получить клиента по идентификатору
  • выполнить вход / выход из системы

, и я могуполучить всю информацию, которая мне нужна, в моем настольном приложении.

Теперь я хочу сделать следующее: в моем настольном приложении есть сайт покупок, где пользователь может выбирать продукты (то есть добавлять их вкорзина) и подтвердите свой выбор, нажав на кнопку, например, «купить».При нажатии на эту кнопку он будет перенаправлен в интернет-магазин в браузере, и теперь должна быть (вероятно, после аутентификации) его корзина со всеми продуктами, которые он выбрал в настольном приложении.

Итак, я попытался сделать следующее:

(не беспокойтесь об уродливых именах классов и методов; o))

Создать новый магазинКорзина:

void SoapManager::createShoppingCart()
{
    ns1__shoppingCartCreateResponse shoppingCartCreation;
    int x = m_pProxy->shoppingCartCreate(m_stLoginID, "1", shoppingCartCreation);
    if(x!=0)
       printFaultDetails(m_pProxy->fault);
    m_currentShoppingCart = shoppingCartCreation;
}

Установить существующего покупателя в созданную корзину:

void SoapManager::setCustomerToCart(ns1__shoppingCartCustomerEntity *customer)
{
    ns1__shoppingCartCustomerSetResponse customerResponse;
    int x = m_pProxy->shoppingCartCustomerSet(m_stLoginID,  m_currentShoppingCart.quoteId, customer, "1", customerResponse);
    if(x!=0 || !customerResponse.result)
        printFaultDetails(m_pProxy->fault);
}

Добавить простой (пример) продукт вкорзина:

void SoapManager::addProductToCurrentCart(shoppingCartProductEntityArray *productsToAdd)
{
    ns1__shoppingCartProductAddResponse productAdded;
    int x = m_pProxy->shoppingCartProductAdd(m_stLoginID, m_currentShoppingCart.quoteId, productsToAdd, "1", productAdded);
    if(x!=0 || !productAdded.result)
        printFaultDetails(m_pProxy->fault);
}

В общем, все.То, что я ожидал бы, - то, что продукт приложен к корзине покупателя, которая была установлена ​​к корзине.Но после перенаправления в интернет-магазин в корзине нет ни товара, ни корзины покупок в административной панели.

Когда я получаю корзину покупок программным способом, используя идентификатор цитаты, в нем есть все добавленные товары, поэтомуЯ думаю, это, вероятно, моя ошибка понимания.

Есть предложения, что я делаю не так?

Или добавление товара в корзину (интернет-магазин) возможно только с использованием строки запроса?(А если так: Как добавить несколько продуктов?)

С уважением и заранее спасибо!

Ян

Ответы [ 2 ]

1 голос
/ 07 апреля 2012

это немного назад, но я думаю, что я наконец-то сделал это, используя смесь полу-знаний и проб и ошибок; о) Кроме этого, я не собираюсь использовать это решение, но полностью интегрирую magento в свой рабочий стол.Приложение без перенаправления пользователя в браузер.

Но вернемся 2 Тема: Было несколько моментов, касающихся magento core-кода, который явно немного глючит, по крайней мере, с помощью API веб-сервиса.

Во-первых, при создании новой корзины покупок для пользователя эта корзина не помечается как активная.В 'app / code / core / checkout / model / cart / Api.php' у вас есть следующий фрагмент кода, который, очевидно, создает новую корзину:

public function create($store = null)
{
    $storeId = $this->_getStoreId($store);

    try {
        /*@var $quote Mage_Sales_Model_Quote*/
        $quote = Mage::getModel('sales/quote');
        //Changed is active to true in order to activate the cart when created
        /*$quote->setStoreId($storeId)
                ->setIsActive(false)
                ->setIsMultiShipping(false)
                ->save();*/
        $quote->setStoreId($storeId)
                ->setIsActive(true)
                ->setIsMultiShipping(false)
                ->save();           
    } catch (Mage_Core_Exception $e) {
        $this->_fault('create_quote_fault', $e->getMessage());
    }
    return (int) $quote->getId();
}

Код комментария является оригиналом, и это устанавливаетShoppingCart false по умолчанию, что приводит (для меня), что я не мог его использовать.Это одна из частей решения, которое сработало для меня.Вторая часть касается моего пользовательского модуля веб-сервиса, расширяющего magento-webservice-api:

public function getSession($customerID)
{
    require_once("app/Mage.php");
    Mage::app ();
    umask(0);

    $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);
    $bool = $session->loginById($customerID);  // Just logging in some example user     
    return session_id();     // this holds your session id
}

Приведенный выше фрагмент кода имитирует запись через обычный процесс входа в систему на magento-веб-сайте.Здесь я инициализирую сеанс, используя код основного веб-сайта / идентификатор моего магазина ($ webSites [1] -> getCode ();), и регистрирую пользователя, используя customerID.После этого я возвращаю sessionId к моему Desktop-приложению.Когда пользователь теперь хочет купить выбранные им вещи (которые были добавлены таким же образом, как я упоминал в вопросе), он нажимает кнопку и перенаправляется в браузер на небольшой php-скрипт, который выглядит следующим образом:

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

Соответствующая строка вызова / запроса выглядит следующим образом:

http://yourdomain.com/setCookie.php?session="+sessionId

'+ sessionId' представляет идентификатор сеанса, который я получил от веб-службы.Все, что я здесь делаю - это устанавливаю куки для пользователя и перенаправляю его в свою корзину, вот и все.Пользователь должен войти в систему и увидеть продукты, которые он выбрал.Одна важная вещь - вы должны установить правильный каталог, в котором magento хранит свои куки ('/' выше).

Ну, на самом деле я хотел дать вам кучу ссылок на очень информативные веб-сайты, которые мне очень помогают в этом раздражающем процессе, но stackoverflow не допускает более двух гиперссылок и, к сожалению, это две выше в моемкод ... извините.

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

С наилучшими пожеланиями, Ян

0 голосов
/ 05 апреля 2012

Я пытаюсь сделать то же самое (ios + soap V1), я думаю, что пока невозможно сделать это, но решение состоит в том, чтобы изменить метод журнала в ядре mageto, чтобы «поймать» имя пользователя и пароль (через GET или POST) и автоматически вызовите функцию log, тогда у вас будет корзина raedy.

вы не одиноки в этом, но если вы уже делаете это, пожалуйста, сообщите, как?

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