集成Google应用内 支付 或者 订阅

要集成Google应用内支付 先要了解文档

集成文档: https://developer.android.google.cn/google/play/billing/integrate

1.创建Google应用

Google play 应用平台: https://play.google.com/console/u/0/developers/6529195851168790505/app-list
创建完应用后 进入应用详情 这个里面创建订阅或者消耗类型商品 获取商品ID用于代码中查询商品进行吊起Google支付
请添加图片描述

2.付费使用测试卡

这个里面添加上你测试使用的Google账号然后回车添加后保存即可
请添加图片描述

3.集成Google应用内支付或者订阅

先导入依赖库

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

然后初始化 BillingClient

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // 支付后回调
    }
};

private BillingClient billingClient = BillingClient.newBuilder(context)
    .setListener(purchasesUpdatedListener)
    .enablePendingPurchases()
    .build();

然后与Google建立连接并且查询商品然后吊起Google支付或者订阅
在这里要先搞清楚一点 消耗品是购买商品一次性的 非消耗品是订阅

billingClientAfter.startConnection(new BillingClientStateListener() {
            @SuppressLint("LongLogTag")
            @Override
            public void onBillingServiceDisconnected() {
                // 连接断开
                Log.d(TAG, "onBillingServiceDisconnected: 连接断开");
            }

            @Override
            public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
                // 连接成功
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {

                    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                    List<String> skuList = new ArrayList<>();
                    skuList.add(str);//str是商品ID
                    skuList.add("gas");// 这个参数不能为空,值随便传
                    if (//这里判断是商品订阅还是商品购买) {
                        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);//针对一次性商品
                    } else {
                        params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS);//针对订阅
                    }

                    //商品查询
                    billingClientAfter.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
                        @SuppressLint("LongLogTag")
                        @Override
                        public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
                            if (list != null && list.size() > 0) {
                                for (SkuDetails skuDetails : list) {
                                    String sku = skuDetails.getSku();
                                    // 唤起GooglePay支付
                                    if (str.equals(sku)) {
                                        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                                                .setSkuDetails(skuDetails)
                                                .build();
                                        billingClientAfter.launchBillingFlow(ExhibitionPaymentActivity.this, flowParams);
                                    }
                                }
                            } else {
                                Log.d(TAG, "onSkuDetailsResponse: 未找到订阅商品");
                            }
                        }
                    });
                } else {
                    // TODO 连接失败
                }
            }
        });

回调中还有一些内容我都列出来 方便理解

private PurchasesUpdatedListener purchasesUpdatedListenerAfter = new PurchasesUpdatedListener() {
        @SuppressLint("LongLogTag")
        @Override
        public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
            int responseCode = billingResult.getResponseCode();
            if (responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
                for (Purchase purchase : purchases) {

                  

                    if (//这里判断是商品订阅还是商品购买)) {
                   		//这是消耗商品
                        handlePurchaseBUY(purchase); //这个方法是说表明某件一次性商品已被消耗
                    } else {
                    	//这是订阅商品
                        handlePurchase(purchase);//这个方法是订阅判断用户是否以及订阅 如果没订阅就是用来确认交易商品
                    }
					
					// 这里是获取支付后订单号
                    String orderId = purchase.getOrderId();

                    int purchaseState = purchase.getPurchaseState();//判断用户是否付款了 2代办 1付款 0未指定
                    if (purchaseState == Purchase.PurchaseState.PURCHASED) {
                    //用户如果付款了在这里面做其他操作
					
					//这是非常重要的一步就是结束商品回调 要是不加这一步 应用内如果有多处商品购买的代码 这个回调就会瞎跑 加上就行了
					billingClientAfter.endConnection();
					
                    } else {
                        UIUtils.showToast(getString(R.string.支付失败));
                    }
                }
                Log.d(TAG, "onPurchasesUpdated: 支付完成");
            } else if (responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
                // Handle an error caused by a user cancelling the purchase flow.
                Log.d(TAG, "onPurchasesUpdated: 用户取消了支付");
            } else if (responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
                // Handle an error caused by a user cancelling the purchase flow.
                Log.d(TAG, "onPurchasesUpdated: 商品已经购买过(重复购买了此商品,如果需要支持重复购买,需要将商品购买成功后消费掉)");
            } else {
                // Handle any other error codes.
            }
        }
    };

大部分内容都加注解了 对照着Google集成都文档一看就明白了

//这是确认消耗类型商品被消耗都方法
void handlePurchaseBUY(Purchase purchase) {
        // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
        // Verify the purchase.
        // Ensure entitlement was not already granted for this purchaseToken.
        // Grant entitlement to the user.
        ConsumeParams consumeParams =
                ConsumeParams.newBuilder()
                        .setPurchaseToken(purchase.getPurchaseToken())
                        .build();
        ConsumeResponseListener listener = new ConsumeResponseListener() {
            @Override
            public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    // Handle the success of the consume operation.
                }
            }
        };
        billingClientAfter.consumeAsync(consumeParams, listener);
    }
//这是对于订阅商品的确认方法
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListenerAfter;

    void handlePurchase(Purchase purchase) {
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            if (!purchase.isAcknowledged()) {
                AcknowledgePurchaseParams acknowledgePurchaseParams =
                        AcknowledgePurchaseParams.newBuilder()
                                .setPurchaseToken(purchase.getPurchaseToken())
                                .build();
                billingClientAfter.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListenerAfter);
            }
        }
    }

关于Google应用内支付或者订阅大致内容就是这些了

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真庆幸.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值