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

如何在ASP Classic中服务端验证Google Recaptcha 2.0?

解决ASP(VBScript)中Google reCAPTCHA 2.0验证始终返回False的问题

我猜你在ASP里折腾reCAPTCHA验证时,肯定踩了不少坑——毕竟VBScript处理这类API请求确实有几个容易忽略的点。下面我把正确的实现步骤和常见问题梳理清楚,帮你搞定这个验证功能。

先排查几个最容易出错的点

  • Secret Key搞混了:别把前端用的Site Key当成后端的Secret Key,Secret Key是在Google reCAPTCHA控制台里专门给后端验证用的,一定要对应你注册的域名。
  • 前端没正确传递响应值:表单提交时,必须确保g-recaptcha-response字段被正确提交到后端,这个是reCAPTCHA生成的验证令牌。
  • 请求Google API的方式不对:必须用POST方法,参数格式要符合application/x-www-form-urlencoded,而且要带上用户的IP地址(虽然不是强制,但能提升验证准确性)。
  • JSON解析出错:ASP原生没有JSON解析器,直接拿响应文本判断很容易出错,得用靠谱的方式解析success字段。

完整的可运行代码示例

下面是整合了前端渲染和后端验证的完整代码,你可以直接替换自己的Key后测试:

<%@LANGUAGE=VBSCRIPT%>
<% Option Explicit %>
<html>
<head>
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
    <% If Request.ServerVariables("REQUEST_METHOD") <> "POST" Then %>
        <!-- 前端表单页面 -->
        <form method="POST" action="">
            <!-- 示例表单字段,换成你自己的 -->
            <label>用户名:</label>
            <input type="text" name="username" required><br><br>
            
            <!-- reCAPTCHA组件,替换成你的Site Key -->
            <div class="g-recaptcha" data-sitekey="你的Site Key"></div><br><br>
            
            <button type="submit">提交表单</button>
        </form>
    <% Else %>
        <!-- 后端验证逻辑 -->
        <%
        Dim recaptcha_secret, recaptcha_response, api_url, postData, objXML, responseText
        Dim is_valid, sc, jsonObj
        
        ' 1. 设置你的Secret Key(从Google控制台获取)
        recaptcha_secret = "你的Secret Key"
        ' 2. 获取前端提交的reCAPTCHA响应令牌
        recaptcha_response = Trim(Request.Form("g-recaptcha-response"))
        
        ' 3. 检查响应令牌是否为空(用户没点reCAPTCHA就提交)
        If recaptcha_response = "" Then
            Response.Write "请完成reCAPTCHA验证后再提交!"
            Response.End
        End If
        
        ' 4. 构建请求Google验证API的POST参数
        api_url = "https://www.google.com/recaptcha/api/siteverify"
        postData = "secret=" & Server.URLEncode(recaptcha_secret) & _
                   "&response=" & Server.URLEncode(recaptcha_response) & _
                   "&remoteip=" & Server.URLEncode(Request.ServerVariables("REMOTE_ADDR"))
        
        ' 5. 发送POST请求到Google验证API
        Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
        objXML.Open "POST", api_url, False
        objXML.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        objXML.Send postData
        
        ' 6. 获取响应文本并解析JSON
        responseText = objXML.ResponseText
        Set objXML = Nothing
        
        ' 用ScriptControl解析JSON(更严谨的方式)
        is_valid = False
        On Error Resume Next
        Set sc = Server.CreateObject("ScriptControl")
        sc.Language = "JScript"
        sc.AddCode("function parseJson(json){return eval('('+json+')');}")
        Set jsonObj = sc.Run("parseJson", responseText)
        If Err.Number = 0 Then
            is_valid = jsonObj.success
        Else
            ' 如果ScriptControl被禁用,退而求其次用字符串匹配
            If InStr(responseText, """success"": true") > 0 Then
                is_valid = True
            End If
        End If
        On Error GoTo 0
        Set sc = Nothing
        Set jsonObj = Nothing
        
        ' 7. 根据验证结果处理业务逻辑
        If is_valid Then
            Response.Write "<h3>验证通过!</h3>"
            Response.Write "表单提交成功,用户名:" & Request.Form("username")
            ' 这里写你的后续处理逻辑(比如写入数据库)
        Else
            Response.Write "<h3>验证失败!</h3>"
            Response.Write "请完成reCAPTCHA验证后重试,或者刷新页面重新提交。"
        End If
        %>
    <% End If %>
</body>
</html>

额外的注意事项

  1. 本地测试:如果在localhost上测试,必须在Google reCAPTCHA控制台里把localhost添加到允许的域名列表里,否则验证会直接失败。
  2. XMLHTTP版本:尽量使用MSXML2.ServerXMLHTTP.6.0,旧版本可能有兼容性问题,如果服务器不支持,可以试试MSXML2.XMLHTTP。
  3. 错误处理:代码里加了On Error Resume Next来处理ScriptControl禁用的情况,你可以根据自己的服务器环境调整解析方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:17:55