检查用户是否可以通过 PlayStore 进行应用内结算

Check if in-app billing via PlayStore is available to user

因此我们希望通过 Google 的计费 API 和中国的支付宝支持应用内计费。我已经编写了一个方法,该方法应该 return GooglePlay 或支付宝计费客户端(以可用者为准)。我需要一种方法来确定 Google 的计费服务是否可供用户使用,以便我知道 return.

的哪个客户端

到目前为止,我遇到了几种不同的选择,但我不确定我需要哪一种:

  1. 创建一个ServiceConnection并检查IInAppBillingService.Stub.asInterface(service) .isBillingSupported(3, context.packageName, "inapp")
  2. 的结果

完整代码如下:https://gist.github.com/first087/9088162

这有点乏味,因为我需要等待服务连接、获取异步结果然后 return 正确的计费管理器,但乍一看似乎正是我需要的。

  1. 使用 GoogleApiAvailability class 并检查 isGooglePlayServicesAvailable(context)
  2. 的结果

这个选项比第一个更简洁,但我不确定它是否 return 是我需要的,并且还需要我将 com.google.android.gms:play-services-base 库添加到我的项目中。

  1. 检查设备上是否安装了 GooglePlay 应用程序。

这是最不可靠的选择(我认为),因为你可以手动安装应用程序,即使它不是由制造商预安装的,然后你可能无法进行购买,因为你在中国,他们不允许。


有没有人有过类似的经历?如何正确判断用户是否可以通过PlayStore进行购买?

因此,在中国测试方法后,phone 安装和未安装 PlayStore 应用程序,这是我们发现的:

已安装 PlayStore 应用且 未安装 VPN

  • GoogleApiAvailability.isGooglePlayServicesAvailable() returns 代码 2 - ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED
  • IInAppBillingService.isBillingSupported() returns 代码 3 - BillingResponse.BILLING_UNAVAILABLE

没有安装 PlayStore 应用并且 没有 VPN

  • GoogleApiAvailability.isGooglePlayServicesAvailable() returns 代码 9 - ConnectionResult.SERVICE_INVALID
  • IInAppBillingService.isBillingSupported() returns 代码 3 - BillingResponse.BILLING_UNAVAILABLE

安装了 PlayStore 应用程序并 使用 VPN

  • GoogleApiAvailability.isGooglePlayServicesAvailable() returns 代码 0 - ConnectionResult.SUCCESS
  • IInAppBillingService.isBillingSupported() returns 代码 3 - BillingResponse.BILLING_UNAVAILABLE

结论:判断计费是否实际可用最安全的方法是通过isBillingSupported()方法。如果您不想通过问题选项 1 中显示的 "hacky" 方式使用它,您可以实例化一个新的 BillingClient 并等待其 startConnection() 方法的回调。

这是我编写的 gist 协程,它根据是否可以通过 PlayStore 进行应用内计费,为您提供 BillingManager 的两种实现之一。