如何在Google Play上验证另一款Android应用的许可证有效性
验证用户是否拥有第二款Google Play应用的可行方案
嘿,这个需求很常见,我帮你梳理几个Google官方支持的方案,既能满足验证需求,也能保证合规性:
方案1:客户端直接使用Google Play Billing Library查询
如果你的第二款应用是付费应用,可以直接在第一款应用中集成Billing Library,查询当前用户的已购项目列表,判断是否包含第二款应用的购买记录:
具体步骤
- 先在第一款应用中集成最新版的Google Play Billing Library(推荐v5及以上版本)
- 初始化
BillingClient后,调用queryPurchasesAsync方法查询用户的已购项目:
// Kotlin 示例代码 val billingClient = BillingClient.newBuilder(context) .setListener { _, _ -> } // 可按需处理购买回调 .enablePendingPurchases() .build() billingClient.startConnection(object : BillingClientStateListener { override fun onBillingSetupFinished(result: BillingResult) { if (result.responseCode == BillingClient.BillingResponseCode.OK) { val params = QueryPurchasesParams.newBuilder() .setProductType(BillingClient.SkuType.INAPP) .build() billingClient.queryPurchasesAsync(params) { _, purchases -> // 第二款应用的商品ID(付费应用的话通常就是它的包名,可在Play Console确认) val secondAppSku = "com.your.second.app.package" val ownsSecondApp = purchases.any { it.sku == secondAppSku } if (ownsSecondApp) { // 为用户发放专属福利 } } } } override fun onBillingServiceDisconnected() { // 实现重连逻辑,保证服务可用 } })
注意点
- 客户端验证存在被篡改的风险,如果福利涉及付费内容(比如虚拟货币、高级功能解锁),建议搭配服务器端验证使用
- 必须确保用户在两款应用中使用的是同一个Google账号,否则查询结果会不准确
方案2:服务器端使用Google Play Developer API验证(更安全)
这种方式完全规避客户端篡改的问题,适合涉及敏感福利的场景:
具体步骤
- 在Google Cloud Console中创建服务账号,并关联你的Google Play开发者账号,获取认证密钥文件
- 在你的后端服务器中集成Google Play Developer API,通过用户提供的
purchaseToken(或关联的Google账号ID)查询第二款应用的购买状态:
# Python 示例代码 from googleapiclient.discovery import build from oauth2client.service_account import ServiceAccountCredentials # 初始化API客户端 credentials = ServiceAccountCredentials.from_json_keyfile_name( "your-service-account-key.json", scopes=["https://www.googleapis.com/auth/androidpublisher"] ) android_publisher = build("androidpublisher", "v3", credentials=credentials) def check_second_app_ownership(package_name, product_id, purchase_token): try: response = android_publisher.purchases().products().get( packageName=package_name, productId=product_id, token=purchase_token ).execute() # purchaseState为0表示已成功购买 return response["purchaseState"] == 0 except Exception as e: print(f"验证失败: {str(e)}") return False
- 用户在第一款应用中申请福利时,客户端将自身的
purchaseToken(或通过Google Sign-In获取的账号ID)发送到你的服务器,由服务器完成验证后再发放福利
特殊情况:第二款应用是免费应用
如果第二款应用是免费的,无法通过"许可证验证"(因为没有购买记录),这时候可以考虑:
- 使用Firebase App Check验证用户是否合法安装了应用
- 通过Google Play Install Referrer API确认应用是从官方Play商店安装的
不过这类方法只能验证"安装",无法替代付费应用的"许可证有效性"验证。
内容的提问来源于stack exchange,提问作者user1063364
相关产品推荐
相关产品推荐

