You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CFML项目ReCaptcha返回JSON解析失败问题求助

解决ReCaptcha验证环节JSON解析失败问题

问题分析

从错误信息可知,deserializeJSON解析失败的核心原因是<cfhttp>返回的FileContent并非预期的JSON格式,而是Connection Failure文本——说明请求Google ReCaptcha接口时发生了网络连接异常,而非API返回的错误JSON。

解决思路

1. 先排查HTTP请求的详细错误信息

原代码未对<cfhttp>的请求状态做校验,建议先添加状态检查逻辑,输出完整错误详情以定位具体问题:

<cfif ISDEFINED('FORM.name')>
    <cfhttp url="https://www.google.com/recaptcha/api/siteverify?secret=6Le6210aAAAA7C2zZfRTJ-_geqP8bJqK8hUgO9pc&response=#FORM['token']#" 
            result="Response" 
            timeout="10" /> <!--- 新增超时设置,避免无限等待 --->

    <!--- 优先判断HTTP请求是否成功 --->
    <cfif Response.StatusCode neq 200>
        <cfoutput>
            请求失败:状态码 #Response.StatusCode#<br>
            状态信息:#Response.StatusText#<br>
            错误详情:#Response.ErrorDetail#
        </cfoutput>
        <cfabort>
    </cfif>

    <cftry>
        <cfset Return = deserializeJSON(Response.FileContent) />
        <cfcatch type="any">
            <cfoutput>JSON解析失败,返回内容:#Response.FileContent#</cfoutput>
            <cfabort>
        </cfcatch>
    </cftry>

    <cfif Return.success IS 'true' AND Return.score GT 0.5>
        <!--- 后续业务逻辑 --->
    </cfif>
</cfif>

通过这段代码可以直接定位是超时、DNS解析失败还是防火墙拦截等具体问题。

2. 验证服务器网络连通性

在服务器上执行命令测试能否正常访问Google接口:

curl "https://www.google.com/recaptcha/api/siteverify?secret=你的SecretKey&response=测试用Token"

如果返回Connection refused或超时,说明服务器网络无法访问Google服务:

  • 检查服务器防火墙/安全组是否放行对www.google.com的443端口HTTPS请求
  • 检查DNS配置,确认能正常解析www.google.com
  • 若服务器在国内,需确认网络出口是否允许访问Google服务

3. 确认ReCaptcha密钥有效性

登录Google ReCaptcha管理后台:

  • 核对代码中的Site Key和Secret Key是否与后台配置一致
  • 确认域名绑定列表包含当前站点域名
  • 检查API服务是否处于启用状态(未被封禁)

4. 添加重试机制(可选)

针对偶发的网络波动,可添加简单重试逻辑避免单次异常导致失败:

<cfset retryCount = 0>
<cfset maxRetries = 2>
<cfset requestSuccess = false>

<cfloop condition="retryCount lt maxRetries AND not requestSuccess">
    <cfhttp url="https://www.google.com/recaptcha/api/siteverify?secret=你的SecretKey&response=#FORM['token']#" 
            result="Response" 
            timeout="10" />
    <cfif Response.StatusCode eq 200>
        <cfset requestSuccess = true>
    <cfelse>
        <cfset retryCount = retryCount + 1>
        <cfsleep milliseconds="500"> <!--- 间隔500ms后重试 --->
    </cfif>
</cfloop>

<cfif not requestSuccess>
    <cfoutput>多次请求均失败,请稍后重试</cfoutput>
    <cfabort>
</cfif>

内容的提问来源于stack exchange,提问作者Thomas Nichols

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:53:17