注册免广告
您需要 登录 才可以下载或查看,没有账号?立即注册
×
如果你在办 myEquifax 注册,走到「邮寄验证码」这一步(就是 Equifax 给你寄信、信上有个 10 位验证码那个),在 https://my.equifax.com/pin 填完邮箱和验证码,点 Continue 完全没反应——不跳转、不报错、什么都不发生。
先说结论:不是你填错了,是 Equifax 官网自己的前端 Bug。
我把页面打包后的 JS 反编译扒了一遍,定位到了根因,也写了个能用的修复脚本,分享出来给同样卡住的朋友。
一、现象
- 邮箱和验证码都填对了
- 点 Continue 按钮,毫无反应
- F12 打开网络面板,根本没有任何提交请求发出,只有 Datadog、Optimizely 那些第三方埋点在跑
就是说请求在浏览器这一端就被拦住了,压根没到 Equifax 服务器。换浏览器、换设备、清 Cookie 都没用(我 Chrome 和 Safari 都试过)。
二、根因
页面是 Angular 写的。表单其实有三个字段,第三个是页面上看不见的隐藏必填项:
- this.ptpSubmitPinForm = this.formBuilder.group({
- emailAddress: ["", [required, pattern(...)]],
- pin: ["", [required, minLength(10), maxLength(10), pattern("^[A-Z0-9]{10}$")]],
- reCaptcha: ["", this.recaptchaEnterpriseV3Enabled ? [] : [required]]
- })
复制代码
再看提交函数,两条分支全是静默 return,不给任何提示:
- submitForm = async () => {
- if (this.recaptchaEnterpriseV3Enabled) {
- if ("VALID" !== this.ptpSubmitPinForm.status)
- return void markAllAsTouched(); // ← 静默 return
- if (!(this.siteKey$ && typeof window.grecaptcha < "u" && window.grecaptcha.enterprise))
- return void (this.showCaptchaError = true); // ← 静默 return
- } else if ("VALID" !== this.ptpSubmitPinForm.status) {
- return; // ← 静默 return
- }
- // ...
- this.ptpService.submitPtpPin(B, F, z).subscribe(...) // 真正的提交,永远走不到
- }
复制代码
问题出在 ngOnInit 的执行顺序上——这是个典型的竞态:
- ngOnInit() {
- this.loadAppConfigurationDetails(), // ① 异步 HTTP,回来后才给 recaptchaEnterpriseV3Enabled 赋值
- this.getNewDesign(),
- this.getProductOfferDetails(),
- this.createCaptchaTestingHook(),
- this.recaptchaEnterpriseV3Enabled && ( // ② 同步执行,此刻还是 undefined!
- this.ptpSubmitPinForm.get("reCaptcha")?.clearValidators(),
- this.ptpSubmitPinForm.get("reCaptcha")?.updateValueAndValidity()),
- this.captchaService.retrieveCaptchaSiteKey("ptp-submit-pin").subscribe(e => {
- this.siteKey$ = e.siteKey,
- this.recaptchaEnterpriseV3Enabled && this.loadRecaptchaV3Script() // ③ 同样赶在①前面
- }, e => {})
- }
复制代码
② 和 ③ 都跑在 ① 的 HTTP 响应回来之前,那时候 recaptchaEnterpriseV3Enabled 还是 undefined(假值),于是:
- ② 的 clearValidators() 没执行 → reCaptcha 字段的 required 校验保留着
- ③ 的 loadRecaptchaV3Script() 没执行 → reCAPTCHA 脚本从头到尾就没加载过
死锁就这么形成了:
| 检查项 | 实际状态 | | window.grecaptcha | 存在(页面加载的是 v2 的 api.js) | | window.grecaptcha.enterprise | undefined | | recaptcha-v3-script 元素 | 不存在 | | DOM 里的 reCAPTCHA 组件 | 没渲染(表单只有邮箱、验证码、按钮三个子元素) | | reCaptcha 表单字段 | 永远为空,但带 required |
等 ① 的响应回来把开关置成 true 的时候已经晚了:提交时走 enterprise 分支,却发现表单是 invalid,第一道检查就 return 了。
验证证据:填入合法的邮箱和验证码后,两个输入框自己都是 ng-valid,但表单整体是 ng-invalid。我只往 reCaptcha 字段塞了个任意值,表单立刻变成 ng-valid——确认它就是唯一的拦路虎。
填入合法邮箱和验证码后的 DevTools 诊断:两个输入框各自 ng-valid,表单整体却是 ng-invalid
服务端接口本身完全正常,captchaSiteKey 和 appConfig 都返回 200,appConfig 里 recaptchaEnterpriseV3Enabled 明明白白是 true。纯粹是前端加载时序写挂了。
另外提醒一个坑:这个站点密钥是 Enterprise / v3 类型。我一开始想当然用 v2 的 grecaptcha.render() 去渲染那个「我不是机器人」复选框,结果报「密钥类型无效 / Invalid key type」。v3 是无感知验证,本来就没有复选框可点,别走弯路。
三、修复思路
很简单——把页面因为竞态而漏掉的那一步手动补上:
- 手动注入 https://www.google.com/recaptcha/enterprise.js?render=<siteKey>
- 轮询等 grecaptcha.enterprise.execute 就绪
- 调 grecaptcha.enterprise.execute(KEY, { action: 'register' }) 拿 token
- 通过页面自己注册的 window.setCaptchaValue(token) 写进表单,触发变更检测
这里说明一下:setCaptchaValue 是页面源码里 createCaptchaTestingHook() 主动挂到 window 上的官方钩子,不是外部硬塞的。token 也是 Google 正常签发的(实测 2400+ 字符)。不涉及任何伪造或绕过风控——服务端的验证码校验、尝试次数限制这些都原封不动保留着,脚本干的只是补齐页面自己没做完的初始化。
实测效果:注入脚本后 831ms,grecaptcha.enterprise 就绪,拿到 token 灌进去,表单从 ng-invalid 变成 ng-valid,提交请求正常发出。
运行修复脚本后的同一页面:form#idForm 变为 ng-valid,Continue 可正常提交
四、项目地址
代码和完整分析都放 GitHub 了,MIT 协议:
https://github.com/sunfase-io/equifax-pin-captcha-fix
五、怎么用
- 打开 https://my.equifax.com/pin
- 先把邮箱和 10 位验证码填好
- F12 打开 DevTools,切到 Console
- 首次用 Chrome 会让你手输 allow pasting 再回车(只需一次)
- 把仓库里 equifax-fix.js 全文复制粘贴进 Console,回车
- 页面顶部出现绿色横幅「reCAPTCHA 已就绪」后,手动点 Continue
几个注意事项:
- 先关掉 Requestly 之类的 HTTP 拦截扩展,它们可能干扰 reCAPTCHA 脚本加载,很可能就是诱因之一
- token 有效期大概 2 分钟,横幅出来后尽快点 Continue,超时了就重跑一遍脚本
- 得能正常访问 google.com,Enterprise 脚本是直接从 Google 那边加载的
- 脚本不会自动帮你提交。页面有 remainingAttempts 机制,验证码填错次数用完会被强制踢到客服页,所以提交这一步留给你自己确认无误后再点
- 验证码正则是 ^[A-Z0-9]{10}$,大写字母和数字都放行。填错前端不拦,会直接消耗一次机会——信是扫描件的话,注意分辨 O 和 0、Q 和 O 这些易混字符
六、其他
分析环境是 Chrome 150,2026 年 7 月验证通过。Equifax 前端更新后脚本可能失效。如果 siteKey 变了,从 GET /consumer-registration/rest/1.0/captchaSiteKey?pageName=ptp-submit-pin 的响应里取新值,替换脚本里的 KEY 常量就行。
如果实在搞不定,也可以直接打客服电话 888-836-6351(周一到周五 8a-9p EST),跟他们说「网站 PIN 提交页的 reCAPTCHA 加载不出来,Continue 按钮没反应」,让客服在后台帮你完成验证。
希望能帮到卡在这一步的朋友。有问题欢迎回帖交流。 |