远飞闲记

阅读、思考、技术

Android Google Play 内购服务器订单校验

🗓️发布日期:2019-12-04 · 🗺️总字数: 904 字 · ⏱️阅读时间: 2 Minute

最近我们游戏接入Google Play应用商店里面,有需求要做应用内购商品(In App Purchases),大致需求流程是客户端请求得到返回的数据需要服务器端进行校验并给玩家增加对应的消耗内商品,接入SDK的过程中和客户端小伙一起踩坑不少,也和小伙们吐槽了一下Android初次接入相比iOS还是比较复杂的,这里也记录一下Android内购在Nodejs服务器下校验订单是否有效的流程和Google Play平台上的配置;

Google Play 配置

配置测试账号:

进入Google Play Console 点击设置,配置内购沙盒测试账号,参见下图:

切记: 这里许可测试账号一定要配置

设置API权限和开通API服务

配置 API权限 关联项目,如下图 :

启用需要的API和服务

点击 启用API和服务 进入 API库页面 搜索 “Google Play Android Developer API” 点击进入详情页面,点击 启用 打开可以OAuth后可调用in app purchases用的API;

设置服务账号

  1. 进入 IAM和管理:服务器账号

  2. 点击 创建服务账号 ,进入服务设置如下图:

  3. 设置访问角色对项目的访问权限,这里我们设置 =Project:浏览者=

  4. 设置授权用户访问服务的权限需要的私钥 : 点击创建私钥 根据自己项目需要私钥文件类型,这里我们选择JSON文件,然后点击创建按钮会自动下载 .json 文件

Nodejs 服务器 Android In app purchases订单校验

  1. 安装所需的依赖库 Google Api Nodejs Client

    npm install googleapis --save
  2. 读取设置下载的 访问授权.json 文件:

      let content = require('fs').readFileSync("App授权文件.json")
      let access_json = JSON.parse(content.toString());
  1. 调用JWT认证授权接口进行授权认证:

      const androidpublisher = google.androidpublisher("v2");
      let authClient = new google.auth.JWT({
    email:access_json.client_email,
    key:access_json.private_key,
    scopes:[
       "https://www.googleapis.com/auth/androidpublisher"
    ]
      })
    
      authClient.authorize((err,tokens)=>{
    if(err){
       console.error(err)
       return;
    }
    console.log("token:",tokens);
    })
  2. 调用 androidpublisher.purchases 参数进行订单的校验,异步调用后返回参数参见(Purchases.products):

      let params={auth:authClient, //客户端认证后的Instance
    packageName: "",//包名
    productId: "", //返回的商品名
    token: "" //返回的token字段 }
    androidpublisher.purchases.products.get(params).then(respos=>{
        console.log(respos.data)
        //data数据结构如下:
        //{
        //   "kind": "androidpublisher#productPurchase",
        //   "purchaseTimeMillis": long,
        //   "purchaseState": integer,
        //   "consumptionState": integer,
        //   "developerPayload": string,
        //   "orderId": string,
        //   "purchaseType": integer,
        //   "acknowledgementState": integer
        // }
    }).catch(err=>{
        console.log('error:',err.errors)
    })

总结

内购配置过程花费的时间远远大于写代码调用接口的时间,总之该踩👟的坑还是要踩的,踩过的坑做个记号避免以后在浪费时间去踩。

🏷️ Android