WebApp快捷打包
GooglePlay 内购变现
转到模块插件

敬告:此 DEMO 演示为开放测试页面,仅用于开发者快速测试体验应用功能,请严格遵守开发者协议。

♦ JS-SDK 引用方式:

♦ 普通网页 script 方式加载:下载最新版 jsBridge-v20261019.zip,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;

♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package

  1. 接入步骤(要求设备支持 GooglePlay):
  2. 1. 去 GooglePlay 控制台 管理商品;
  3. 2. 调用 setListener 设置监听器,获取并处理订单信息;
  4. 3. 调用 startConnection 连接到 GooglePlay;
  5. 4. 调用 queryProductDetails 查询商品详情,获取获取本地化信息展示在页面上(如果没有本地化差异,可忽略此步骤);
  6. 5. 调用 launchBillingFlow 发起购买请求(请在 setListener 的 onPurchasesUpdated 事件中获取支付订单信息);
  7. 6. 如果有订单漏处理,请调用 queryPurchases 查询交易(请在 setListener 的 onPurchasesUpdated 事件中获取支付订单信息);

setListener 设置监听器

• 如需接口调用事件,请设置此监听器;

jsBridge.googleIap.setListener(function(event, data) {
    switch (event) {
        //交易变更,这里获取 purchaseState, purchaseToken 等订单信息提交到服务器端处理
        case "onPurchasesUpdated": {
            // data.success: boolean 是否成功
            // data.purchases: [     订单列表,见列表项 Purchase
            //   products: Array<string> 商品 ID 列表
            //   purchaseState: number 交易状态,当为 1 (PURCHASED) 时表示支付成功,见 Purchase.PurchaseState
            //   purchaseToken: string 交易 token,请使用 GooglePlay 服务器端接口 purchases.products.get 获取订单详情,验证通过后(已支付 purchaseState == 0 && 未消耗 consumptionState == 0)给用户开通相应服务,之后调用 purchases.products.consume 消耗掉订单。
            //   purchaseTime: number 时间
            //   quantity: number 数量
            //   developerPayload: string
            //   ...更多属性请见列表项 Purchase 链接
            // ]
            // data.responseCode: number 响应码,0 (OK) 表示成功,见 BillingClient.BillingResponseCode
            // data.debugMessage: string 调试信息
            break;
        }
        //连接到 GooglePlay
        case "onBillingSetupFinished": {
            // data.responseCode: number 响应码,0 (OK) 表示成功,见 BillingClient.BillingResponseCode
            // data.debugMessage: string 调试信息
            if (data.responseCode == 0) {
                //成功
            }
            break;
        }
        //断开 GooglePlay
        case "onBillingServiceDisconnected": {
            //不要在这里主动调用 startConnection 接口,系统会自动重连!
            break;
        }
    }

    //此函数仅用于显示回调参数在本 DEMO 页面上
    showResult({
        event: event,
        data : data
    });
});

//请拉到页面底部查看回调数据信息
$('html,body').animate({ scrollTop: $('#view').offset().top }, 500);

removeListener 移除监听器

//移除监听器,不会再收到回调通知
//在需要时可重新调用 setListener
jsBridge.googleIap.removeListener();

业务接口

startConnection 连接 GooglePlay

//调用其他业务接口之前需要先连接到 GooglePlay
jsBridge.googleIap.startConnection(function(success, res) {
  if (success) {
    alert('成功');
  } else {
    const err = JSON.parse(res.errorMessage);
    //响应码见 BillingClient.BillingResponseCode
    switch (err.responseCode) {
      case 3:
        //BILLING_UNAVAILABLE
        break;
      case 5:
        //DEVELOPER_ERROR
        break;
      //...
    }
    alert(JSON.stringify(err));
  }
});

queryProductDetails 查询商品详情

products[0].productId:

products[0].productType:

products[0].dynamicProductToken:

products[1].productId:

products[1].productType:

products[1].dynamicProductToken:

//查询商品详情,获取本地化信息
jsBridge.googleIap.queryProductDetails({
  //必须,商品列表
  products: [
    {
      //必须,商品 ID
      productId: "{{queryProductDetails.products[0].productId}}",
      //商品类型,一次性商品 inapp,订阅商品 subs,默认 inapp
      productType: "{{queryProductDetails.products[0].productType}}",
      //动态商品 token
      dynamicProductToken: "{{queryProductDetails.products[0].dynamicProductToken}}"
    },
    {
      productId: "{{queryProductDetails.products[1].productId}}",
      productType: "{{queryProductDetails.products[1].productType}}",
      dynamicProductToken: "{{queryProductDetails.products[1].dynamicProductToken}}"
    }
  ]
}, function(success, res) {
  if (success) {
    // 成功时
    // res.detailsList: [  详情列表
    //   productId: string 商品 ID
    //   productType: string 商品类型
    //   name: string 名称
    //   title: string 标题
    //   description: string 描述
    // ]
    // res.unfetchedList: [  查询失败的列表
    //   productId: string
    //   productType: string
    //   getSerializedDocid: string
    //   statusCode: number
    // ]
    alert(JSON.stringify(res));
  } else {
    const err = JSON.parse(res.errorMessage);
    //响应码见 BillingClient.BillingResponseCode
    switch (err.responseCode) {
      case -1:
        //SERVICE_DISCONNECTED
        break;
      //...
    }
    alert(JSON.stringify(err));
  }
});

launchBillingFlow 发起购买请求

products[0].productId:

products[0].productType:

products[0].dynamicProductToken:

products[1].productId:

products[1].productType:

products[1].dynamicProductToken:

//发起购买请求
//与 queryProductDetails 接口的参数相同,APP 内实际上会调用 queryProductDetails 接口获取商品详情,再用商品详情发起购买。
jsBridge.googleIap.launchBillingFlow({
  //必须,商品列表
  products: [
    {
      //必须,商品 ID
      productId: "{{queryProductDetails.products[0].productId}}",
      //商品类型,一次性商品 inapp,订阅商品 subs,默认 inapp
      productType: "{{queryProductDetails.products[0].productType}}",
      //动态商品 token
      dynamicProductToken: "{{queryProductDetails.products[0].dynamicProductToken}}"
    },
    {
      productId: "{{queryProductDetails.products[1].productId}}",
      productType: "{{queryProductDetails.products[1].productType}}",
      dynamicProductToken: "{{queryProductDetails.products[1].dynamicProductToken}}"
    }
  ]
}, function(success, res) {
  if (success) {
    //请在 setListener 中监听 onPurchasesUpdated 事件,获取 purchaseState, purchaseToken 等信息提交到服务器,调用 GooglePlay 服务器端接口验证订单,给用户开通相应服务,再消耗掉订单。
    alert('请求成功');
  } else {
    const err = JSON.parse(res.errorMessage);
    //响应码见 BillingClient.BillingResponseCode
    switch (err.responseCode) {
      case -1:
        //SERVICE_DISCONNECTED
        break;
      //...
    }
    alert(JSON.stringify(err));
  }
});

queryPurchases 查询交易

productType:

includeSuspendedSubscriptions:

//查询交易,请在 setListener 中监听 onPurchasesUpdated 获取订单信息
jsBridge.googleIap.queryPurchases({
  //商品类型
  productType: "{{queryPurchases.productType}}",
  //是否包含暂停的订阅
  includeSuspendedSubscriptions: {{queryPurchases.includeSuspendedSubscriptions}}
}, function(success, res) {
  if (success) {
    //这里只表示成功发起了查询,不表示成功拿到了交易订单;订单信息需在 setListener 的 onPurchasesUpdated 中监听处理
    alert('成功');
  } else {
    alert(JSON.stringify(res));
  }
});

监听回调数据: