如何在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
相关产品推荐
相关产品推荐

