Конфликт между оформлением заказа через PayPal и регистрацией учетной записи


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

У меня Magento CE 1.9.1.0, и у меня проблема с регистрацией учетной записи при оформлении заказа, когда клиент платит с помощью PayPal. Мы используем Мастерскую по проверке шаблонов. Вот сценарий:

  1. Клиент заполняет форму оформления заказа, выбирает создание учетной записи для последующего использования и выбирает PayPal в качестве способ оплаты
  2. Клиент перенаправляется на PP, входит в систему, подтверждает платеж, возвращается на наш сайт на странице экспресс-обзора PayPal
  3. Клиент нажимает кнопку окончательного оформления заказа, PayPal отвечает с ошибкой (т.е. несоответствие 10736 - город/штат/почтовый индекс)
  4. Клиент не знает о проблеме, поэтому снова нажимает Оформить заказ.
  5. Сеанс Magento по-прежнему имеет тип учетной записи "регистрация", но из-за того, как модуль PayPal UK обрабатывает PayPal Express для потока платежей клиенты, создание учетной записи клиента не было откатано, и учетная запись уже была создана. Таким образом, после вторичной отправки они получают сообщение об ошибке "Это электронное письмо клиента уже существует".
  6. Клиент пытается и пытается, иногда в конце концов выясняя это, иногда сдаваясь.

Это можно легко проверить с помощью песочницы PP в режиме отрицательного тестирования.

  1. Создайте товар с бесплатной доставкой и стоимостью ровно 107,36 доллара США, гранд всего
  2. Оформите заказ с помощью этого товара и выберите PayPal в качестве способа оформления заказа.
  3. Выполните весь процесс, вы должны получить сообщение об ошибке 10736 при отправке файла.
  4. Попробуйте отправить еще раз, вы должны получить сообщение об ошибке "Это электронное письмо клиента уже существует"

Я просмотрел часть кода и обнаружил, что частично это связано с классом Mage_Paypal_Model_Express_Checkout в их методе _prepareNewCustomerQuote. Это создает и сохраняет запись клиента до того, как заказ будет выполнен помещенный. Это отличается от стандартной проверки, которая создает запись клиента и устанавливает ее в предложении, но фактически не фиксирует запись клиента в БД. Затем он может откатить вызов SQL для создания клиента и не фиксировать изменения, позволяя последующие попытки сделать это. Но этот откат не работает в PP Express, потому что он уже зафиксировал запись.

Я попробовал несколько способов решить эту проблему (см. Mage_Paypal_Model_Express_Checkout вокруг строки 990):

  • Я попытался прокомментировать вызов $customer->save(); в Mage_Paypal_Model_Express_Checkout. Это привело к успешному разрешению заказа после исправления ошибки, но на самом деле запись клиента так и не была сохранена.
  • Затем я попытался добавить setcustomerid(true), когда он устанавливает клиента в предложении. Я скопировал это из стандартного класса оформления заказа: $quote->setcustomer($customer)->setcustomerid(true);. ЭТО ВСЕ ИСПРАВИЛО! Подробности см. в ответе ниже.
Author: BrianVPS, 2016-11-16

1 answers

Во-первых, пожалуйста, следуйте всем рекомендациям и НЕ РЕДАКТИРУЙТЕ ОСНОВНОЙ КОД !! Вы должны создать свой собственный модуль и расширить класс PP, о котором идет речь, чтобы исправить это.

Вам необходимо перезаписать метод _preparenewcustomerquote в Mage_Paypal_Model_Express_Checkout следующим образом (см. Конец метода для изменений):

protected function _prepareNewCustomerQuote()
{
    $quote      = $this->_quote;
    $billing    = $quote->getBillingAddress();
    $shipping   = $quote->isVirtual() ? null : $quote->getShippingAddress();

    $customerId = $this->_lookupCustomerId();
    if ($customerId && !$this->_customerEmailExists($quote->getCustomerEmail())) {
        $this->getCustomerSession()->loginById($customerId);
        return $this->_prepareCustomerQuote();
    }

    $customer = $quote->getCustomer();
    /** @var $customer Mage_Customer_Model_Customer */
    $customerBilling = $billing->exportCustomerAddress();
    $customer->addAddress($customerBilling);
    $billing->setCustomerAddress($customerBilling);
    $customerBilling->setIsDefaultBilling(true);
    if ($shipping && !$shipping->getSameAsBilling()) {
        $customerShipping = $shipping->exportCustomerAddress();
        $customer->addAddress($customerShipping);
        $shipping->setCustomerAddress($customerShipping);
        $customerShipping->setIsDefaultShipping(true);
    } elseif ($shipping) {
        $customerBilling->setIsDefaultShipping(true);
    }
    /**
     * @todo integration with dynamica attributes customer_dob, customer_taxvat, customer_gender
     */
    if ($quote->getCustomerDob() && !$billing->getCustomerDob()) {
        $billing->setCustomerDob($quote->getCustomerDob());
    }

    if ($quote->getCustomerTaxvat() && !$billing->getCustomerTaxvat()) {
        $billing->setCustomerTaxvat($quote->getCustomerTaxvat());
    }

    if ($quote->getCustomerGender() && !$billing->getCustomerGender()) {
        $billing->setCustomerGender($quote->getCustomerGender());
    }

    Mage::helper('core')->copyFieldset('checkout_onepage_billing', 'to_customer', $billing, $customer);
    $customer->setEmail($quote->getCustomerEmail());
    $customer->setPrefix($quote->getCustomerPrefix());
    $customer->setFirstname($quote->getCustomerFirstname());
    $customer->setMiddlename($quote->getCustomerMiddlename());
    $customer->setLastname($quote->getCustomerLastname());
    $customer->setSuffix($quote->getCustomerSuffix());
    $customer->setPassword($customer->decryptPassword($quote->getPasswordHash()));
    $customer->setPasswordHash($customer->hashPassword($customer->getPassword()));
    //BEGIN CUSTOMIZATIONS
    //$customer->save();
    $quote->setCustomer($customer)
        ->setCustomerId(true);
    //END CUSTOMIZATIONS
    return $this;
}

После настройки выполните описанные выше действия, чтобы воспроизвести проблему. При повторной попытке разместить заказ вы должны получить 10736 снова ошибка и НЕ Это электронное письмо клиента уже существует ошибка. Затем вы можете подражать клиенту , устраняя проблему, изменив способ доставки, чтобы он больше не стоил ровно 107,36 доллара. Как только заказ будет выполнен, вы должны войти в новую учетную запись клиента.

 3
Author: BrianVPS, 2016-11-16 18:59:10