Google Play Billing Library v4无服务端实现应用内购买恢复方案咨询
基于Google Play Billing Library v4的Java版最简恢复购买实现
核心查询方法说明
你不想使用的废弃方法是同步的queryPurchases (String skuType),官方推荐的替代方案是异步方法queryPurchasesAsync,完全满足你重装/换设备时查询当前有效已购商品的需求,无需服务端支持。
代码实现示例
1. 查询当前有效已购商品
你只有3个内购商品的话,统一用BillingClient.SkuType.INAPP类型查询即可,如果包含订阅则额外追加BillingClient.SkuType.SUBS类型的查询:
billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder() .setProductType(BillingClient.SkuType.INAPP) .build(), new PurchasesResponseListener() { @Override public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !list.isEmpty()) { for (Purchase purchase : list) { // 校验购买状态和签名 if (verifyPurchaseValid(purchase)) { // 匹配你的3个商品sku,开通对应权限 switch (purchase.getSkus().get(0)) { case "你的商品sku1": // 给用户开通商品1对应的权限,本地存储状态 break; case "你的商品sku2": // 开通商品2权限 break; case "你的商品sku3": // 开通商品3权限 break; } } } } } });
2. 本地购买校验方法(防止本地篡改)
把你Google Play后台的公钥填入即可完成本地校验,无需调用服务端接口:
private boolean verifyPurchaseValid(Purchase purchase) { // 先判断购买状态是否为已购买 if (purchase.getPurchaseState() != Purchase.PurchaseState.PURCHASED) { return false; } // 校验签名,BASE_64_PUBLIC_KEY替换为你Google Play控制台获取的应用公钥 try { PublicKey publicKey = Security.generatePublicKey(BASE_64_PUBLIC_KEY); return Security.verifyPurchase(publicKey, purchase.getOriginalJson(), purchase.getSignature()); } catch (Exception e) { e.printStackTrace(); return false; } }
常见疑问说明
- 必须要有服务端吗?不需要。如果你的应用没有强风控、跨平台校验、订阅状态自动同步的需求,本地校验完全可以覆盖你仅3个商品的简单场景。Google Play Developer API适用于更复杂的商业化场景,你的需求不需要额外搭服务端。
- 为什么不用
queryPurchaseHistoryAsync?该接口返回的是所有历史购买记录,包含已经退款、已消耗、过期的购买记录,确实不适合用来判断当前用户的有效购买权限,你排除该方法的判断是正确的。
内容的提问来源于stack exchange,提问作者Il'ya Freqnsy
相关产品推荐
相关产品推荐

