敬告:此 DEMO 演示为开放测试页面,仅用于开发者快速测试体验应用功能,请严格遵守开发者协议。
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版 jsBridge-v20261019.zip,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
- 接入步骤(要求设备支持 GooglePlay):
- 1. 去 GooglePlay 控制台 管理商品;
- 2. 调用 setListener 设置监听器,获取并处理订单信息;
- 3. 调用 startConnection 连接到 GooglePlay;
- 4. 调用 queryProductDetails 查询商品详情,获取获取本地化信息展示在页面上(如果没有本地化差异,可忽略此步骤);
- 5. 调用 launchBillingFlow 发起购买请求(请在 setListener 的 onPurchasesUpdated 事件中获取支付订单信息);
- 6. 如果有订单漏处理,请调用 queryPurchases 查询交易(请在 setListener 的 onPurchasesUpdated 事件中获取支付订单信息);
• 如需接口调用事件,请设置此监听器;
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);
//移除监听器,不会再收到回调通知 //在需要时可重新调用 setListener jsBridge.googleIap.removeListener();
业务接口
//调用其他业务接口之前需要先连接到 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));
}
});
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));
}
});
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));
}
});
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));
}
});
监听回调数据: