Magento2合并登录注册页提交注册报reCaptcha信誉过低跳转旧页
问题描述
Magento2站点将原本独立的登录、注册表单合并到同一登录页面,通过修改登录页布局文件实现双表单同页展示后,提交客户注册请求会被重定向到原注册地址 https://mywebsite.com/customer/account/create/,返回错误:
You cannot proceed with such operation, your reCaptcha reputation is too low.
现有修改信息
- 修改的登录页布局文件路径:
/var/www/html/abc/vendor/magento/module-customer/view/frontend/layout - 布局配置代码:
<?xml version="1.0"?> <!-- /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <head> <link src="Magedelight_SMSProfile::js/profile-phone-validation.js"/> <css src="Magedelight_SMSProfile::css/smsprofile.css"/> <title>Customer Login</title> </head> <body> <referenceBlock name="head.components"> <block class="Magento\Framework\View\Element\Js\Components" name="customer_account_create_head_components" template="Magento_Customer::js/components.phtml"/> </referenceBlock> <referenceContainer name="content"> <!-- customer.form.login.extra --> <container name="customer.login.container" label="Customer Login Container" htmlTag="div" htmlClass="login-container"> <block class="Magento\Customer\Block\Form\Login" name="customer_form_login" template="Magento_Customer::form/login.phtml"> <container name="form.additional.info" as="form_additional_info"/> </block> <!-- <block class="Magento\Customer\Block\Form\Login\Info" name="customer.new" template="Magento_Customer::form/newcustomer.phtml"/> --> <block class="Magento\Customer\Block\Form\Register" name="customer_form_register" template="Magento_Customer::form/register.phtml"> <arguments> <argument name="attribute_data" xsi:type="object">Magento\Customer\Block\DataProviders\AddressAttributeData</argument> </arguments> <container name="form.additional.info" as="form_additional_info"/> <container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/> </block> <referenceBlock name = "customer_form_register"> <action method="setTemplate"> <argument name="template" xsi:type="string">Magedelight_SMSProfile::register.phtml</argument> </action> </referenceBlock> <!-- <block class="Magento\Cookie\Block\RequireCookie" name="require-cookie" template="Magento_Cookie::require_cookie.phtml"> <arguments> <argument name="triggers" xsi:type="array"> <item name="registerSubmitButton" xsi:type="string">.action.submit</item> </argument> </arguments> </block> --> </container> <block class="Magento\Cookie\Block\RequireCookie" name="require-cookie" template="Magento_Cookie::require_cookie.phtml"> <arguments> <argument name="triggers" xsi:type="array"> <item name="loginButton" xsi:type="string">.action.login</item> </argument> </arguments> </block> <block class="Magento\Cookie\Block\RequireCookie" name="require-cookie" template="Magento_Cookie::require_cookie.phtml"> <arguments> <argument name="triggers" xsi:type="array"> <item name="registerSubmitButton" xsi:type="string">.action.submit</item> </argument> </arguments> </block> </referenceContainer> <referenceContainer name="form.additional.info"> <block class="Magento\Framework\View\Element\Template" name="form_additional_info_customer" template="Magento_Customer::additionalinfocustomer.phtml"/> </referenceContainer> </body> </page>
- 自定义登录、注册phtml模板存放路径:
/var/www/html/abc/app/design/frontend/Megnor/mag110246_4/Magedelight_SMSProfile/templates
排查思路与修复方案
重定向和reCaptcha报错是连锁触发的,核心问题集中在3个点,按顺序排查修复即可:
- 修正核心文件修改的错误操作
直接修改vendor目录下的核心布局文件不符合Magento开发规范,后续版本升级会直接覆盖所有改动。先把修改的布局文件复制到当前主题对应目录app/design/frontend/Megnor/mag110246_4/Magento_Customer/layout/下,后续所有修改在主题内的文件上操作,改完直接清理布局缓存生效。 - 解决布局块名冲突问题
现有布局里两个RequireCookie块使用了相同的name="require-cookie",Magento同页面块名唯一,后定义的注册Cookie校验块会直接覆盖前面的登录块,导致注册提交的Cookie触发逻辑失效。把注册对应的RequireCookie块名改成require-cookie-register即可解决。
另外布局里全局定义的form.additional.info容器和登录、注册表单内部定义的同名子容器冲突,会导致reCaptcha、表单附加字段这类需要插入表单内部的块渲染错位,无法正确嵌入表单标签内。 - 修复reCaptcha加载逻辑不匹配问题
这个是触发报错的直接原因:- Magento默认的reCaptcha(尤其是返回信誉值过低错误的v3版本)是按路由场景加载的,注册场景的reCaptcha实例默认只在
customer/account/create路由下输出,你把注册表单放到了登录路由customer/account/login下,页面加载时根本不会初始化注册场景的reCaptcha,提交时后端拿不到对应场景的合法校验token,就会判定信誉分不足,同时重定向回原生注册页。 - 修复方式是手动在登录页布局内声明注册场景的reCaptcha块,指定插入到注册表单内部的
form_additional_info容器,不要依赖全局自动加载,配置示例如下:
<block class="Magento\ReCaptchaUi\Block\ReCaptcha" name="recaptcha-customer-register" after="-" ifconfig="customer/recaptcha/enabled" template="Magento_ReCaptchaFrontendUi::recaptcha.phtml"> <arguments> <argument name="recaptcha_for" xsi:type="string">customer_create</argument> <argument name="jsLayout" xsi:type="array"> <item name="components" xsi:type="array"> <item name="recaptcha" xsi:type="array"> <item name="component" xsi:type="string">Magento_ReCaptchaFrontendUi/js/reCaptcha</item> </item> </item> </argument> </arguments> </block> - Magento默认的reCaptcha(尤其是返回信誉值过低错误的v3版本)是按路由场景加载的,注册场景的reCaptcha实例默认只在
- 模板层校验
打开自定义的register.phtml模板做两项检查:- 确认表单form标签的action属性正确指向注册提交路由
customer/account/createpost - 确认表单内部正确输出了
$block->getChildHtml('form_additional_info'),保证reCaptcha的渲染内容、隐藏字段都在表单标签内部,不要输出到表单外。
- 确认表单form标签的action属性正确指向注册提交路由
- 缓存清理验证
所有修改完成后,执行php bin/magento cache:clean layout block_html full_page清理缓存,重新加载登录页,查看注册表单源码能找到reCaptcha相关的隐藏字段和JS配置后,再测试提交即可。
额外注意:检查两个表单的提交按钮类名不要混淆,登录按钮类保持.action.login、注册提交按钮类保持.action.submit,否则Cookie校验逻辑不触发也会导致提交异常。
内容的提问来源于stack exchange,提问作者Praful
相关产品推荐
相关产品推荐

