ClassyTaxiServer订阅接口500报错Cannot read property 'get' of undefined
ClassyTaxi订阅支付流程500错误排查
问题背景
- 项目包含ClassyTaxiAppKotlin安卓客户端、ClassyTaxiServer服务端两部分,服务端部署在Firebase Cloud Functions
- 已按教程完成全流程配置,
service-account.json已正确放置 - 安卓端可正常发起订阅购买、向Cloud Functions发送请求,但无法收到购买确认返回,无法为用户开通对应订阅权限
- 预期流程:Play Store完成支付后将确认信息同步至ClassyTaxiServer,服务端校验通过后返回注册/确认结果,客户端为用户开通权限
- 实际表现:支付完成后Firebase Functions可正常打印
instanceId_register_v2、realtime_notification_listener、subscription_register_v2的运行日志,但subscription_register_v2接口返回500错误,流程中断
核心报错信息
报错对应代码段
private async querySubscriptionPurchaseWithTriggerV2(packageName: string, product: string, purchaseToken: string, triggerNotificationType?: NotificationType): Promise<SubscriptionPurchaseV2> { // STEP 1. Query Play Developer API to verify the purchase token const apiResponseV2 = await new Promise((resolve, reject) => { this.playDeveloperApiClient.purchases.subscriptionsv2.get({ // <<=== Server error: Cannot read property 'get' of undefined packageName: packageName, token: purchaseToken }, (err, result) => { if (err) { reject(this.convertPlayAPIErrorToLibraryError(err)); } else { resolve(result.data); } }) });
Firebase Functions运行日志
6:55:28.798 PM instanceId_register_v2 Function execution started 6:55:31.025 PM instanceId_register_v2 Instance id is ddR1Hi...NOO2Z 6:55:31.122 PM instanceId_register_v2 Instance Id specified and verified 6:55:31.122 PM instanceId_register_v2 Instance verification passed 6:55:31.774 PM instanceId_register_v2 Function execution took 2976 ms, finished with status code: 200 6:55:53.623 PM realtime_notification_listener ========> purchase: null PACKAGE_NAME: com.example.subscriptions 6:55:53.624 PM realtime_notification_listener Function execution took 5 ms, finished with status: 'ok' 6:55:57.537 PM subscription_register_v2 Function execution started 6:55:59.817 PM subscription_register_v2 Server error: Cannot read property 'get' of undefined 6:55:59.825 PM subscription_register_v2 Function execution took 2289 ms, finished with status code: 500
Android Studio客户端日志
D/OkHttp: --> PUT https://us-central1-postosgnv.cloudfunctions.net/subscription_register_v2 http/1.1 (437-byte body) D/OkHttp: <-- 500 https://us-central1-postosgnv.cloudfunctions.net/subscription_register_v2 (2661ms, 86-byte body) E/RemoteServerFunction: Failed to call API (Error code: 500) - {"status":500,"error":"not-found","message":"Cannot read property 'get' of undefined"}
错误原因
核心报错Cannot read property 'get' of undefined说明this.playDeveloperApiClient.purchases.subscriptionsv2本身是undefined,90%以上概率由以下两个原因导致:
- Google Play Developer API的Node.js SDK(
googleapis包)版本不兼容:v100以前的版本未内置subscriptions v2接口,或者接口路径命名规则有调整 - 接口路径拼写错误:新版SDK中v2订阅接口的路径为驼峰命名,全小写的
subscriptionsv2路径不存在,访问时自然返回undefined
剩余小概率原因是客户端初始化时未正确传入认证参数,导致实例加载不完整,由于已经配置了service-account.json,这种情况可放在最后排查。
修复步骤
- 进入Firebase Functions的代码目录,升级
googleapis依赖到最新稳定版:npm install googleapis@latest --save - 修正代码中的接口路径拼写,将全小写的
subscriptionsv2改为驼峰格式的subscriptionsV2:this.playDeveloperApiClient.purchases.subscriptionsV2.get({ packageName: packageName, token: purchaseToken }, (err, result) => { // 原有回调逻辑保持不变 }) - 若修改后仍报错,检查Play Developer API客户端初始化逻辑,确认正确传入认证信息、指定接口版本,参考初始化代码:
import { google } from 'googleapis'; const auth = new google.auth.GoogleAuth({ keyFile: './service-account.json', scopes: ['https://www.googleapis.com/auth/androidpublisher'] }); this.playDeveloperApiClient = google.androidpublisher({ version: 'v3', auth: auth }); - 确认Google Cloud Console中已为当前服务账号开启Google Play Android Developer API权限,同时在Play Console后台将该服务账号添加为具备订阅管理权限的用户。
- 重新部署Cloud Functions即可恢复正常流程。
内容的提问来源于stack exchange,提问作者Itapox
相关产品推荐
相关产品推荐

