zoukankan      html  css  js  c++  java
  • IAP 订阅后端踩坑总结之 Google 篇

    前言:

      本文利用 python 作为后端服务器, 且接入的 Google Cloud Pub/Sub 服务作为实时开发者通知, 未记录具体支付流程的代码,只记录了再开发过程中较为耗时,个人认为比较麻烦的坑。

    - Google 订阅问题总结:

      - Google 认证服务器;

      - Google 订阅信息验证;

      - Google 续订:

        - Google 接入实时开发者通知;

        - Google 续订测试;

        - Google 升级测试;

        - Google Play 账户与 APP账户唯一绑定;

    简述订阅流程与续订流程: 

    订阅流程:

      用户从 Google Play 下载安装 APP,  通过APP的支付接口调用 Google Play 的支付界面, 成功后,App 获取到 Google 返回的携带 Token,  productId, 与本APP的用户信息, 发送到后端, 进行验证, 验证成功后 发放/开通 相应权限;

    续订流程:

      Google 会自动续订, 不进过APP支付, 若续订成功, 会发送通知到安全服务器; 续订失败, 或者其他暂停, 取消, 等等操作, 也会发送通知到安全服务器; 在这里, 我只进行了续订以及恢复续订的监听, 我认为只需要知道他续订成功的状态即可; 其他操作一律视为续订失败, 不对该用户的过期时间进行顺延。 正常过期, 收回权限/商品;

    Google 认证服务器:

    测试时需要Google 验证服务器来作为安全服务器;

    官方文档接入地址: https://developer.android.com/google/play/developer-api

    选择 OAuth 2.0 https://developers.google.com/identity/protocols/OAuth2ServiceAccount

    Google 订阅信息验证: 

    官网数据验证地址: https://developers.google.com/android-publisher/api-ref/purchases/subscriptions

    校验数据的请求地址:

    POST https://www.googleapis.com/androidpublisher/v3/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token:acknowledge
    
    Path parameters: 
    packageName  string  购买此订阅的应用程序的包名称(例如: 'com.some.thing'.)
    
    subscriptionId  string  购买的订阅ID (例如,'monthly001')
    
    token    string   购买订阅时提供给用户设备的令牌。

    验证后的订单数据 demo:

    {
      "kind": "androidpublisher#subscriptionPurchase",
      "startTimeMillis": long,
      "expiryTimeMillis": long,
      "autoResumeTimeMillis": long,
      "autoRenewing": boolean,
      "priceCurrencyCode": string,
      "priceAmountMicros": long,
      "introductoryPriceInfo": {
        "introductoryPriceCurrencyCode": string,
        "introductoryPriceAmountMicros": long,
        "introductoryPricePeriod": string,
        "introductoryPriceCycles": integer
      },
      "countryCode": string,
      "developerPayload": string,
      "paymentState": integer,
      "cancelReason": integer,
      "userCancellationTimeMillis": long,
      "cancelSurveyResult": {
        "cancelSurveyReason": integer,
        "userInputCancelReason": string
      },
      "orderId": string,
      "linkedPurchaseToken": string,
      "purchaseType": integer,
      "priceChange": {
        "newPrice": {
          "priceMicros": string,
          "currency": string
        },
        "state": integer
      },
      "profileName": string,
      "emailAddress": string,
      "givenName": string,
      "familyName": string,
      "profileId": string,
      "acknowledgementState": integer
    }

    Google 接入实时开发者通知: 

    参考文档: https://developer.android.com/google/play/billing/realtime_developer_notifications.html#scale_notification_processing

    启用实时开发者通知后,只要现有订阅项目有更新,您就会直接从 Cloud Pub/Sub 收到购买令牌。

    实时开发者通知并不提供与订阅项目状态有关的完整信息,例如用户目前是否有权访问订阅内容。收到令牌后,您应该始终使用购买令牌查询 Google Play Developer API,以获取完整信息,并根据用户当前的权限状态更新后端。

    通知类型未来可能会发生变化。您应该能够处理无法识别的通知类型,并且您应该始终依赖 Google Play Developer API 来处理关键业务逻辑。

     

    开启实时开发者通知后, 订阅所有类型的操作都会通知到你的服务器上, 很好用。

     

    开启的步骤如下:

      - 1. 前往 Google Cloud Platform (GCP) 创建 Pub/Sub 项目:

        进入 GCP 的控制台如图点击 创建主题

          

      

      - 2.  在创建的主题中, 添加服务账号到发布商的权限中;

        

      - 3. 前往 Google Play 管理中心开启实时开发者通知:

        - 3.1 打开 Google Play 管理中心

        - 3.2 选择您的 Android 应用。

        - 3.3 依次转到开发工具 > 服务和 API 页面

        - 3.4 ... 看图

        

      - 4. 在主题中创建订阅, 选择 push 类型的订阅进行创建, 创建前需要验证网域所有权; 若果未验证成功, 则在创建订阅的时候 Google 会报 400 的错误;

        - 4.1 使用 Search Console 完成网站验证流程。请务必注册网址的 https:// 版本。 这里我选择的是 HTML 验证; 当这里验证成功后不要急于去创建订阅, 请先完成下面的步骤;

        - 4.2 授予网域对订阅所属的 GCP 项目的访问权限

          - 4.2.1 转到 API 和服务凭据 (APIs & Services Credentials) Console 页面。https://console.cloud.google.com/apis/credentials?_ga=2.15358897.-641556672.1562576238

          - 4.2.2 请选择您的项目

          - 4.2.3 选择网域验证标签页

          - 4.2.4 选择添加网域

          - 4.2.5 输入相应网域,然后选择添加网域

          - 4.2.6 创建订阅

        - 4.3 可以选择任意一个被验证过了的网域配置为 端点;

    本文未选择 pull 类型的订阅;

    通知消息的数据类型: 

    属性名称    值    说明
    version    string    此通知的版本。最初,此值将为“1.0”。此版本与其他版本字段不同。
    notificationType    int    
    通知的类型。它可以具有以下值:
    
    (1) SUBSCRIPTION_RECOVERED - 从帐号保留状态恢复了订阅。
    (2) SUBSCRIPTION_RENEWED - 续订了处于活动状态的订阅。
    (3) SUBSCRIPTION_CANCELED - 自愿或非自愿地取消了订阅。如果是自愿取消,在用户取消时发送。
    (4) SUBSCRIPTION_PURCHASED - 购买了新的订阅。
    (5) SUBSCRIPTION_ON_HOLD - 订阅已进入帐号保留状态(如已启用)。
    (6) SUBSCRIPTION_IN_GRACE_PERIOD - 订阅已进入宽限期(如已启用)。
    (7) SUBSCRIPTION_RESTARTED - 用户已通过“Play”>“帐号”>“订阅”重新激活其订阅(需要选择使用订阅恢复功能)。
    (8) SUBSCRIPTION_PRICE_CHANGE_CONFIRMED - 用户已成功确认订阅价格变动。
    (9) SUBSCRIPTION_DEFERRED - 订阅的续订时间点已延期。
    (12) SUBSCRIPTION_REVOKED - 用户在有效时间结束前已撤消订阅。
    (13) SUBSCRIPTION_EXPIRED - 订阅已过期。
    purchaseToken string 购买订阅时向用户设备提供的令牌。 subscriptionId string 所购买订阅的 ID(例如“monthly001”)。

     Google Play 账户与 APP账户唯一绑定: 

    pass  

     

    Google 续订暂停订阅等测试需要注意的点: 

    - 续订测试

      1. 订阅到期后, 自动成功续期;  

    - 暂停测试

    1. 订阅暂停后, 当前续费结束后, 取消访问权限;
    2. 暂停期结束后, 自动续费成功;
    3. 暂停期间, 主动从Google Play恢复订阅成功;
    4. 暂停期间, 主动从App订阅 恢复订阅成功;
    5. 恢复订阅后, 自动续订成功;

    - 升级测试

      1. 低级订阅升级高级订阅时, 低级订阅应该取消权限

     

     

     

  • 相关阅读:
    .netcore返回HellowWorld四种方式(管道配置,管道扩展方法,中间件,IStartupFilter 使用中间件的升级扩展)
    Mysql分页大数据量查询优化
    swagger发布本地的调试的时候没事,发布服务器提示500 : {"Message":"出现错误。"}
    DBeaver的使用(impala和数据库)
    mysql远程连接问题
    java+thymeleaf-layout-dialect+thymeleaf的使用
    springboot+thyemeleaf+swagger项目的创建和问题的解决
    ffmpeg实践
    Camera.main
    python双曲线拟合
  • 原文地址:https://www.cnblogs.com/Fushengliangnian/p/11190538.html
Copyright © 2011-2022 走看看