google订阅支付服务端

  1. 通用订阅
    1.1.接收google的返回json

    {
        "message":{
            "attributes":{
                "key":"value"
            },
            "data":"eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
            "messageId":"136969346945"
        },
        "subscription":"projects/myproject/subscriptions/mysubscription"
    }
    

    1.2. 解密data(base64)

    {
        "version":"1.0",
        "packageName":"com.some.thing",
        "eventTimeMillis":"1503349566168",
        "subscriptionNotification":{
            "version":"1.0",
            "notificationType":4,
            "purchaseToken":"PURCHASE_TOKEN",
            "subscriptionId":"my.sku"
        },
        "oneTimeProductNotification":{
            "version":"1.0",
            "notificationType":1,
            "purchaseToken":"PURCHASE_TOKEN",
            "sku":"my.sku"
        },
        "testNotification":{
            "version":"1.0"
        }
    }
    

    返回参数说明
    subscriptionNotification(订阅相关)、oneTimeProductNotification(一次性购买相关)
    testNotification(测试发布相关) 三个不会同时存在任意2个

    参数名 说明
    version 此通知的版本。最初,此值为“1.0”。此版本与其他版本字段不同。
    packageName 与此通知相关的应用的软件包名称(例如“com.some.thing”)
    eventTimeMillis 事件发生的时间戳,以从公元纪年开始计算的毫秒数表示
    subscriptionNotification 与订阅相关,并且此字段包含与购买交易相关的其他信息
    oneTimeProductNotification 与一次性购买相关,并且此字段包含与购买交易相关的其他信息
    testNotification 与测试发布相关。这些只通过 Google Play 管理中心发送

    subscriptionNotification说明

    参数名 说明
    version 此通知的版本。最初,此值为“1.0”。此版本与其他版本字段不同。
    notificationType int 订阅的 notificationType 可以参考下面的表
    purchaseToken 购买订阅时向用户设备提供的令牌
    subscriptionId 所购买订阅的 ID(例如“monthly001”)

    notificationType说明

    SUBSCRIPTION_RECOVERED - 从帐号保留状态恢复了订阅。
    SUBSCRIPTION_RENEWED - 续订了处于活动状态的订阅。
    SUBSCRIPTION_CANCELED - 自愿或非自愿地取消了订阅。如果是自愿取消,在用户取消时发送。
    SUBSCRIPTION_PURCHASED - 购买了新的订阅。
    SUBSCRIPTION_ON_HOLD - 订阅已进入帐号保留状态(如果已启用)。
    SUBSCRIPTION_IN_GRACE_PERIOD - 订阅已进入宽限期(如果已启用)。
    SUBSCRIPTION_RESTARTED - 用户已通过 Play > 帐号 > 订阅重新激活其订阅(需要选择使用订阅恢复功能)。
    SUBSCRIPTION_PRICE_CHANGE_CONFIRMED - 用户已成功确认订阅价格变动。
    SUBSCRIPTION_DEFERRED - 订阅的续订时间点已延期。
    SUBSCRIPTION_PAUSED - 订阅已暂停。
    SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED - 订阅暂停计划已更改。
    SUBSCRIPTION_REVOKED - 用户在到期时间之前已撤消订阅。
    SUBSCRIPTION_EXPIRED - 订阅已到期。

    1.3. 根据解密后的内容去google接口做查询校验并发货(关键参数expiryTimeMillis)
    根据解密后的内容去google接口做校验
    Google文档地址
    请求域名(Get/form):

    https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}

    返回参数

    
    {
      "resource": {
        object (SubscriptionPurchase)
      }
    }
    
    {
      "kind": string,
      "startTimeMillis": string,
      "expiryTimeMillis": string,
      "autoResumeTimeMillis": string,
      "autoRenewing": boolean,
      "priceCurrencyCode": string,
      "priceAmountMicros": string,
      "introductoryPriceInfo": {
        object (IntroductoryPriceInfo)
      },
      "countryCode": string,
      "developerPayload": string,
      "paymentState": integer,
      "cancelReason": integer,
      "userCancellationTimeMillis": string,
      "cancelSurveyResult": {
        object (SubscriptionCancelSurveyResult)
      },
      "orderId": string,
      "linkedPurchaseToken": string,
      "purchaseType": integer,
      "priceChange": {
        object (SubscriptionPriceChange)
      },
      "profileName": string,
      "emailAddress": string,
      "givenName": string,
      "familyName": string,
      "profileId": string,
      "acknowledgementState": integer,
      "externalAccountId": string,
      "promotionType": integer,
      "promotionCode": string,
      "obfuscatedExternalAccountId": string,
      "obfuscatedExternalProfileId": string
    }
    

    1.4. 消耗该笔订单
    Google文档地址
    请求域名(Post/form)

    https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:acknowledge

  2. 一次性订阅商品(消耗型商品缓慢支付)
    说明

    1.消耗型商品选择缓慢支付方式,Google服务端会走一次性订阅的回调
    2.Google服务端通过input/json方式 回调给配置的地址
    3.我们服务端收到google回调后 校验并发货,同时调用服务端消耗接口。

    2.1.Google后台相关配置

    1.创建主题。在google后台 (https://console.developers.google.com/apis)
    选择应用–>左菜单选择Pub\Sub–>创建主题
    2.为刚才新建的主题添加主账号,选择google服务器为推送消息服务商(google-play-developer-notifications@system.gserviceaccount.com)
    点击刚才新建的主题–>在网页右侧有添加主账号按钮
    3.在新建的主题下面添加订阅
    选择新建好的主题–>点击旁边的多功能按钮(“:”)–>创建订阅–>选择传送类型为推送–>填写回调地址
    4.在Google开发者后台绑定主题(Google Play Console : https://play.google.com/console/about)
    打开GooglePlay管理中心–>选择您的应用–>下滑到创收–>选择创收设置–>滚动到实时开发者通知部分–>填写主题名(Topic name)(主题名即刚才新建的主题ID)

    2.2.接收Google服务器回调并解析处理(base64)
    1.Google服务器回调的json数据(需要选择input/json方式接收)

    {
        "message":{
            "data":"eyJ2ZXJzaW9uIjoiMS4wIiwicGFja2FnZU5hbWUiOiJjb20uZGh0ei5maWdodGluZy50eiIsImV2ZW50VGltZU1pbGxpcyI6IjE2MzYwOTY3ODA3MTAiLCJvbmVUaW1lUHJvZHVjdE5vdGlmaWNhdGlvbiI6eyJ2ZXJzaW9uIjoiMS4wIiwibm90aWZpY2F0aW9uVHlwZSI6MSwicHVyY2hhc2VUb2tlbiI6ImdqZ2ptam1sYWNnYWtnZWNrZm1qaGhubi5BTy1KMU93bk9tWGc0VTg2SjFEOTFkMlNJQmFiTWRQTm9jYlhCWnpqYWpSWWxCcGJSeFg0X2tpYW9EVEpRMnJVNFMyYUtYQW5HUkp0ZTJBVjhiM1NraEF4RzcxZXdDcjVDUSIsInNrdSI6ImNvbS5kaHR6LmZpZ2h0aW5nLnR6MSJ9fQ==",
            "messageId":"2931105763628844",
            "message_id":"2931105763628844",
            "publishTime":"2021-11-05T07:19:41.009Z",
            "publish_time":"2021-11-05T07:19:41.009Z"
        },
        "subscription":"projects\/jinyoumobilegame-1429d\/subscriptions\/dhtz_ft"
    }
    

    2.用base64解析data

    {
        "version":"1.0",
        "packageName":"com.dhtz.fighting.tz",
        "eventTimeMillis":"1636098148511",
        "oneTimeProductNotification":{
            "version":"1.0",
            "notificationType":1,
            "purchaseToken":"mdclhokjpbfaiammjmjeoeoi.AO-J1OzIjbEAC5vbhPIN1R0E5PVZgFvLPrQHQlvuVxwLEgd4BC_S35KBQaBGX8DoisOh3p3a9iDSROuzuX4BLyZTXX2w4lrmfw",
            "sku":"com.dhtz.fighting.tz1"
        }
    }
    

    2.3 订单校验后做发货处理(发货之前可以到Google那边查询该订单情况)
    Google文档地址
    接口和具体传参(get/form):

    https://androidpublisher.googleapis.com/androidpublisher/v3/applications/packageName/purchases/products/{productId}/tokens/{purchaseToken}?access_token={access_token}

    查询返回体

    {  
       "purchaseTimeMillis": "1636684861095",//以毫秒为单位购买产品的时间
       "purchaseState": 0,//订单的购买状态,0(已购买)1(取消)
       "consumptionState": 0,
       "developerPayload": "",//开发人员指定的字符串,其中包含有关订单的补充信息
       "orderId": "xxxxx",//与购买应用内商品关联的订单 ID
       "purchaseType": 0,//应用内商品的购买类型。仅当购买不是使用标准的应用内结算流程进行时才会设置
       "acknowledgementState": 1,//应用内产品的确认状态,0(尚未确认),1(已确认)
       "kind": "androidpublisher#productPurchase",//代表一个 productPurchase
       "obfuscatedExternalAccountId": "xxxxx",//客户端传入的
       "regionCode": "US"
    }
    

    2.4.调用Google消耗订单接口
    Google文档地址
    接口和具体传参(post/form)

    https://androidpublisher.googleapis.com/androidpublisher/v3/
    applications/{packageName}/purchases/products/{productId}/tokens/{purchaseToken}:acknowledge?access_token={access_token}

    响应结果为空则表示消耗成功 ,可以再次请求2.3接口查看acknowledgementState的值为1则表示消耗成功。1


  1. 凡是请求googleAPI响应返回401错误为用户验证错误,建议在api最后加上access_token参数(此参数为用户的验证令牌,获取方法参考google官方文档↩︎

内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值