使用Node.js调用Google Play内购API遇OAuth2认证401错误求助
问题诊断与解决方案
核心错误
你把id_token放在请求头的Authorization字段里了,但调用Android Publisher API需要的是OAuth 2.0的access token——id_token仅用于身份验证场景(如用户登录),不具备API调用的授权权限,这就是触发401错误的直接原因。
正确操作步骤
绑定服务账号到Google Play开发者账号
- 登录Google Play控制台,进入目标应用 → 设置 → 开发者账号权限
- 点击添加用户,输入服务账号的邮箱地址,分配查看应用内购买和订阅或财务权限(按需选择)
获取正确的access token
推荐用Google官方的google-auth-library包处理,避免手动调用token接口的失误:const { GoogleAuth } = require('google-auth-library'); async function getAccessToken() { const auth = new GoogleAuth({ keyFile: 'path/to/your/service-account-key.json', // 服务账号的密钥JSON文件路径 scopes: ['https://www.googleapis.com/auth/androidpublisher'] // Android Publisher API的权限范围 }); const client = await auth.getClient(); const accessToken = await client.getAccessToken(); return accessToken.token; }调用API时使用access token
请求头替换为:Authorization: Bearer ${accessToken}调用
purchases.products/get接口的示例:const axios = require('axios'); async function checkPurchaseStatus() { const accessToken = await getAccessToken(); const response = await axios.get('https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}', { headers: { 'Authorization': `Bearer ${accessToken}` } }); console.log(response.data); } checkPurchaseStatus();
额外注意事项
- 确保服务账号的密钥文件是创建账号时下载的完整JSON文件
- 权限范围必须包含
https://www.googleapis.com/auth/androidpublisher,否则会触发权限不足错误 - 若手动调用token接口,需确保请求参数的
scope为上述API权限范围,而非openid等id_token相关范围
内容的提问来源于stack exchange,提问作者fice
相关产品推荐
相关产品推荐

