simpleclick/google-play-billing
Google Play Billing
Requires
- php: >=7.1
- ext-json: *
- google/auth: ^1.15
- guzzlehttp/guzzle: ^6.0|^7.0
- nesbot/carbon: ^2.41
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- fzaninotto/faker: ^1.9
- phpunit/phpunit: ^8.5
- symfony/var-dumper: ^5.1
- vimeo/psalm: ^3.17
README
PHP Google Play Billing 为将 Google Play 的计费系统添加到您的 php 项目提供所需的实现。
Google Play 的计费系统概述
Google Play 的计费系统是一项服务,它使您能够在您的 Android 应用中销售数字产品和内容。
您可以使用 Google Play 的计费系统来销售以下类型的数字内容
-
一次性产品:一次性产品是用户可以购买的单次非重复收费内容。一次性产品可以是消耗品或非消耗品
- 消耗品 是用户为了获得应用内内容(如游戏货币)而消耗的产品。当用户消耗产品时,您的应用会分发相关内容,然后用户可以再次购买该物品。
- 非消耗品 是一次购买以提供永久性好处的产品。例如,包括高级升级和关卡包。
-
订阅:订阅是一种定期提供内容的产品。订阅将自动续订,直到取消。订阅的例子包括在线杂志和音乐流媒体服务。
安装
使用 composer 安装此软件包
composer require imdhemy/google-play-billing
配置
请求 Google Play 开发者 API 需要身份验证和作用域。为了验证您的机器,请创建一个服务帐户,然后设置环境变量 GOOGLE_APPLICATION_CREDENTIALS
- 在 Cloud Console 中,转到 创建服务帐户密钥 页面。
- 从 服务帐户 列表中选择 新建服务帐户。
- 在 服务帐户名称 字段中输入一个名称。
- 从 角色 列表中选择 项目 > 所有者。
- 点击 创建。一个包含您的密钥的 JSON 文件将下载到您的计算机。
- 您可以通过以下方式设置环境变量
$path = 'path/to/google-app-credentials.json'; putenv(sprintf("GOOGLE_APPLICATION_CREDENTIALS=%s", $path));
销售产品
使用任何类型的产品,您都可以使用 REST API 来
- 确认:确认应用内物品的购买。
- 获取:检查应用内物品的购买和消耗状态。
确认产品
要确认产品,您需要一个客户端,该客户端可以使用 android publisher scope 通过 ClientFactory
创建,然后创建 Imdhemy\Products\Product
类的实例,最后触发 acknowledge()
方法。
use Simpleclick\GooglePlay\ClientFactory; use Simpleclick\GooglePlay\Products\Product; $client = ClientFactory::create([ClientFactory::SCOPE_ANDROID_PUBLISHER]); $product = new Product($client, 'com.example.package.name', 'productId', 'Purchase_Token'); $product->acknowledge();
获取产品的消耗状态
要检查应用内物品的购买和消耗状态,请使用确认产品时使用的相同步骤,但触发 get()
方法而不是确认方法。
use Simpleclick\GooglePlay\ClientFactory; use Simpleclick\GooglePlay\Products\Product; $client = ClientFactory::create([ClientFactory::SCOPE_ANDROID_PUBLISHER]); $product = new Product($client, 'com.example.package.name', 'productId', 'Purchase_Token'); $resource = $product->get();
get()
方法返回一个包含以下方法的 Imdhemy\GooglePlay\Products\ProductPurchase
对象
销售订阅
本节介绍了如何处理订阅生命周期事件,例如续订和过期。
购买的寿命
以下是一次性购买或订阅的典型购买流程。
- 向用户展示他们可以购买的内容。
- 启动购买流程,以便用户接受购买。
- 在您的服务器上验证购买。
- 向用户提供内容,并确认内容已送达。可选地,标记项目为已消费,以便用户可以再次购买该商品。
订阅将自动续订,直到取消。订阅可以处于以下状态
- 活跃:用户处于良好状态,并有权访问订阅。
- 已取消:用户已取消,但在到期前仍可访问。
- 宽限期:用户遇到付款问题,但在谷歌尝试重新支付付款方式期间仍可访问。
- 暂停:用户遇到付款问题,在谷歌尝试重新支付付款方式期间不再有权访问。
- 暂停:用户暂停了访问,直到他们恢复访问之前无法访问。
- 已过期:用户已取消并失去了对订阅的访问。用户在到期时被视为流失。
处理订阅生命周期
订阅在其生命周期中会经历各种状态变化,您的应用需要对每个变化做出响应。为了检查订阅者的状态,您的应用可以使用Google Play开发者API中的Purchases.subscriptions:get(由本包提供)进行查询。
以下方法可用于订阅
- acknowledge:确认订阅购买。
- get:检查用户的订阅购买是否有效,并返回其到期时间。
- cancel:取消用户的订阅购买。
defer:将用户的订阅购买推迟到指定的未来到期时间。- refund:退还用户的订阅购买,但订阅在到期时间之前仍然有效,并将继续续订。
- revoke:退还并立即吊销用户的订阅购买。
注意:斜杠方法尚未实现。请通过您的贡献帮助我们 😅。
use Simpleclick\GooglePlay\ClientFactory; use Simpleclick\GooglePlay\Subscriptions\Subscription; $client = ClientFactory::create([ClientFactory::SCOPE_ANDROID_PUBLISHER]); $subscription = new Subscription($client, 'com.example.package.name', 'subscriptionId', 'Purchase_Token'); $subscription->acknowledge(); $resource = $subscription->get(); // Imdhemy\GooglePlay\Subscriptions\SubscriptionPurchase
以下方法在Imdhemy\GooglePlay\Subscriptions\SubscriptionPurchase
对象中可用
您的应用应通过实时开发者通知监听状态变化,以确保状态保持同步。当订阅状态受到诸如续订和取消等事件的影响时,将发送SubscriptionNotification。您需要在收到实时开发者通知后调用开发者API以获取完整状态并更新自己的后端状态。这些通知仅告知您订阅状态已更改。它们不会提供关于整体订阅状态的完整信息。
注意:由于配额限制,不建议定期轮询Google Play开发者API来检查状态,而不是利用实时开发者通知。
您的应用需要处理以下表格中描述的状态变化
收到实时开发者通知后,您可以按以下方式解析其内容
use Simpleclick\GooglePlay\DeveloperNotifications\DeveloperNotification; $data = 'the_received_base_64_encoded_string'; $developerNotification = DeveloperNotification::parse($data); // Imdhemy\GooglePlay\DeveloperNotifications\DeveloperNotification $subscriptionNotification = $developerNotification->getSubscriptionNotification(); // Imdhemy\GooglePlay\DeveloperNotifications\SubscriptionNotification
以下方法在Imdhemy\GooglePlay\DeveloperNotifications\DeveloperNotification
中可用
以下方法在Imdhemy\GooglePlay\DeveloperNotifications\SubscriptionNotification
中可用