You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在服务器端验证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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:21