首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android计费:如何处理未完成的购买

Android计费:如何处理未完成的购买
EN

Stack Overflow用户
提问于 2019-09-23 17:35:46
回答 1查看 2.3K关注 0票数 3

我最近一直在尝试在我的应用中实现android的应用内计费。但是当我使用“测试卡:几分钟后拒绝”时,在取消购买之前需要很多小时(~24小时)。

我已经阅读了所有关于play计费库https://developer.android.com/google/play/billing/billing_overview的文档,并遵循了它们的实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StoreActivity extends AppCompatActivity {

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_store);

       ExtendedFloatingActionButton eFabNoAds = findViewById(R.id.efab_no_ads);
        eFabNoAds.setOnClickListener((v) -> {

            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                    .setSkuDetails(MainActivity.skuDetailsList.get(0)).build();
            MainActivity.billingClient.launchBillingFlow(this, billingFlowParams);

        });

        ExtendedFloatingActionButton eFab20Hints = findViewById(R.id.efab_20hints);
        eFab20Hints.setOnClickListener((v) -> {

            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                    .setSkuDetails(MainActivity.skuDetailsList.get(1)).build();
            MainActivity.billingClient.launchBillingFlow(this, billingFlowParams);

        });    


}

public class MainActivity extends AppCompatActivity implements PurchasesUpdatedListener

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ....
        setupBillingClient();
    }

...

    private void setupBillingClient() {
        billingClient = BillingClient
                .newBuilder(this)
                .enablePendingPurchases()
                .setListener(this).build();


        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    Toast.makeText(MainActivity.this, "Success to connect Billing", Toast.LENGTH_SHORT).show();

                    SkuDetailsParams params = SkuDetailsParams.newBuilder()
                            .setSkusList(Arrays.asList("no_ads", "hints"))
                            .setType(BillingClient.SkuType.INAPP)
                            .build();

                    billingClient.querySkuDetailsAsync(params, (billingRes, skuDetailsList) -> {
                        if (billingRes.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                            MainActivity.skuDetailsList = skuDetailsList;


                        }
                    });
                }
            }

            @Override
            public void onBillingServiceDisconnected() {

                billingClient = null;
            }
        });

    }

    @Override
    public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
        //If user clicks TAP-BUY, will retrieve data here
        if (purchases != null) {

            for (Purchase p : purchases) {
                handlePurchase(p);
            }

            Toast.makeText(this, "Purchase item: " + purchases.size(), Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Purchase list empty", Toast.LENGTH_SHORT).show();

        }
    }

    AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = new AcknowledgePurchaseResponseListener() {
        @Override
        public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
            Log.i(TAG, billingResult.getDebugMessage());
        }
    };

    ConsumeResponseListener consumeResponseListener = new ConsumeResponseListener() {
        @Override
        public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
            Log.i(TAG, billingResult.getDebugMessage());

        }
    };


    void handlePurchase(Purchase purchase) {
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            // Grant entitlement to the user.

            // Acknowledge the purchase if it hasn't already been acknowledged.
            if (!purchase.isAcknowledged()) {

                if (purchase.getSku().equals("no_ads")) {
                    AcknowledgePurchaseParams acknowledgePurchaseParams =
                            AcknowledgePurchaseParams.newBuilder()
                                    .setPurchaseToken(purchase.getPurchaseToken())
                                    .build();
                    billingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);

                } else {

                    ConsumeParams consumeParams = ConsumeParams.newBuilder()
                            .setPurchaseToken(purchase.getPurchaseToken())
                            .build();

                    billingClient.consumeAsync(consumeParams, consumeResponseListener);

                }

            }
        } else if (purchase.getPurchaseState() == Purchase.PurchaseState.PENDING) {
            // Here you can confirm to the user that they've started the pending
            // purchase, and to complete it, they should follow instructions that
            // are given to them. You can also choose to remind the user in the
            // future to complete the purchase if you detect that it is still
            // pending.

            ////// DO I NEED TO DO ANYTHING HERE? ///// 

        }
    }
}

我希望我的用户能够购买多少提示,他们想要的。我不想让他们等待等待的购买被取消。

有没有什么办法可以取消一个待定的购买?或者让用户在下次尝试购买时完成购买?

EN

回答 1

Stack Overflow用户

发布于 2019-11-07 06:57:52

开发商不能取消挂起的订单。只有用户可以。

如果用户有一个挂起的订单,那么一旦调用queryPurchases(),您就可以知道了。您可以检查purchaseState和purchaseState.PENDING,表明用户有一个待定的购买。您可以以不同的方式呈现项目按钮,以提醒用户完成订单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58067519

复制
相关文章
如何使用腾讯云45元代金券购买带宽按量计费的云主机?
如何使用腾讯云45元代金券购买带宽按量计费的云主机?
贺嘉
2017/03/20
8.9K0
如何使用腾讯云45元代金券购买带宽按量计费的云主机?
新的计费系统(在线计费+准实时计费)
更多有特点的服务(入网简单、控制费用支出容易,为客户提供高额度的消费和国际漫游)成为了吸引客户的重要手段;
安德玛
2022/03/05
2.1K0
支付--出款中如何计费
出款系统来说: 付款方就是出款的源头(通常为商户),收款方就是收钱的那一方(通常为个人)
贾博岩
2018/08/02
1.2K0
支付--出款中如何计费
如何购买SSL证书?
互联网在我们的日常生活中已经熟悉的不能在熟悉了,网上购物,在线咨询等已经成为我们习以为常的行为。但这种习惯也同样给我们带来了风险,互联网安全问题越来越受到重视,信息泄露等安全问题已经严重的影响了我们的生活,而SSL证书因此而产生,保护用户数据安全,让数据在传输过程中通过加密来保障信息不被篡改。那么如何购买SSL证书呢?
柳絮云泡泡
2023/03/15
6.7K0
如何购买SSL证书?
如何购买服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
用户5048372
2022/09/19
14.2K0
Fundebug计费标准解释:事件数是如何定义的?
Fundebug提供了多个不同档位的付费套餐,其主要收费标准是按照事件数来确定的。当前Fundebug各个付费套餐每月的事件数及其价格如下表:
Fundebug
2019/12/30
6230
解的个数 未完成
#include<iostream> #include<cstdio> using namespace std; int x,y; int tot=1; int a,b,c,p,q,r,s; int exgcd(int a,int b,int & x,int & y) {     if(b==0)     {         x=1;         y=0;         return a;     }     int r=exgcd(b,a%b,x,y);     int tmp;     tmp=x
attack
2018/04/12
6690
用户如何域名购买呢?购买域名需要注意什么?
随着网络时代的快速发展,域名也随之发展壮大了起来,访问网页一般都是通过域名这个载体实现的,如果用户自己建设了一个网站,或者公司开发了一个网站的话,必须要拥有自己的域名才可以,那么用户如何域名购买呢?购买域名需要注意什么?
用户8739990
2021/08/13
27.7K0
付费广告的计费模式
记一下互联网广告术语 CPC:按点击付费(Cost Per Click) 根据广告被点击的次数收费 CPA:按转化动作付费(Cost Per Action) 按广告投放实际效果计价方式的广告,即按回应的有效问卷或注册来计费,而不限广告投放量 CPS:销售额付费(Cost Per Sale) 实际销售产品数量来换算广告刊登金额 CPD:按天付费(Cost per day) 按天收费,实际的广告合作中根据行业不同还包括Cost per Download的缩写含义,意思是依据实际下载量收费 CPT:按时间收费(
薛定喵君
2019/11/05
1.7K0
如何购买 GPU 服务器?
GPU 云服务器支持四种镜像类型:公共镜像、自定义镜像、共享镜像、镜像市场。具体详情请单击 了解镜像 >>。 对于刚开始使用腾讯云的用户,可选择【公共镜像】,并根据需要挑选版本。
用户5915919
2019/09/16
13.7K0
如何购买 GPU 服务器?
如何购买合适的工业机器人
我们经常提到工业机器人,从字面上来说,机器人这个词汇不难理解,但是如果真正想要买一台工业机器人的话,就还得需要知道更多。本文将为你介绍几个在购买工业机器人时需要了解的主要参数。 工业机器人应用 首先要知道的是你的机器人要用于何处。这是你选择需要购买的机器人种类时的首要条件。如果你只是要一个紧凑的拾取和放置机器人,Scara机器人是不错的选择。如果想快速放置小型物品,Delta机器人是最好的选择。如果你想机器人在工人旁边一起工作,你就应该选择协作机器人。 本文主要的方向是工业机器人。这一类的机器人适用于非常多
机器人网
2018/04/12
1.3K0
如何购买合适的工业机器人
如何购买云服务器 服务器购买平台怎么找
从事互联网工作的小伙伴应该都知道,网站除了需要程序外,还需要域名跟空间。空间也可以用云服务器,如果搭建的网站较大,可以考虑使用云服务器,尤其是对大企业而言,空间的带宽以及绑定域名有限,不利于大门户网站的使用。那么如何购买云服务器呢?
用户8715145
2021/09/17
28.4K0
如何购买云服务器 服务器购买平台怎么找
光模块购买该如何选择?
经常买光模块的人都知道,现在市场上生产光模块技术门槛越来越低,市面上各种光模块愈来愈多,如原装的,假原装的,兼容的,二手的。这些模块之间的兼容性也影响了使用者网络的质量。光纤模块通常需要确认兼容码,因为目前市面上存在2种,一种是高性能的兼容模块,一种是原交换机品牌光模块.两者之间的价格差距较大。
晟科通信
2020/06/10
3.1K0
光模块购买该如何选择?
如何购买比特币,比特币的价值何在?
对于不玩游戏的人来说,刚一听到比特币这个名字还以为是和游戏币的价值差不多,只能在游戏里使用的虚拟货币,经过稍微的了解后发现原来比特币现下这么火还是有一定的原因的。如何购买比特币,比特币的价值何在?来了解一下吧!
用户8739990
2021/07/12
9130
如何购买比特币,比特币的价值何在?
如何购买 AMD GPU 服务器?
GPU 渲染型 GA2 支持四种镜像类型:公共镜像、自定义镜像、共享镜像、服务市场。
用户5915189
2019/09/13
11.7K0
如何购买 AMD GPU 服务器?
学生服务器如何购买?
腾讯云学生服务器适用于建站、学习等轻量级web应用场景,主要是为了帮助想从事计算机行业的学生入门云计算,获得更多的实践经验,那学生服务器如何购买呢? 腾讯云学生服务器地址 https://cloud.
return null
2019/09/02
10.9K0
【SeeMusic】购买付费版本 ( 进入购买页面 | 购买流程 )
【SeeMusic】下载安装并注册 SeeMusic 软件 【SeeMusic】购买付费版本 ( 进入购买页面 | 购买流程 )
韩曙亮
2023/03/29
10.1K0
【SeeMusic】购买付费版本 ( 进入购买页面 | 购买流程 )
如何购买腾讯云服务器
从实践案例出发,描述如何购买腾讯云的服务器。云服务器(Cloud Virtual Machine)是一种专业的高性能高稳定的弹性伸缩的计算服务,您可以在几分钟内轻松获取并配置您的CVM计算实例。
腾讯云开发者社区
2016/10/20
117.3K4
如何购买腾讯云服务器
点击加载更多

相似问题

Android计费空购买列表

113

Android应用内计费,缺失购买

32

Android:如何使用Android计费4.0.0恢复之前购买的内容

185

购买android计费项目,但没有连接。

11

Android应用计费购买历史查询

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文