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 我们会更好

相关推荐
理想不理想v21 分钟前
vue经典前端面试题
前端·javascript·vue.js
不收藏找不到我22 分钟前
浏览器交互事件汇总
前端·交互
YBN娜36 分钟前
Vue实现登录功能
前端·javascript·vue.js
阳光开朗大男孩 = ̄ω ̄=36 分钟前
CSS——选择器、PxCook软件、盒子模型
前端·javascript·css
minDuck41 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
小政爱学习!1 小时前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
魏大帅。1 小时前
Axios 的 responseType 属性详解及 Blob 与 ArrayBuffer 解析
前端·javascript·ajax
花花鱼1 小时前
vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
前端·javascript·elementui
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
EricWang13582 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端