Google 预注册奖励 你不知道的哪些事情

团队介绍

作者:徐庆

团队:坚果派 公众号:"大前端之旅" 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。欢迎合作。

前言:

各位同学 大家好有段时间没有给大家更新文章 ,最近u8sdk 群里面有同学问到Google预注册的功能 因为我之前有做 所以就在这里分享给大家 希望能帮助到各位工作和学习

预注册和内购有关系的 大家最好先去阅读一下内购支付的文章 juejin.cn/post/724517...

我们先看看官方说明

官方文档说明:

support.google.com/googleplay/...

为应用开放预注册服务以提升用户认知度

在通过 Google Play 发布应用和游戏之前,您可以选择在特定国家/地区开放预注册服务,提升当地用户对应用和游戏的好感和认知度。

当您为应用或游戏开放预注册服务后,用户便可在商品详情页面上了解和预注册该应用或游戏。之后当您发布应用或游戏时,所有预注册用户都会收到 Google Play 推送的安装通知。在符合条件的设备上,系统还会在发布当日自动安装相应应用或游戏。

注意: 已安装测试版应用的用户不会收到推送通知。

第 1 步:为开展预注册活动做准备

在 Play 管理中心内设置预注册活动之前,请先仔细阅读预注册要求与准则,以及我们建议的预注册筹备活动。

要求与准则

为筹备预注册活动而需预先采取的措施

第 2 步:指定预注册支持的设备

您可以上传 app bundle 来指定用户可使用哪些设备预注册您的应用。Play 管理中心会通过您的应用清单来了解预注册支持哪些设备。

注意:

  • 您在预注册轨道中上传的所有 app bundle 仅用于指定支持的设备,而不会向用户发布。
  • 如果您的应用包含应用内商品,请确保您上传的 app bundle 中至少有一个包含 Google Play 结算库

指定用户可以使用哪些设备预注册您的应用

第 3 步:添加向用户开放预注册的国家/地区

您可以选择您的应用要向哪些国家和地区的用户开放预注册。

注意: 此处的国家/地区是指用户在 Google Play 上注册的国家或地区,而非用户实际所处的国家/地区。

添加开放预注册的国家/地区

第 4 步:向用户提供预注册奖励(可选)

通过创建预注册奖励,您可以为预注册您的应用或游戏的用户免费提供应用内商品。预注册奖励的运作方式与促销活动类似。不过,对于预注册奖励,用户无需输入促销代码,而是在应用商品详情中选择预注册按钮后才会获得免费商品。

关于预注册奖励的一些重要注意事项

技术实现要求

创建并设置预注册奖励

移除您的预注册奖励

在应用发布前测试预注册奖励的发放情况

第 5 步:开始预注册活动

在指定了受支持设备,选择了要开展活动的国家/地区并确定了是否提供预注册奖励之后,就可以开始预注册活动了。

开放预注册之后,请务必在各个推广渠道中使用该应用或游戏的预注册商品详情网址来宣传您的预注册活动。您可在第三方网站、社交媒体、新闻报道和电子邮件简报等常见渠道中使用深层链接加以宣传。

开始预注册活动

预注册管理

当您的预注册活动开始并正常开展后,您可能会发现一系列管理活动对您有所帮助,例如查看统计信息、查看该活动在不同国家或地区的剩余时间、开展测试。在您准备发布应用或游戏时,这些活动可能会对您有所帮助。

查看预注册活动的关键效果指标

查看预注册的汇总统计信息

在结束预注册活动后发布应用或游戏

在预注册期间进行测试

相关内容

  • 您可以访问 Play 学院,详细了解如何利用预注册活动最大限度地提升发布前营销的成效。

具体的代码实现

正常的内购支付流程

1 先去服务器去下单 拿到orderID

这里因为是demo 我就没写了 直接写死在全局变量大家自己可以去补一下逻辑

连接Google查询并调起支付

scss 复制代码
private  void  toGooglePay(){
    String productId ="4390_1_1";
            //"com.testgame.099";

    List<QueryProductDetailsParams.Product> productList= new ArrayList<>();
    productList.add(QueryProductDetailsParams.Product.newBuilder()
            .setProductId(productId)
            .setProductType(BillingClient.ProductType.INAPP)
            .build());
    QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder().
            setProductList(productList)
            .build();
    if(billingClient!=null){
        billingClient.queryProductDetailsAsync(
                queryProductDetailsParams,
                new ProductDetailsResponseListener() {
                    public void onProductDetailsResponse(BillingResult billingResult,
                                                         List<ProductDetails> productDetailsList) {
                        if(productDetailsList!=null&&productDetailsList.size()>0){


                            ProductDetails productDetails=productDetailsList.get(0);
                            saveProductInfo(productDetails);
                            List<BillingFlowParams.ProductDetailsParams> productDetailsParamsList= new ArrayList<>();
                            productDetailsParamsList.add(BillingFlowParams.ProductDetailsParams.newBuilder()
                                    .setProductDetails(productDetails)
                                    .build());
                            String   obfuscatedAccountid=qecrnGetAndroidId(context);
                             String  obfuscatedProfileId=orderId;
                            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                                    .setProductDetailsParamsList(productDetailsParamsList)
                                    .setObfuscatedAccountId(obfuscatedAccountid) //透传Androidid
                                    .setObfuscatedProfileId(obfuscatedProfileId) // 透传订单号
                                    .build();
                            billingClient.launchBillingFlow((Activity) context, billingFlowParams);
                        }else {
                            Toast.makeText(context,"商品ID无效",Toast.LENGTH_SHORT).show();
                        }
                    }
                }
        );
    }
}

支付的时候设置透传参数

scss 复制代码
.setObfuscatedAccountId(obfuscatedAccountid) //透传Androidid
.setObfuscatedProfileId(obfuscatedProfileId) // 透传订单号

处理支付回调的

ini 复制代码
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                && purchases != null) {
            for (Purchase purchase : purchases) {
                handlePurchase(purchase);
                String signedData = purchase.getOriginalJson();
                String signature = purchase.getSignature();
                String purchaseToken = purchase.getPurchaseToken();
                String orderid = purchase.getOrderId();
                Log.e(TAG, "getPurchaseToken: "+ purchase.getPurchaseToken() );
                Log.e(TAG, "getSignature: "+ purchase.getSignature() );
                Log.e(TAG, "getSignature: "+ purchase.getSignature() );
            }
        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
        } else {
        }
    }
};

处理补单的

scss 复制代码
private  void  queryPurchasesAsync(){
    if(billingClient!=null){
        if(!billingClient.isReady()){
            Toast.makeText(context,"BillingClient is not ready",Toast.LENGTH_SHORT).show();
        }
        billingClient.queryPurchasesAsync(
                QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.INAPP).build(),
                new PurchasesResponseListener() {
                    public void onQueryPurchasesResponse(
                            BillingResult billingResult,
                            List<Purchase> purchases) {
                        if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK){
                            if(purchases!=null&&purchases.size()>0){
                                for (Purchase purchase:purchases){

                                    String signedData = purchase.getOriginalJson();
                                    String signature = purchase.getSignature();
                                    String purchaseToken = purchase.getPurchaseToken();
                                    String orderid = purchase.getOrderId();
                                    //如果查询到订单号为空就是预注册 反之就是正常内购支付的
                                    if(TextUtils.isEmpty(orderid)){

                                    }else {

                                    }
                                    handlePurchase(purchase);
                                }

                            }
                        }
                    }
                }
        );
    }
}

预注册奖励

其实预注册逻辑并不难需要我们的Google应用创建的时候开启了预注册奖励 并且预注册是不需要到我们服务器去下订单 所以我们逻辑就更简单了
我们只需要在进入游戏的时候调用 billingClient.queryPurchasesAsync 方法查询回调方法里面 Purchase 对象集合是否存在 如果存在并且//如果查询到订单号为空就是预注册 反之就是正常内购支付的

scss 复制代码
private  void  queryPurchasesAsync(){
    if(billingClient!=null){
        if(!billingClient.isReady()){
            Toast.makeText(context,"BillingClient is not ready",Toast.LENGTH_SHORT).show();
        }
        billingClient.queryPurchasesAsync(
                QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.INAPP).build(),
                new PurchasesResponseListener() {
                    public void onQueryPurchasesResponse(
                            BillingResult billingResult,
                            List<Purchase> purchases) {
                        if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK){
                            if(purchases!=null&&purchases.size()>0){
                                for (Purchase purchase:purchases){

                                    String signedData = purchase.getOriginalJson();
                                    String signature = purchase.getSignature();
                                    String purchaseToken = purchase.getPurchaseToken();
                                    String orderid = purchase.getOrderId();
                                    //如果查询到订单号为空就是预注册 反之就是正常内购支付的
                                    if(TextUtils.isEmpty(orderid)){

                                    }else {

                                    }
                                    handlePurchase(purchase);
                                }

                            }
                        }
                    }
                }
        );
    }
}

重新组装数据

我们在区服登录的时候只能拿到部分游戏里面信息 例如

服务器id serverid

角色id roleid

角色名称 rolename

角色等级 rolelevel

拿到上面的数据和我们查询到数据

String signedData = purchase.getOriginalJson();

String signature = purchase.getSignature();

String purchaseToken = purchase.getPurchaseToken();

String orderid = purchase.getOrderId(); 去服务器校验即可 校验完成后消耗掉 然后服务器发货即可

最后总结:

这个预注册奖励的功能并不难主要还是围绕内购支付的补单查询方法展开 我们需要配合我们实际的需求出发来处理代码 这个具体就看每个公司的需求了 今天的文章就讲到这里 也希望大家平时讨论技术能和平的交流 能不去麻烦别人就最好多在网上搜一搜 还有如果我本人在技术群里有不礼貌的地方希望大家指出 我一定改正 最好希望文章能帮助到各位同学工作和学习 2024 我们会更好

相关推荐
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
(⊙o⊙)~哦4 小时前
JavaScript substring() 方法
前端
无心使然云中漫步4 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者4 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_5 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋6 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120536 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢6 小时前
【Vue】VueRouter路由
前端·javascript·vue.js
随笔写7 小时前
vue使用关于speak-tss插件的详细介绍
前端·javascript·vue.js
史努比.7 小时前
redis群集三种模式:主从复制、哨兵、集群
前端·bootstrap·html