如何基于Firebase Functions调用Google Play Developer API实现内购验证
Firebase Functions 对接 Google Play Developer API 授权配置全攻略
我之前做过好几个类似的内购验证项目,用Firebase Functions来实现的话,授权这块其实没那么复杂,选对方式就很顺畅。核心推荐用服务账号来做授权,完全不用手动管OAuth令牌,适合服务器端自动化场景,下面是一步步的配置细节:
一、先搞定服务账号的创建与配置
- 登录Google Cloud控制台,找到你Firebase项目对应的Cloud项目(两者是绑定的,直接找就行)
- 进到「IAM与管理」→「服务账号」页面,点「创建服务账号」,给它起个好记的名字比如
play-api-verifier,加个描述方便后续识别 - 关键一步:给这个服务账号分配角色,必须加
Service Account Token Creator(用来生成访问令牌),如果是要读取订阅/购买数据,后续还要在Play Console里加权限,先把Cloud这边的角色搞定
二、把服务账号关联到Google Play Console
这步很容易忘,不关联的话调用API会直接权限报错:
- 登录你的Google Play Console,进入目标应用的管理页面
- 点「设置」→「开发者账号」→「API访问」
- 在「服务账号」板块,点「关联服务账号」,输入刚才创建的服务账号的邮箱地址,发送邀请就行
- 等个几分钟让权限同步,回到Cloud控制台确认一下状态
三、在Firebase Functions代码里实现授权逻辑
不用手动下载密钥文件!因为Cloud Functions运行在Google自家环境里,会自动识别默认服务账号,直接用官方客户端库处理授权就行,给你个示例代码:
const { google } = require('googleapis'); const functions = require('firebase-functions'); const playDeveloper = google.androidpublisher('v3'); exports.verifyInAppPurchase = functions.https.onRequest(async (req, res) => { try { // 自动使用Cloud环境的服务账号授权,指定API所需的 scope const auth = new google.auth.GoogleAuth({ scopes: ['https://www.googleapis.com/auth/androidpublisher'] }); const authClient = await auth.getClient(); google.options({ auth: authClient }); // 从前端请求里拿关键参数:包名、商品ID、购买令牌 const { packageName, productId, purchaseToken } = req.body; // 调用Play Developer API验证购买状态 const verifyResult = await playDeveloper.purchases.products.get({ packageName, productId, token: purchaseToken }); // 根据验证结果做后续处理 if (verifyResult.data.purchaseState === 0) { // 0代表购买有效 // 这里可以加你的业务逻辑:更新用户数据库、发通知、记录日志等等 res.status(200).json({ success: true, data: verifyResult.data }); } else { res.status(400).json({ success: false, message: '购买状态无效' }); } } catch (err) { console.error('验证失败:', err); res.status(500).json({ success: false, message: err.message }); } });
四、几个容易踩坑的点
- 必须先在Cloud控制台的「API和服务」→「库」里,搜索并启用Google Play Developer API,不然调用会提示API未启用
- 如果遇到权限不足的错误,去Play Console的API访问页面,确认服务账号有没有被授予「查看应用信息」「管理订单」这类权限
- 要是验证订阅的话,把API方法换成
playDeveloper.purchases.subscriptions.get,参数逻辑差不多
内容的提问来源于stack exchange,提问作者Actine
相关产品推荐
相关产品推荐

