Конфликт между оформлением заказа через PayPal и регистрацией учетной записи
Изначально я готовил это, чтобы задать вопрос, но в процессе я фактически исправил проблему, поэтому я публикую это в надежде, что это поможет кому-то еще.
У меня Magento CE 1.9.1.0, и у меня проблема с регистрацией учетной записи при оформлении заказа, когда клиент платит с помощью PayPal. Мы используем Мастерскую по проверке шаблонов. Вот сценарий:
- Клиент заполняет форму оформления заказа, выбирает создание учетной записи для последующего использования и выбирает PayPal в качестве способ оплаты
- Клиент перенаправляется на PP, входит в систему, подтверждает платеж, возвращается на наш сайт на странице экспресс-обзора PayPal
- Клиент нажимает кнопку окончательного оформления заказа, PayPal отвечает с ошибкой (т.е. несоответствие 10736 - город/штат/почтовый индекс)
- Клиент не знает о проблеме, поэтому снова нажимает Оформить заказ.
- Сеанс Magento по-прежнему имеет тип учетной записи "регистрация", но из-за того, как модуль PayPal UK обрабатывает PayPal Express для потока платежей клиенты, создание учетной записи клиента не было откатано, и учетная запись уже была создана. Таким образом, после вторичной отправки они получают сообщение об ошибке "Это электронное письмо клиента уже существует".
- Клиент пытается и пытается, иногда в конце концов выясняя это, иногда сдаваясь.
Это можно легко проверить с помощью песочницы PP в режиме отрицательного тестирования.
- Создайте товар с бесплатной доставкой и стоимостью ровно 107,36 доллара США, гранд всего
- Оформите заказ с помощью этого товара и выберите PayPal в качестве способа оформления заказа.
- Выполните весь процесс, вы должны получить сообщение об ошибке 10736 при отправке файла.
- Попробуйте отправить еще раз, вы должны получить сообщение об ошибке "Это электронное письмо клиента уже существует"
Я просмотрел часть кода и обнаружил, что частично это связано с классом 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);. ЭТО ВСЕ ИСПРАВИЛО! Подробности см. в ответе ниже.
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 доллара. Как только заказ будет выполнен, вы должны войти в новую учетную запись клиента.