当客户在结账期间进行注册时,结账和客户注册失败


Checkout and customer registration fails when customer is registering during checkout

我的Magento店面有问题,结账时在我的商店注册的客户无法完成OnePageCheckout结账过程。这个错误很少见,我很难再出现。以下是我收到的错误消息:

付款交易失败提醒
付款交易失败。原因:需要客户电子邮件

付款交易失败提醒
付款交易失败。原因:此客户电子邮件已存在

我敢肯定,这意味着客户尝试了第二次,但也无法完成第二次结账。

这个错误对我来说很奇怪,原因有二。首先,在结账时,这个错误永远不应该发生;由于单页签出的验证不允许您使用已经存在的电子邮件地址进行注册,因此第二种错误应该是不可能的。验证检查也不会让你在不输入电子邮件地址的情况下继续操作(第一种错误)。在这两种情况下,最终付款选项卡(似乎是遇到错误的地方)都应该通过JavaScript隐藏。

客户怎么可能一直点击下订单按钮,但没有通过注册选项卡上的验证进行筛选?

我的猜测是,可能是浏览器导致验证不起作用,并让客户一直到最后一点。

当我说这个错误是"罕见的"时,我的意思是1000个订单中有2个会出现这种错误。

我确信当报价转换为订单时会发生这种情况。在"订单保存"事件中,它将尝试保存客户,作为交易的一部分,同时处理付款。我不认为支付网关会抛出错误,但可能控制权已经传递给了那个类。这种情况很可能发生在OnePageController.php文件中调用saveOrderAction()函数之后。在这个函数中抛出错误后,堆栈跟踪中会像这样报告错误:

Mage::helper('checkout')->sendPaymentFailedEmail($this->getOnepage()->getQuote(), $e->getMessage());

这就是"付款交易失败提醒"电子邮件的生成位置。我认为错误一定在这一部分:

$this->getOnepage()->saveOrder();

如何查找PHP代码中出现此错误的位置?我该如何纠正这一点,以免失去正在尝试从我这里购买的客户?

我的店面正在运行Magento 1.9.1.1版本。

更新:刚刚得到另一个。客户记录完全丢失,但有一个发货和计费地址。很奇怪。

需要更多信息,但我敢打赌这是MySQL主/从竞争条件。以前就发生过这种事。解决方案是使用https://launchpad.net/mysql-proxy这是Lua的脚本。主和从之间的负载平衡(不仅仅是读/写拆分)更好,这个问题可以用一个小的Lua脚本来解决。

我们正在使用Firecheckout的Onepage扩展,但这听起来与我们遇到的问题相同。

我们不时会有一条客户记录丢失,在订单视图屏幕上,我们只会看到

客户名称客人

电子邮件

我相信当客户输入一个无效的电子邮件地址时就会发生这种情况。检查您的异常日志,如果发生这种情况,我们会看到以下内容:

2012-02-01T23:47:30+00:00 ERR (3):
exception 'Zend_Mail_Transport_Exception' with message 'Unable to send mail. ' in     /var/www/html/lib/Zend/Mail/Transport/Sendmail.php:137
Stack trace:
#0 /var/www/html/lib/Zend/Mail/Transport/Abstract.php(348): Zend_Mail_Transport_Sendmail->_sendMail()
#1 /var/www/html/lib/Zend/Mail.php(1194): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))
#2 /var/www/html/app/code/core/Mage/Core/Model/Email/Template.php(409): Zend_Mail->send()
#3 /var/www/html/app/code/core/Mage/Core/Model/Email/Template.php(462): Mage_Core_Model_Email_Template->send(Array, Array, Array)
#4 /var/www/html/app/code/core/Mage/Core/Model/Email/Template/Mailer.php(79): Mage_Core_Model_Email_Template->sendTransactional('sales_email_ord...', 'general', Array, Array, Array, '1')
#5 /var/www/html/app/code/local/Mage/Sales/Model/Order.php(1310): Mage_Core_Model_Email_Template_Mailer->send()
#6 /var/www/html/app/code/local/TM/FireCheckout/Model/Type/Standard.php(1079): Mage_Sales_Model_Order->sendNewOrderEmail()
#7 /var/www/html/app/code/local/TM/FireCheckout/controllers/IndexController.php(559): TM_FireCheckout_Model_Type_Standard->saveOrder()
#8 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Action.php(420): TM_FireCheckout_IndexController->saveOrderAction()
#9 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('saveOrder')
#10 /var/www/html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#11 /var/www/html/app/code/core/Mage/Core/Model/App.php(349): Mage_Core_Controller_Varien_Front->dispatch()
#12 /var/www/html/app/Mage.php(640): Mage_Core_Model_App->run(Array)
#13 /var/www/html/index.php(106): Mage::run('', 'store')
#14 {main}