如何在服务器端验证Google In App Purchase购买令牌?
验证Google In App Billing购买令牌的PHP实现方案
好问题!Google Sign-In的ID Token验证和内购Purchase Token的验证机制完全不同,不能直接用你现有的verifyIdToken方法。我来给你一步步讲清楚怎么用PHP的Google Client库来验证并获取购买令牌的内容:
核心原理说明
Google Play内购的Purchase Token需要通过Google Play Developer API来验证,而不是OAuth2的ID Token验证流程。这个API需要服务器端使用**服务账号(Service Account)**进行身份认证,并且你需要在Google Play Console和Google Cloud Console完成必要的权限配置。
步骤1:准备工作
- 在Google Cloud Console创建服务账号,下载JSON格式的密钥文件。
- 在Google Play Console中,将这个服务账号添加为项目的授权用户,至少授予“查看应用权限”(如果需要订阅状态、退款信息等,可能需要更高权限如“财务权限”)。
- 在Google Cloud Console启用Google Play Developer API。
- 确保你的PHP项目已安装Google Client库:
composer require google/apiclient
步骤2:PHP代码实现
验证一次性内购产品(非订阅)
<?php require __DIR__ . '/vendor/autoload.php'; // 配置信息 $packageName = "你的应用包名(比如com.yourcompany.yourapp)"; $productId = "你的内购产品ID"; $purchaseToken = "用户端传来的Purchase Token"; $serviceAccountKeyPath = "你的服务账号密钥JSON文件路径"; // 初始化Google Client $client = new Google_Client(); $client->setApplicationName("你的应用名称"); $client->setAuthConfig($serviceAccountKeyPath); // 设置API访问范围 $client->addScope("https://www.googleapis.com/auth/androidpublisher"); // 创建Android Publisher服务对象 $androidPublisher = new Google_Service_AndroidPublisher($client); try { // 调用API获取购买详情 $purchase = $androidPublisher->purchases_products->get( $packageName, $productId, $purchaseToken ); // 成功获取到购买信息,你可以按需处理 var_dump($purchase); // 比如验证购买状态:$purchase->getPurchaseState() === 0 表示已购买 // 获取订单ID:$purchase->getOrderId() // 获取购买时间:$purchase->getPurchaseTimeMillis() } catch (Google_Service_Exception $e) { // 处理API调用错误,比如令牌无效、权限不足等 echo "API调用错误:" . $e->getMessage(); } catch (Google_Exception $e) { echo "客户端错误:" . $e->getMessage(); } ?>
验证订阅产品
如果是订阅类型的内购,只需要把API调用换成purchases_subscriptions->get即可:
// 替换对应的API调用部分 $subscription = $androidPublisher->purchases_subscriptions->get( $packageName, $productId, // 这里是订阅产品ID $purchaseToken ); var_dump($subscription); // 比如获取订阅状态:$subscription->getStatus() // 获取到期时间:$subscription->getExpiryTimeMillis()
关键注意事项
- 权限配置:服务账号必须在Google Play Console中被正确授权,否则会返回权限不足的错误。
- 令牌有效性:如果Purchase Token无效、已过期或已退款,API会返回对应的错误信息,你需要在代码中捕获并处理这些情况。
- API调用限制:Google Play Developer API有调用频率限制,注意不要超过配额。
对你疑问的澄清
你不需要自己手动发送GET请求(虽然底层是REST请求),官方的Google Client库已经帮你处理了服务账号的JWT认证、请求签名等复杂逻辑,直接调用封装好的方法即可,比手动发送请求更安全可靠。
内容的提问来源于stack exchange,提问作者user1300214
相关产品推荐
相关产品推荐

