共计 2293 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
Play Integrity API 是 Google 提供的一种设备完整性验证服务,用于检测设备是否被篡改或处于不安全环境中。当开发者集成 ChatGPT API 时,Google 会强制进行 Play Integrity 验证,以确保调用来自合法、未被篡改的设备。如果验证失败,就会出现 Play Integrity Verification Failed 错误。

常见错误场景包括:
- 设备未通过 SafetyNet 认证
- 设备已 root 或安装了自定义 ROM
- 应用签名与 Google Play 上发布的不一致
- 网络问题导致验证请求超时
技术分析
Play Integrity 验证流程分为客户端和服务端两部分:
- 客户端请求:应用从 Google Play 服务获取 Integrity Token
- 服务端验证:将 Token 发送到 ChatGPT API 前,先由开发者服务端验证其有效性
- 结果处理:根据验证结果决定是否允许访问 ChatGPT API
解决方案
客户端实现
以下是 Kotlin 代码示例,展示如何在 Android 应用中获取 Integrity Token:
// 在您的 Activity 或 ViewModel 中
import com.google.android.play.core.integrity.IntegrityManager
import com.google.android.play.core.integrity.IntegrityTokenRequest
suspend fun requestIntegrityToken(): String? {val integrityManager = IntegrityManagerFactory.create(applicationContext)
val request = IntegrityTokenRequest.builder()
.setNonce("your_random_nonce_here") // 每次请求生成新的 nonce
.setCloudProjectNumber("your_google_cloud_project_number")
.build()
return try {val tokenResponse = integrityManager.requestIntegrityToken(request).await()
tokenResponse.token()} catch (e: Exception) {Log.e("Integrity", "Token request failed", e)
null
}
}
服务端验证
Node.js 验证示例:
const {GoogleAuth} = require('google-auth-library');
const axios = require('axios');
async function verifyIntegrityToken(token) {
const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/playintegrity'});
const client = await auth.getClient();
const projectNumber = 'your_google_cloud_project_number';
try {
const response = await axios.post(`https://playintegrity.googleapis.com/v1/${projectNumber}:decodeIntegrityToken`,
{integrity_token: token},
{headers: await client.getRequestHeaders() }
);
// 检查验证结果
const verdict = response.data.tokenPayloadExternal?.deviceIntegrity?.deviceRecognitionVerdict;
if (verdict && verdict.includes('MEETS_DEVICE_INTEGRITY')) {return true;}
return false;
} catch (error) {console.error('Verification failed:', error);
return false;
}
}
避坑指南
常见问题及解决方法:
- 错误:MISSING_CONFIGURATION
- 确保在 Google Cloud 控制台启用了 Play Integrity API
-
检查项目编号是否正确
-
错误:NETWORK_ERROR
- 检查设备网络连接
-
确保没有防火墙阻止访问 Google Play 服务
-
验证始终失败
- 确认设备未 root 或安装非官方 ROM
- 测试时使用正式签名版本,而非调试版本
安全考量
- Nonce 生成 :每次请求使用唯一的 nonce,防止重放攻击
- Token 有效期 :服务端应立即验证 token,不要存储或重复使用
- 速率限制 :对频繁失败的验证请求实施限制
性能优化
- 客户端缓存 :对通过验证的设备,可缓存结果 24 小时
- 批处理验证 :多个 API 调用可共享同一验证结果
- 延迟验证 :非关键操作可先执行后验证
工具与资源
- 验证工具 :
- Play Integrity API 测试控制台
-
Android Studio 的 Device Explorer
-
学习资源 :
- Google Play Integrity 官方文档
- Android 开发者博客关于设备完整性的文章
通过以上步骤,您应该能够解决大多数 Play Integrity 验证失败的问题。如果仍有疑问,建议检查 Google Play 开发者控制台中的错误报告,那里通常会有更详细的失败原因说明。
正文完
发表至: 未分类
近三天内
