安卓集成Google Play支付(谷歌支付)最新版本

这篇具有很好参考价值的文章主要介绍了安卓集成Google Play支付(谷歌支付)最新版本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Google Play 支付文档:https://developer.android.com/google/play/billing/integrate

Google Play 支付库已经升级到5.0了,相对之前的版本有不少的变化,现在记录下!

接入Google Play 流程还是和之前一样:

1.去Google console 申请开发者账号  https://play.google.com/console/  

2.创建项目,上传APK

3.去Google console项目后台开始设置商品:点击左侧Products---->In-app products(内购商品)或者Subscription(订阅商品)

安卓集成Google Play支付(谷歌支付)最新版本

 4.等Google Pay Console 后台创建好商品后,客户端和后端就可以开始集成了:

  4.1:将 Google Play 结算库依赖项添加到应用的

dependencies {
    val billing_version = "5.0.0"

    implementation("com.android.billingclient:billing:$billing_version")
}

4.2:初始化支付SDK(也就是初始化BillingClient):支付过程中BillingClient用的比较多,一般项目中只创建一个BillingClient

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

初始化的时候需要一个:PurchasesUpdatedListener,PurchasesUpdatedListener是监听应用中所有购买交易的更新,这个listener非常重要,当用户购买或者订阅后都会走这个回调

private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        // To be implemented in a later section.
    }
};

4.3初始化SDK后,需要与 Google Play 建立连接,使用startConnection()方法,startConnection是异步进行,这个时候需要一个BillingClientStateListener进行回调连接的结果,当连接完成会走onBillingSetupFinished()回调,通过返回的billingResult.getResponseCode()去判断是否真正的链接成功,这个code 有下面几个值,这个BillingClientStateListener还有一个Google Play 失去连接的回调,这个时候我们需要实现重试逻辑,就是再次调用startConnection()函数。

    @Retention(RetentionPolicy.SOURCE)
    public @interface BillingResponseCode {
        int SERVICE_TIMEOUT = -3;
        int FEATURE_NOT_SUPPORTED = -2;
        int SERVICE_DISCONNECTED = -1;
        int OK = 0;
        int USER_CANCELED = 1;
        int SERVICE_UNAVAILABLE = 2;
        int BILLING_UNAVAILABLE = 3;
        int ITEM_UNAVAILABLE = 4;
        int DEVELOPER_ERROR = 5;
        int ERROR = 6;
        int ITEM_ALREADY_OWNED = 7;
        int ITEM_NOT_OWNED = 8;
    }
  public void startConnection() {
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    // The BillingClient is ready. You can query purchases here.
                    queryProductDetailsParams();
                    queryOldOrder();
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                // Google Play by calling the startConnection() method.
            }
        });
    }

 4.4 获取商品

      当startConnection()回调成功时,这个时候我们就可以根据ProductId去Google Play获取具体的商品了,这个时候一般会通过API去自己的Server 获取一个ProductIdList,然后根据后台返回的productId去Google Play 获取商品详情。

查询内购的商品:

  List<String> skuList = new ArrayList<>();
        skuList.add("ProductId01");
        skuList.add("ProductId02");
        skuList.add("ProductId03");
        skuList.add("ProductId04");
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
        mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
            @Override
            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
                // Process the result.
                Log.i(TAG, "querySkuDetailsAsync 1 onSkuDetailsResponse billingResult.getResponseCode : " + billingResult.getResponseCode() + " skuDetailsList :" + skuDetailsList);
                mInAppSkuDetailsHashMap.clear();
                if (skuDetailsList != null && skuDetailsList.size() > 0) {
                    for (SkuDetails skuDetails : skuDetailsList) {
                        mInAppSkuDetailsHashMap.put(skuDetails.getSku(), skuDetails);
                    }
                }
            }
        });

查询订阅的商品:

 // The BillingClient is ready. You can query purchases here.
        List<String> subscribeSkuList = new ArrayList<>();
        subscribeSkuList.add("Subscribe01");
        subscribeSkuList.add("Subscribe01");
        subscribeSkuList.add("Subscribe01");
        SkuDetailsParams.Builder subscribeParams = SkuDetailsParams.newBuilder();
        subscribeParams.setSkusList(subscribeSkuList).setType(BillingClient.SkuType.SUBS);
        mBillingClient.querySkuDetailsAsync(subscribeParams.build(), new SkuDetailsResponseListener() {
            @Override
            public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
                // Process the result.
                Log.i(TAG, "querySkuDetailsAsync 2 onSkuDetailsResponse billingResult.getResponseCode : " + billingResult.getResponseCode() + " skuDetailsList :" + skuDetailsList);
                mSubscribeSkuDetailsHashMap.clear();
                if (skuDetailsList != null && skuDetailsList.size() > 0) {
                    for (SkuDetails skuDetails : skuDetailsList) {
                        mSubscribeSkuDetailsHashMap.put(skuDetails.getSku(), skuDetails);
                    }
                }
            }
        });

当商品查询成功后就可以结合Server返回的商品信息给用户展示商品列表了

注意:有些 Android 设备安装的可能是旧版 Google Play 商店应用,不支持订阅等某些商品类型。在您的应用进入结算流程之前,您可以调用 isFeatureSupported() 以确定设备是否支持您要销售的商品。如需查看可支持的商品类型的列表,请参阅 BillingClient.FeatureType。

4.5.启动购买流程(开始购买)

   当用户点击某个商品时,从应用发起购买请求,请从应用的主线程调用 launchBillingFlow() 方法。此方法接受对 BillingFlowParams 对象的引用,该对象包含通过调用 queryProductDetailsAsync() 获取的相关 ProductDetails 对象。如需创建 BillingFlowParams 对象,请使用 BillingFlowParams.Builder 类。

购买内购的商品:

    public void buyInAppProduct(SkuDetails skuDetails) {
        if (skuDetails == null) {
            return;
        }
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .build();
        mBillingClient.launchBillingFlow(ActivityUtils.getTopActivity(), billingFlowParams).getResponseCode();
    }

购买订阅的商品:

  public void buySubscribeProduct(SkuDetails skuDetails) {
        if (skuDetails == null) {
            return;
        }
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .build();
        mBillingClient.launchBillingFlow(ActivityUtils.getTopActivity(), billingFlowParams).getResponseCode();
    }
// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // to get an offer token, call ProductDetails.getSubscriptionOfferDetails()
            // for a list of offers that are available to the user
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

4.6购买成功的回调

 在咱们4.2初始化SDK的时候添加了一个PurchasesUpdatedListener,当用户购买成功后Google Play 会调用 onPurchasesUpdated(),我们根据responseCode去区分用户购买成功与否.

如果成功购买商品,系统还会生成一个token,它是一个唯一标识符,表示用户及其所购应用内商品的商品 ID。可以在本地存储token,可以将令牌传递到安全的后端服务器(推荐用该方法)

    private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
        @Override
        public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
            if (billingResult == null) {
                return;
            }
            int responseCode = billingResult.getResponseCode();
            switch (responseCode) {
                case BillingClient.BillingResponseCode.OK:
                    for (Purchase purchase : purchases) {
                        SkuDetails skuDetails = null;
                        String json = purchase.getOriginalJson();
                        if (!TextUtils.isEmpty(json)) {
                            PurchaseData purchaseData = GsonConverter.fromJson(json, PurchaseData.class);
                            if (purchaseData != null) {
                                skuDetails = getSkuDetailsDependProductId(purchaseData.getProductId());
                            }
                        }
                        handlePurchase(purchase, (skuDetails != null && (BillingClient.SkuType.SUBS.equals(skuDetails.getType()))), "onPurchasesUpdated");
                    }
                    break;
                case BillingClient.BillingResponseCode.USER_CANCELED:
                    Log.i(TAG, "purchasesUpdatedListener 3 user cancel ");
                    break;
                default:
                    Log.i(TAG, "purchasesUpdatedListener 4 error  " + responseCode);
                    break;
            }
        }
    };
@Override
void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
        && purchases != null) {
        for (Purchase purchase : purchases) {
            handlePurchase(purchase);
        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
    } else {
        // Handle any other error codes.
    }
}

4.7.处理购买交易(消费订单)

当用户购买成功后,订单必须消费,如果不消费,三天后Google会自动退款,撤销购买交易。
消费内购的商品:

void handlePurchase(Purchase purchase) {
    // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
    Purchase purchase = ...;

    // 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() == BillingResponseCode.OK) {
                // Handle the success of the consume operation.
            }
        }
    };

    billingClient.consumeAsync(consumeParams, listener);
}

  消费订阅商品:订阅的处理方式与非消耗型商品类似。您可以使用 Google Play 结算库中的 BillingClient.acknowledgePurchase() 或 Google Play Developer API 中的 Purchases.Subscriptions.Acknowledge 确认订阅。所有初始订阅购买交易都需要确认。订阅续订不需要确认

BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...

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

4.8 查询历史订单,消费待处理的交易

    public void queryOldOrder() {
        mBillingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP, new PurchasesResponseListener() {
            @Override
            public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    onHandlerQueryPurchases(list, false);
                }
            }
        });

        mBillingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, new PurchasesResponseListener() {
            @Override
            public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    onHandlerQueryPurchases(list, true);
                }
            }
        });

4.9 处理多件购买交易:

Google Play 允许客户在一笔交易中购买多件相同的应用内商品,只需在购物车中指定商品数量即可(4.0 及更高版本的 Google Play 结算库支持该功能)。应用应根据指定购买数量来处理多件购买并授予权利。注意:多件购买适用于消耗型应用内商品,即可以购买、消耗及再次购买的产品。请勿为不支持重复购买的商品启用该功能。

为了实现多件购买,应用的配置逻辑需要检查商品数量。可以从以下 API 访问 quantity 字段:

  • Google Play 结算库中的 getQuantity()。
  • Google Play Developer API 中的 Purchases.products.quantity。

添加用于处理多件购买的逻辑后,需要在 Google Play 管理中心的应用内商品管理页面上为相应的商品启用多件购买功能。

注意:请确保应用接受多件购买,然后再在 Play 管理中心启用该功能。您能需要强制更新到提供支持的应用版本,然后才能对商品启用该功能。文章来源地址https://www.toymoban.com/news/detail-490681.html

到了这里,关于安卓集成Google Play支付(谷歌支付)最新版本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium操作谷歌浏览器,驱动使用最新版113版本,启动程序报403解决方式

    最近我将谷歌浏览器更新到最新版本【113.0.5672.127】,那么我们平时敲代码或者干测试的朋友知道,我们selenium的操作驱动版本也得提升到对应的,不然操作不了,但是我今天将两者都升级到最新版本后,启动程序依旧启动不了,为了解决该问题特有此博客产出,这里是java的

    2024年02月14日
    浏览(77)
  • 联想Lenovo手机平板安装谷歌服务框架Google, Play商店,安装套件GMS

    如果你的安卓手机或者平板升级了,11以上的系统,比如是安卓11,12以上的系统,那么安装谷歌play商店就非常的艰难。这是因为安卓11以上的系统对权限加以了越来越多的限制。我就今天拿联想的Z6 Pro测试,首先我到百度搜索了好几个关于安装谷歌套件的应用。然后测试下来

    2024年02月16日
    浏览(88)
  • 厉害!我的真我realme手机成功安装谷歌服务框架Google Play商店,安装谷歌三件套,超级简单

    刚到手realme真我X2 Pro手机。马上去到百度搜索下载安装谷歌play商店。我万万没有想到,我这么聪明的人居然被骗了59块钱。我在开始的时候,我尝试自己安装谷歌,但是安装出现了闪退,无法联网等毛病,没办法我只能搜QQ群。群主让我加这个QQ号,声称他可以在我的安卓手机

    2024年02月11日
    浏览(225)
  • 华为鸿蒙P60(art)系列,Mate X3安装谷歌服务框架,安装Google谷歌Play商店,harmonyos3.1

    华为全新手机P60(art)系列,折叠屏Mate X3开始发售了,搭载最新的鸿蒙harmonyOS3.1系统,那么很多朋友需要安装谷歌服务框架Google Play商店,想知道是不是支持安装框架谷歌,如何安装谷歌服务框架?谢天谢地!恭喜大家华为有一个非常重要的权限没有锁闭,这个权限可以帮助用户安装上

    2024年02月12日
    浏览(36)
  • 荣耀80系列,折叠手机magic Vs安装套件谷歌服务框架,GMS,Google Play商店

    荣耀已经发布了荣耀80,荣耀80 Pro,荣耀80 se,荣耀折叠手机magic Vs。拿到手已经知道荣耀80系列的谷歌服务框架是被锁的,不能直接安装Play商店谷歌等一系列的框架。遇到这种问题该怎么解决呢?。只有一种方法可以临时解决这个问题,解决方法就是先安装内置谷歌服务框架的虚

    2024年02月11日
    浏览(48)
  • Unity打包google play最新要求的aab文件的方法

    很久不搞打包了,没想到google又整出新的花活了,apk变成了aab,这里分享一下。 首先有几个网址很重要,这里说一下: GitHub - google/play-unity-plugins: The Google Play Plugins for Unity provide C# APIs for accessing various Play services 这个是google那一堆工具在github上的托管地址,里面有文档的跳转

    2024年02月12日
    浏览(57)
  • Vivo手机安装谷歌Play商店,安装服务框架谷歌Google,支持X90,X80,X70,X60,s系列,IQOO

    那么vivo在11月22日发布了新款手机x90,那么根据它曝光的诸多参数可以肯定的知道,x90系列(包括x90Pro,x90plus+)是支持谷歌服务框架可以安装Play商店的。和以往的vivo的手机x80,x70,x60,x系列都是支持的谷歌服务框架安装Play商店的,实际上,vivo也支持vivo的S系列、T系列、Y系列,IQOO手

    2024年02月11日
    浏览(42)
  • Google Play Install Referrer API 和 Facebook App Ads Referral 集成

    由于需要精准的获取投放广告的数据(投放的平台,防止数据的丢失等)。我们使用了Google Play Install Referrer API 和Facebook App Ads Referral结合采集数据,然后通过后台服务记录数据。最后服务器记录的数据与Facebook提供的数据对比,检查数据的真实性、丢包概况等。最后得出结论

    2024年02月16日
    浏览(43)
  • SpringBoot 集成MyBatis-Plus-Generator(最新版3.5.2版本)自动生成代码(附带集成MyBatis-Plus)

    快速入门 代码生成器配置(新) spring boot 2.3.12.RELEASE mybatis 3.5.2 mybatis plus 3.5.2 mybatis plus generator 3.5.2 mysql 8.0.17 velocity 2.3 hutool 5.8.15 druid 1.2.8 lombok 自带 示例程序选择的技术目前各项技术的稳定版本。 相信大家厌烦重复的造轮子过程,编写与数据库表对应的实体类,接着再进

    2024年02月21日
    浏览(54)
  • 华为荣耀鸿蒙3.0,2.0解决Play商店从服务器检索信息时出错,DF-DFERH-01,安装框架服务谷歌Google

    最近华为荣耀鸿蒙3.0鸿蒙2.0安装谷歌服务框架,安装play商店在解决play保护机制非保护机制认证的时候,经常会出现这样一个错误:’从服务器检索信息时出错,DF-DFERH-01’这个问题,那么在网上找了很多方法都没有解决,终于搜遍各大互联网,找到了一个这个应用华谷套件,进入

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包