jjzjj

android - 我怎样才能在android中实现恢复购买

coder 2023-12-21 原文

感谢您访问我的页面。

几天前,我在应用计费中开发了一个简单的安卓游戏。

现在要实现恢复购买的功能,不知道怎么点。

我用谷歌搜索了几天,找到了很多帮助它的链接,但它们现在对我不起作用。

请让我知道如何以编程方式进行。

我在哪里可以找到恢复购买的样本?

我已经在应用程序购买中实现但没有恢复购买。

我使用的是 Android Studio 1.5.1。

我提到了 http://www.techotopia.com/index.php/An_Android_Studio_Google_Play_In-app_Billing_Tutorial在应用程序购买中实现。

请帮帮我:(

提前致谢。

最佳答案

如果您使用 v3 实现了 InApp Purchase,则无需担心恢复 Purchase 的实现。您可以查询库存并捕获现有的采购信息。请检查实现。

我在这里所做的是我已经有了一个购买模块。当我完成购买时,我会将信息发送到我们的服务器。重新登录或返回应用程序后,服务器将发送当前用户的购买信息,无论他是否已购买。如果服务器给出否定结果,我将检查查询库存是否有任何现有购买。为此,我在 MainActivity onCreate() 中使用了以下代码。

 mHelper = new IabHelper(this, base64EncodedPublicKey);
        mHelper.enableDebugLogging(true);
        Log.d(TAG, "Starting setup.");
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                Log.d(TAG, "Setup finished.");
                if (!result.isSuccess()) {
                    Log.e(TAG, "In App Set UP error:: Please check gmail account settings/ Credit Card Info etc");
                    return;
                }
                if (mHelper == null) return;
                mBroadcastReceiver = new IabBroadcastReceiver(MainActivity.this);
                IntentFilter broadcastFilter = new IntentFilter(IabBroadcastReceiver.ACTION);

                registerReceiver(mBroadcastReceiver, broadcastFilter);

                Log.d(TAG, "Setup successful. Querying inventory.");
                if (mSupplier.getmSubscriptionStatus() == 0) { // This is the Status given from Local Server 0- UnScubscribed User, 1- Subscribed User
                    mHelper.queryInventoryAsync(mGotInventoryListenerForPurchase);
                }
            }
        });

在结果中,您可以识别现有的购买信息。

IabHelper.QueryInventoryFinishedListener mGotInventoryListenerForPurchase = new IabHelper.QueryInventoryFinishedListener() {
            public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
                try {
                    Log.d(TAG, "Query inventory For Purchase finished.");
                    String payload = // Your developer payload
                    if (mHelper == null) return;
                    if (result.isFailure()) {
                        Log.v(TAG, "PURCHSE RESULT ERROR- NO PURCHASE AVAILABLE");
                        return;
                    }
                    Log.v(TAG, "Query inventory For Purchase was successful.");
                    if (mSkuDetailList == null || mSkuDetailList.isEmpty()) {
                        Log.v(TAG, "SKU INFO FROM LOCAL SERVER- UNABLE TO PURCHASE");
                        return;
                    }
                    Purchase premiumPurchase = null;
                    for (IabSkuDetailModel data : mSkuDetailList) {

                        // Filter the purchase info using SKU:::
                        premiumPurchase = inventory.getPurchase(data.getmPackageName());
                        if (premiumPurchase != null) {
                            break;
                        }
                    }
                    if (premiumPurchase == null) {
                        Log.v(TAG, "NO Available Purchase for this user");
                        return;
                    }
                    if (verifyDeveloperPayload(premiumPurchase)) {
                        Log.v(TAG, "Purchase is there already ::: developer payload is Matching:: This need to update Local Server: No need to purchase agian");
                        if (premiumPurchase.getSku().equalsIgnoreCase(mSelectedSku)) {
                            IabPurchaseUpdateReq request = new IabPurchaseUpdateReq();
                            request.setmPurchaseToken(premiumPurchase.getToken());
                            request.setmUserId("" + mSupplier.getmUserId());
                            request.setmPublicKey(IabConstants.IAB_RSA_PUBLIC_KEY);
                            request.setmSignature(premiumPurchase.getSignature());
                            request.setmSubscriptionId(premiumPurchase.getSku());
                            request.setmPurchaseObj(premiumPurchase.getOriginalJson());

                            //Update "result to local Server"
                        } else {
                            Log.v(TAG, "SKU mismatch ::: ");
                        }
                    } else {
                         Log.v(TAG, "Developer payload error:: Wrong Purchase");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

关于android - 我怎样才能在android中实现恢复购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35271870/

有关android - 我怎样才能在android中实现恢复购买的更多相关文章

  1. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  2. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  3. ruby-on-rails - 如何在 Ruby on Rails 中实现无向图? - 2

    我需要在RubyonRails中实现无向图G=(V,E)并考虑构建一个Vertex和一个Edge模型,其中Vertex有_多条边。由于边恰好连接两个顶点,您将如何在Rails中执行此操作?您是否知道任何有助于实现此类图表的gem或库(对重新发明轮子不感兴趣;-))? 最佳答案 不知道有任何现有库在ActiveRecord之上提供图形逻辑。您可能必须实现自己的Vertex、EdgeActiveRecord支持的模型(请参阅Rails安装的rails/activerecord中的vertex.rb和edge.rb/test/fixtur

  4. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  5. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  8. ruby-on-rails - rspec - 我怎样才能让 "pendings"有我的文本而不仅仅是 "No reason given" - 2

    我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason

  9. ruby - 为什么必须明确指定 2 个参数才能 curry :> - 2

    考虑这个,它工作正常::>.to_proc.curry(2)[9][8]#=>true,because9>8然而,即使>是一个二元运算符,如果没有指定的元数,上面的代码将无法工作::>.to_proc.curry[9][8]#=>ArgumentError:wrongnumberofarguments(0for1)为什么两者不等价?注意:我特别想用提供的一个参数创建中间柯里化(Currying)函数,然后然后调用然后用第二个参数调用它。 最佳答案 curry必须知道传入的过程的数量,对吧?:-1来自arity的负值令人困惑,但基本上

  10. ruby - 在 Ruby 中实现 to_int 和 to_str 的后果 - 2

    我haveaclass它公开了一个字符串值和一个int值(分别是命令输出和退出代码)。除了通过to_s和to_i公开它们之外,我还使用to_str和to_int,如下所示:classStatusdefto_s@outputendalias:to_str:to_sdefto_i@status.exitstatusendalias:to_int:to_iend我的想法是能够在尽可能多的情况下使用这个对象。将其强制转换为字符串或整数会增加可用性。例如,我可以将对象与字符串连接起来:a_string="Outputwas:"+results(我想用这个作为int强制转换的例子,但是Fixnum

随机推荐