Android应用内计费订阅状态更改回调

Android应用内计费订阅状态更改回调,android,in-app-purchase,google-play,in-app-billing,subscription,Android,In App Purchase,Google Play,In App Billing,Subscription,我正在编写一个支持应用内订阅的应用程序。订阅将使我的用户能够使用Android世界以外的许多服务和好处。我知道我可以使用GooglePlayDeveloperAPI来查询订阅的状态,但是由于提供的服务和好处的性质,这样做不是很方便。我想知道是否有一种方法可以在订阅发生更改时获得有关订阅状态的通知。比如说一个网络钩子。我想发表一条评论来回应你的评论,但显然这太长了。除此之外,这也是对你问题的一种回答,所以我认为这可能是一件好事,只是把它作为一个答案。也许它甚至可以解决你的问题 那么关于你的评论。你

我正在编写一个支持应用内订阅的应用程序。订阅将使我的用户能够使用Android世界以外的许多服务和好处。我知道我可以使用GooglePlayDeveloperAPI来查询订阅的状态,但是由于提供的服务和好处的性质,这样做不是很方便。我想知道是否有一种方法可以在订阅发生更改时获得有关订阅状态的通知。比如说一个网络钩子。

我想发表一条评论来回应你的评论,但显然这太长了。除此之外,这也是对你问题的一种回答,所以我认为这可能是一件好事,只是把它作为一个答案。也许它甚至可以解决你的问题

那么关于你的评论。你不必那样做。现在,我不知道您的系统需求,但我将与您分享我的系统需求,希望它能帮助您

在服务器上保存
用户
订阅
(数据库表)。在
订阅
表中,除了
续订
列之外,还有一个
检查
列。假设用户在1月1日创建了月度订阅。在第一天,您在购买完成后从Android呼叫您的服务器,保存订阅详细信息,然后将
续订时间设置为2月1日,将
检查时间设置为2月4日,考虑到您在Google Play开发者控制台中设置了3天的事务失败延迟时间。这样,如果在2月1日付款失败,用户有时间从2月1日到2月3日更改信用卡详细信息。然后在4日,你将查看谷歌播放API的订阅详细信息。但不要在2月1日至4日期间禁用高级功能。如果订阅被取消,请在4日禁用它。这样,高级内容不会以任何方式被延迟或篡改。如果API返回的订阅结束日期是在将来,那么它是续订的,因此您应该保持premium处于激活状态。现在,你可能会问,你如何在4号每月检查一次。使用某种调度程序来调度数据库上的任务

这样,您就不需要依赖webhook了。虽然我同意,但是Webhook会更高效,甚至更容易实现

如果您有任何问题或我描述的系统中存在一些缺陷,请告诉我。

请查看使用Google Cloud的PubSub服务。它发送付款/订阅事件的通知,如:新购买、续订、取消等。它包括令牌,可用于从API检索其他信息,就像您现在所做的那样


您还可以配置此PubSub订阅,以便在收到的每封邮件上调用自定义webhook(仍需要查询PubSub)。

您可以使用我们的服务跟踪Android和iOS上的所有订阅事件,并将带有web Hook的事件发送到您需要的位置。此外,还有一些开箱即用的集成,如振幅、AppsFlyer、Facebook广告等

据我所知,网络上没有其他支付处理器使用的网络钩子。顺便说一句,你是如何实现这一点的?到目前为止我还没有。我唯一的想法就是在我的服务即将使用时查询订阅状态。但我不想通过查询Google Play来延迟我的服务。这是我最关心的问题,但我想我必须接受它。谢谢你的回答@Andrew,我以前在Stripe中实现过订阅,现在使用谷歌应用内产品,我感觉就像在石器时代一样。我也在同一条船上:)刚刚完成Stripe,我个人认为,由于实时通知(就像iTunes中的一个悲伤笑话),谷歌的订阅比苹果的订阅更容易实现。在我们的应用程序中实现苹果的订阅比谷歌的订阅多花了大约5倍的时间。最终的结果也包含了更多的bug。回到Bogdan的解决方案。用户可以升级/降级订阅(如果您有多个产品可用)或通过退款终止订阅。因此,在某些情况下,您可能希望删除或替换他/她的高级功能。这就是为什么每月查询一次谷歌的API是不够的。我建议您实施实时通知,并且仍然定期查询API,以防任何RTN请求未命中您的服务器。我已经设置了
实时通知
,它可以正常工作。我得到了令牌,我可以得到交易信息。但它不包含任何用户信息。我如何知道该交易来自哪个用户?您可以在应用程序中首次购买时使用developerPayload参数将您的用户ID传递给Google。接下来,当您收到PubSub通知时,它将包含purchaseToken,并且在使用此purchaseToken查询Google API以获取订阅详细信息时,您将获得developerPayload值。