我有一个ktor kotlin容器在Google上愉快地运行,它使用Firebase管理库访问一个Firebase数据库,这一切都很好。
随后,我们将订阅添加到我们的Android应用程序中,并希望在更新了一些内容之后,在云运行容器上执行最终确认。我做了以下几件事:
我们正在从Android应用程序中发送一个有效的购买令牌,但是继续得到:
401 Unauthorized
POST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.app.name/purchases/subscriptions/sub_monthly_5_test/tokens/lbggdfiogmjfkiihemijkphc.AO-J1Owrl-ZrgJECocKyAOwxcrgtWxx-5Bbl_MD0ac4s1uGTZVE05TX1iIX-H6Vd6wxEsCTF9DVHrhVEDxpNET_MDeiNjWStyxp9d4wi3DwdZKv7vNxyMv0:acknowledge当尝试访问时。下面是相关的gradle导入和代码的副本:
implementation( "com.google.apis:google-api-services-androidpublisher:v3-rev20211021-1.32.1")class GoogleClient {
private fun log(message: Any) = LoggerFactory.getLogger("GoogleClient").info(message.toString())
private lateinit var androidPublisher: AndroidPublisher
init {
try {
log("GoogleClient init")
val service = this::class.java.getResourceAsStream("/certs.json")
val credentials = GoogleCredentials.fromStream(service)
.createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER)
androidPublisher = AndroidPublisher.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
GsonFactory.getDefaultInstance(),
HttpCredentialsAdapter(credentials)
).setApplicationName("Subs backend").build()
log("GoogleClient init success")
} catch (e: IOException) {
// Error logging
}
}
suspend fun acknowledgePayment(productToken: String, productId) = withContext(Dispatchers.IO) {
log("acknowledgePayment")
val response = async {
val content = SubscriptionPurchasesAcknowledgeRequest()
androidPublisher.purchases().subscriptions().acknowledge("com.app.name", productId, productToken, content).execute()
log(content)
}
response.await()
}
}为了安全起见,我更改了com.app.name,但我使用了Google仪表板中显示的应用程序的正确名称。
我还尝试创建一个服务帐户,并获得了“毯子编辑器”权限,并得到了相同的401 Unauthorized错误。
编辑:,我也很难找到与此相关的日志。
更新5/11/21:对延迟回复表示歉意-我认为权限是正确的:
来自google云控制台IAM->服务帐户的截图,

谷歌游戏控制台#1

谷歌游戏控制台#2

访问页面

我还创建了一个新的订阅,因为这显然有时会有所帮助。
发布于 2021-11-03 08:57:18
正如纪尧姆·布拉基尔( guillaume blaquiere )所提到的,你需要确保你的服务账户是授权的。
您可以使用gcloud auth list命令验证这一点。
如果您的帐户没有认证,您将需要遵循认证指南。
https://stackoverflow.com/questions/69792516
复制相似问题