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

如何在Android应用中实现Google reCAPTCHA v3防机器人提交?

Android 集成 Google reCAPTCHA v3 步骤及示例

1. 前期准备

  • 登录Google reCAPTCHA控制台,注册Android应用(选择reCAPTCHA v3类型),填写应用包名后获取Site Key(客户端用)和Secret Key(后端用)
  • 确保项目基于AndroidX开发

2. 添加依赖

在app模块的build.gradle(Module级别)中引入SafetyNet依赖:

dependencies {
    implementation 'com.google.android.gms:play-services-safetynet:18.0.1'
}

3. 客户端验证实现

3.1 获取reCAPTCHA令牌

在需要验证的页面(如表单提交页)编写令牌获取逻辑:

import com.google.android.gms.safetynet.SafetyNet
import com.google.android.gms.safetynet.SafetyNetApi
import com.google.android.gms.tasks.OnSuccessListener
import com.google.android.gms.tasks.OnFailureListener

private const val RECAPTCHA_SITE_KEY = "你的Site Key"

fun fetchRecaptchaToken() {
    SafetyNet.getClient(this).verifyWithRecaptcha(RECAPTCHA_SITE_KEY)
        .addOnSuccessListener(this, OnSuccessListener<SafetyNetApi.RecaptchaTokenResponse> { response ->
            val token = response.tokenResult
            if (!token.isNullOrEmpty()) {
                // 令牌获取成功,传给后端验证
                sendTokenToBackend(token)
            }
        })
        .addOnFailureListener(this, OnFailureListener { e ->
            // 处理验证失败(网络异常、验证不通过等)
            e.printStackTrace()
            // 可向用户提示"验证失败,请重试"
        })
}

3.2 提交令牌到后端验证

用你项目的网络框架(示例用Retrofit)将令牌发送到后端:

// Retrofit接口定义
interface ApiService {
    @POST("api/verify-recaptcha")
    fun verifyRecaptcha(@Body request: RecaptchaRequest): Call<RecaptchaResponse>
}

// 请求/响应数据模型
data class RecaptchaRequest(val token: String)
data class RecaptchaResponse(
    val success: Boolean,
    val score: Float,
    val action: String
)

private fun sendTokenToBackend(token: String) {
    val retrofit = Retrofit.Builder()
        .baseUrl("你的后端域名")
        .addConverterFactory(GsonConverterFactory.create())
        .build()
    val apiService = retrofit.create(ApiService::class.java)
    
    apiService.verifyRecaptcha(RecaptchaRequest(token)).enqueue(object : Callback<RecaptchaResponse> {
        override fun onResponse(call: Call<RecaptchaResponse>, response: Response<RecaptchaResponse>) {
            if (response.isSuccessful) {
                val result = response.body()
                if (result?.success == true && result.score >= 0.5) {
                    // 验证通过,执行表单提交逻辑
                    submitUserForm()
                } else {
                    // 验证不通过,提示用户"疑似机器人操作,请稍后再试"
                }
            }
        }

        override fun onFailure(call: Call<RecaptchaResponse>, t: Throwable) {
            t.printStackTrace()
        }
    })
}

4. 后端验证逻辑(示例)

后端需调用Google官方验证接口校验令牌有效性,以Java为例:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONObject;

public boolean validateRecaptchaToken(String token) {
    String secretKey = "你的Secret Key";
    String verifyUrl = "https://www.google.com/recaptcha/api/siteverify";
    
    OkHttpClient client = new OkHttpClient();
    RequestBody body = RequestBody.create(
        "secret=" + secretKey + "&response=" + token,
        okhttp3.MediaType.parse("application/x-www-form-urlencoded")
    );
    Request request = new Request.Builder()
        .url(verifyUrl)
        .post(body)
        .build();
    
    try (Response response = client.newCall(request).execute()) {
        JSONObject jsonResp = new JSONObject(response.body().string());
        return jsonResp.getBoolean("success") && jsonResp.getDouble("score") >= 0.5;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

5. 关键注意事项

  • 区分开发/生产环境密钥,避免混用
  • score阈值可根据业务调整(0-1区间,值越高越倾向于人类操作)
  • 无需额外申请权限,SafetyNet库已包含必要配置
  • 完善异常处理,覆盖网络失败、令牌无效等场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:17:27