SUPEE-9767 Magento CE 1.9.3.3 Проверка Onestep не работает с включенной проверкой ключа формы При оформлении заказа [дубликат]
После обновления до Magento CE 1.9.3.3, когда я включаю проверку ключа формы при оформлении заказа, как рекомендовано SUPEE-9767, проверка onestep перестает работать.
После выбора способа оплаты, когда я нажимаю Продолжить оплату, одноэтапный процесс не продолжается. Я не вижу никакого ответа сервера или зарегистрированных сообщений об ошибках.
Когда я отключите проверку ключа формы при оформлении заказа, процесс оформления заказа будет функционировать должным образом.
Это установка Magento по умолчанию без расширенной темы.
Обновление 1
Это, по-видимому, связано с Исправлением SUPEE-9767/CE 1.9.3.3 - Проверка одной страницы - Проблема с регистрацией клиента, когда вызов метода сохранения ajax возвращает значение null, даже если файлы шаблонов исправлены и присутствуют ключи формы,
Я не смог воспроизвести это на чистая установка 1933 года.
Обновление 2
Вот причина моей проблемы
<input name="form_key" type="hidden" value="SLLU234jmligBYb9" disabled="" autocomplete="off">
CSS добавляет отключенный селектор в ключ form_key. Это означает, что значение form_key не передается контроллеру одноэтапной проверки, в результате чего контроллер возвращает значение null. Чтобы проверить это, удалите отключенный селектор в инспекторе браузера.
Эта проблема была вызвана Paypal Plus, который динамически заменяет содержимое набора полей в onestep способ оплаты при оформлении заказа. Смотрите мой ответ ниже.
8 answers
Моя проблема была вызвана динамическим кодом (paypal plus) в процессе оформления заказа на одной странице, перезаписывающим элемент fieldset в форме html-метода с одним шагом - удалением или отключением (с помощью css) скрытого элемента form_key.
Исправление заключается в том, чтобы гарантировать, что на элемент formkey не влияет динамический код или css. Перемещение кода ключа формы за пределы набора полей может помочь
<form action="" id="co-payment-form">
<?php echo $this->getBlockHtml('formkey') ?>
<fieldset>
<?php echo $this->getChildHtml('methods') ?>
</fieldset>
</form>
Вы можете легко подтвердить, обнаруживается ли form_key и отправляется ли он на одну страницу контроллер проверяя сетевые запросы ajax в вашем браузере по мере прохождения методов проверки, каждый метод должен включать ключ формы в данные формы ajax, если ключ формы отсутствует, но был исправлен в исходном коде Magento, затем проверьте внешний код, влияющий на элемент ключа формы, т. Е. css или динамические изменения на стороне клиента.
Https://gist.github.com/schmengler/c42acc607901a887ef86b4daa7a0445b
Примените это исправление после 9767
, когда вы применили исправление безопасности, и это исправление добавит ключи формы во все необходимые PHTML
файлы
В моем случае я применил SUPE-9767, но в нашей пользовательской проверке отсутствовал код ключа формы, как указано выше, т.Е. <?php echo $this->getBlockHtml('formkey') ?>
. Я все еще получал ошибку, когда нажал на проверку, но затем я очистил скомпилированные классы:
server:~$ cd /path/to/magento/public/shell
server:/path/to/magento/public/shell$ php compiler.php disable
server:/path/to/magento/public/shell$ php compiler.php clear
server:/path/to/magento/public/shell$ php compiler.php compile
server:/path/to/magento/public/shell$ php compiler.php enable
А также очистил кэш для хорошей оценки:
server:/path/to/magento/public/shell$ cd ..
server:/path/to/magento/public/$ rm -r var/cache/*
Проблема решена.
Добавьте все ваши пользовательские шаблоны оформления заказа в формы в следующей строке
<?php echo $this->getBlockHtml('formkey') ?>
Если вы используете EE, вам может потребоваться проверить, не переопределила ли ваша пользовательская тема также следующий файл:
Приложение/дизайн/интерфейс/rwd/предприятие/шаблон/учетная запись подарочной карты/страница/оплата/скрипты.phtml
var quoteBaseGrandTotal = <?php echo (float)$this->_getQuote()->getBaseGrandTotal(); ?>;
var isGiftCardApplied = <?php if($this->isFullyPaidAfterApplication()): ?>true<?php else: ?>false<?php endif; ?>;
var epsilon = 0.0001;
function enablePaymentMethods(free) {
Payment.prototype.init = function () {
var elements = Form.getElements(this.form);
var methodName = '';
for (var i=0; i < elements.length; i++) {
if (elements[i].name == 'payment[method]'
|| elements[i].name == 'payment[use_customer_balance]'
|| elements[i].name == 'payment[use_reward_points]'
// Make sure the next line exists in your theme
|| elements[i].name == 'form_key'
) {
methodName = elements[i].value;
Возникла та же проблема, но мне пришлось отредактировать основные файлы, чтобы исправить ее!
Я получаю эту ошибку:
[02-Jun-2017 14:25:32 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 14:37:07 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 14:41:48 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 14:43:09 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 14:52:19 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 15:00:40 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 15:03:54 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 15:06:50 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 15:09:45 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
[02-Jun-2017 15:12:50 UTC] PHP Fatal error: Call to undefined method Mage_Checkout_OnepageController::isFormkeyValidationOnCheckoutEnabled() in /chroot/he/Checkout/controllers/OnepageController.php on line 353
Поэтому я отредактировал функцию $this-> isFormkeyValidationOnCheckoutEnabled()
в этом файле:
\app\code\core\Mage\Checkout\controllers\OnepageController.php
И теперь мой процесс оформления заказа снова работает!
Проверка застряла на шаге 4 после SUPEE-9767 с включенной проверкой ключа формы при проверке Очевидно, что тогда вы используете пользовательскую тему. Как бы это ни было просто, вам тоже придется добавить туда строку. Это просто следующим образом: Откройте свои пользовательские темы payment.phtml и добавьте строку в свой формуляр с идентификатором "форма совместного платежа":
<?php echo $this->getBlockHtml('formkey') ?>
В качестве примера я сделал это сразу после начального php-тега, поэтому он находится поверх шаблона.
Дополнительно: Если ваша пользовательская тема перезаписывает opcheckout.js, есть также некоторые необходимые изменения: Найти
if (elements[i].name=='payment[method]') {
И замените его на
if (elements[i].name=='payment[method]' || elements[i].name == 'form_key') {
Все кредиты community.magento.com
Вы должны использовать ключ формы в своем ключе формы, чтобы он работал.
getBlockHtml('ключ формы')?>