【问题标题】:Clarification on how to verify Google In App Purchase purchase token on the server?关于如何在服务器上验证 Google In App Purchase 购买令牌的说明?
【发布时间】:2018-10-29 04:43:06
【问题描述】:

鉴于我的服务器端点已收到与 Google In App Billing 购买相关的购买令牌,我如何以编程方式对其进行验证并获得对其内容的访问权限?

我已经可以使用 php 验证 Google 登录令牌

$client = new Google_Client(['client_id' => $client_id]);

$payload = $client->verifyIdToken($token);

if ($payload)
    return $payload['sub'];

但是我将如何使用Google_Client 来验证购买令牌并访问其内容。

真的只是像following Ruby example 一样向 Google 服务器发送GET 吗?

或者他们是我应该调用的特定Google_Client 命令吗?

我开始认为这是使用OAuth2 或其他东西复制php 中提到的Ruby 代码的情况,因为Google Docs 实际上确实说过,一旦服务器拥有购买令牌:

使用 Google Play 开发者 API 的订阅和应用内购买部分执行 GET 请求以检索购买 来自 Google Play 的详细信息(用于一次性产品购买的 Purchases.products 或用于订阅的 Purchases.subscriptions)。 GET 请求包括应用程序包名称、产品 ID 和令牌(购买令牌)。

如果可能的话只是想澄清一下?谢谢。

【问题讨论】:

    标签: google-api-php-client android-inapp-purchase


    【解决方案1】:

    要在您的客户端应用中验证并获取由 Google 应用内购买产生的购买令牌的详细信息,请使用以下代码 PHP:

    putenv('GOOGLE_APPLICATION_CREDENTIALS=/home/mydir/credentials.json');
    $client = new Google_Client();
    $client->useApplicationDefaultCredentials();
    $client->addScope('https://www.googleapis.com/auth/androidpublisher');
    $service = new Google_Service_AndroidPublisher($client);
    $purchase = $service->purchases_products->get($packageName, $skuID, $purchaseToken);
    

    然后您可以通过通常的方式访问您需要的所有信息,例如

    echo $purchase['orderId'];
    

    访问者名称的完整列表可在此处的 Google 文档中找到 https://developers.google.com/android-publisher/api-ref/purchases/products

    packageName 是您的应用程序包的名称,skuID 是被管理产品的字符串 SKU ID,您可以在 Google Developer Console 中创建它。购买令牌是在您的客户端应用程序内成功购买应用程序结果时返回给您的令牌,因此您需要通过 HTML 上的 POST 命令将其发送到您的服务器端点。不要忘记使用 SSL/TLS 来执行此操作。

    当您在设置/API 访问权限下创建新服务帐户时,会自动从 Google Developer Consoler 下载 credentials.json 文件。


    这里也是 JavaScript 版本:

    const { google } = require('googleapis');
    
    const auth = new google.auth.GoogleAuth({
        keyFile: path.join(__dirname, 'credentials.json'),
        scopes: 'https://www.googleapis.com/auth/androidpublisher',
      });
    const client = await auth.getClient();
    google.options({auth: client});
    
    const androidpublisher = google.androidpublisher({ version: 'v3' });
    
    const res = await androidpublisher.purchases.products.get({
        packageName: 'your.package.name',
        productId: ‘your_sku_id',
        token: your_purchase_token,
      });
    
    console.log(res.data);
    

    有关 API 访问的一般详细信息,请参阅 Google API documentation(例如 here too)(上面的代码可以很容易地适应他们的其他 API)。

    【讨论】:

    • 我按照您的步骤操作,但出现此错误:{“错误”:{“代码”:401,“消息”:“请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌,登录 cookie 或其他有效的身份验证凭据。见 developers.google.com/identity/sign-in/web/devconsole-project.", "errors": [{ "message": "Login Required.", "domain": "global", "reason": "required", "location" :“授权”,“locationType”:“标题”}],“状态”:“未验证”} }
    • 我想通了,我必须使用服务帐户而不是 Oauth2 帐户。
    • 您应该解释如何处理调用“$service->purchases_products->get”的结果,因为问题询问“如何验证 Google 应用内购买”。编辑:到知道如何处理结果,应该看看stackoverflow.com/questions/16067180/…
    • @pdolinaj 服务帐号?而不是 oauth2 帐户?你能澄清一下吗,我也面临同样的问题。
    猜你喜欢
    • 2013-04-10
    • 2015-03-12
    • 2012-09-10
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多