在AWS Lambda Python中无需google-api-python-client认证Google Play购买API
解决Google Play API 401未授权问题(无需google-api-python-client)
1. 准备服务账号核心信息
从Google Cloud控制台下载的服务账号JSON密钥文件中,提取private_key、client_email字段,同时记住Google的令牌请求地址https://oauth2.googleapis.com/token。将这些信息配置到AWS Lambda的环境变量中(避免硬编码)。
2. 生成JWT认证令牌
使用轻量库pyjwt生成JWT(该库体积极小,不会触发Lambda包体积限制),要指定正确的API权限范围https://www.googleapis.com/auth/androidpublisher:
import jwt import time import os import requests import logging # 从环境变量读取服务账号信息 private_key = os.environ.get('GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY') client_email = os.environ.get('GOOGLE_SERVICE_ACCOUNT_CLIENT_EMAIL') token_uri = 'https://oauth2.googleapis.com/token' google_verify_purchase_endpoint = os.environ.get('GOOGLE_VERIFY_PURCHASE_ENDPOINT') def generate_jwt(): # JWT有效期设为1小时(Google要求不超过此时长) expiry_time = int(time.time()) + 3600 payload = { 'iss': client_email, 'scope': 'https://www.googleapis.com/auth/androidpublisher', 'aud': token_uri, 'exp': expiry_time, 'iat': int(time.time()) } # 用RS256算法生成JWT return jwt.encode(payload, private_key, algorithm='RS256')
3. 获取OAuth2访问令牌
用生成的JWT向Google令牌地址请求可直接使用的访问令牌:
def get_access_token(): jwt_token = generate_jwt() headers = {'Content-Type': 'application/x-www-form-urlencoded'} request_data = { 'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer', 'assertion': jwt_token } response = requests.post(token_uri, headers=headers, data=request_data) response.raise_for_status() return response.json()['access_token']
4. 带令牌调用购买验证API
将访问令牌放入请求头的Authorization字段,再发起GET请求:
def verify_purchase(product_id, token): access_token = get_access_token() url = f"{google_verify_purchase_endpoint}/{product_id}/tokens/{token}" headers = {'Authorization': f'Bearer {access_token}'} response = requests.get(url, headers=headers) response.raise_for_status() data = response.json() logging.info(f"Response from Google Play API : {data}") return data
关键注意点
- 必须将服务账号添加到Google Play Console的开发者权限列表中,角色至少设置为「查看者」(建议设为「开发者」以确保权限足够)。
- 打包Lambda代码时,仅需安装
pyjwt和requests两个依赖,总体积远低于250MB限制。 - 可将访问令牌缓存到Lambda内存中(有效期设为50分钟左右),避免每次请求都重新生成令牌,提升效率。
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

