Android购物-Play帐单库

图片

至今在哈布雷杂志上还没有关于它的文章吗? 没关系,有必要纠正。

有两种方法可以将应用内购买添加到您的Android应用中-旧的和新的。 直到2017年,每个人都使用了anjlab的库,但自2017年6月以来情况发生了变化,谷歌发布了自己的库用于内部购买和订阅-Play Billing Library。 现在,后者被视为标准。

播放计费库非常简单。

连接依赖项。

implementation 'com.android.billingclient:billing:1.2' 

在清单中添加权限。

 <uses-permission android:name="com.android.vending.BILLING"/> 

创建一个BillingClient实例并启动连接。

 private BillingClient mBillingClient; ... mBillingClient = BillingClient.newBuilder(this).setListener(new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       } } }).build(); mBillingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         } } @Override public void onBillingServiceDisconnected() { //    -    } }); 

进行购买后,我们进入onPurchasesUpdated()方法,在onBillingSetupFinished()方法中,您可以请求有关商品和购买的信息。

索取产品信息。 将querySkuDetails()放在onBillingSetupFinished()中

 private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private String mSkuId = "sku_id_1"; ... @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   } } ... private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); List<String> skuList = new ArrayList<>(); skuList.add(mSkuId); skuDetailsParamsBuilder.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { if (responseCode == 0) { for (SkuDetails skuDetails : skuDetailsList) { mSkuDetailsMap.put(skuDetails.getSku(), skuDetails); } } } }); } 

在代码中,您可能会注意到SKU的概念,它是什么? SKU-来自英国库存单位(商品标识)。

现在,在mSkuDetailsMap中,我们具有在此应用程序的Play控制台中注册的所有产品信息(名称,描述,价格)(稍后会详细介绍)。 注意这一行skuList.add(mSkuId); ,在这里我们从Play控制台添加了产品ID,在此处列出了您要与之互动的所有产品。 我们有一个产品— sku_id_1。

一切准备就绪,可以满足购买要求。 我们传递产品ID。 例如,通过单击按钮来运行此方法。

 public void launchBilling(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); mBillingClient.launchBillingFlow(this, billingFlowParams); } 

现在,通过运行此方法,您将看到此对话框(大约来自Internet的图片)。

图片

现在,如果用户购买商品-他们需要提供商品。 添加payComplete()方法并在其中执行操作以提供对所购买产品的访问。 例如,如果用户购买了广告断开连接,请使用此方法,以便不再显示广告。

 ... @Override public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) { if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { //       payComplete(); } } ... 

一切都很好,但是如果用户重新启动应用程序,则我们的程序对购买一无所知。 有必要请求有关它们的信息。 在onBillingSetupFinished()中进行操作

 @Override public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) { if (billingResponseCode == BillingClient.BillingResponse.OK) { //         querySkuDetails(); //   List<Purchase> purchasesList = queryPurchases(); //   //   ,    for (int i = 0; i < purchasesList.size(); i++) { String purchaseId = purchasesList.get(i).getSku(); if(TextUtils.equals(mSkuId, purchaseId)) { payComplete(); } } } } ... private List<Purchase> queryPurchases() { Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); return purchasesResult.getPurchasesList(); } 

purchasesList中,获取用户进行的所有购买的列表。

我们进行检查:如果购买了商品,请执行payComplete()

做完了 仍然需要在Play控制台中发布此应用程序并添加产品。 如何添加产品: 应用程序页面描述 > 待售内容 > 创建受限内容

注意1 :在将应用程序版本上传到Play控制台之前,您将无法添加商品。

注意2 :要查看购买对话框,您需要将内部版本上传到Play控制台,添加产品并等待一段时间(〜30分钟-1小时-3小时),直到产品更新为止,只有在出现此对话框之后,您才能将进行购买。

注意3请更正输入参数错误 SKU不能为空 -Play控制台中的产品尚未更新,请等待。

注意4 :在测试中,您可能会在日志中遇到错误错误“您的交易无法完成” ,作为响应代码6 。 出于什么原因,这种情况在我身上是未知的,但是根据我的观察,这种情况是在频繁地进行商品购买和退货之后发生的。 要解决此问题,请转到银行卡菜单并转移您的卡。 如何避免这种情况? 将您的帐户作为测试人员添加到Play控制台,并且只能从测试卡中购买。

github上的演示

给我买咖啡

(顺便说一下,通过文章下面的按钮-大约主持人,dotts系统可在Habr上运行)。

Source: https://habr.com/ru/post/zh-CN444072/


All Articles