标签: android-billing

为什么使用应用内结算设置开发人员有效负载很重要?

我正在使用应用内结算API的第3版.我有一个单独的,管理的,非消耗品.我还没有在我的应用程序中发布此功能,所以我想在购买之前决定购买有效负载内容.

来自"安全最佳实践":

在发出购买请求时设置开发者有效负载字符串

使用应用内结算版本3 API,您可以在向Google Play发送购买请求时添加"开发人员有效负载"字符串令牌.通常,这用于传递唯一标识此购买请求的字符串标记.如果您指定字符串值,Google Play会将此字符串与购买回复一起返回.随后,当您对此次购买进行查询时,Google Play会将此字符串与购买详细信息一起返回.

您应该传入一个字符串令牌,以帮助您的应用程序识别进行购买的用户,以便您以后可以验证这是该用户的合法购买.对于消耗品,您可以使用随机生成的字符串,但对于非消耗品,您应使用唯一标识用户的字符串.

当您从Google Play获得回复时,请确保验证开发人员有效内容字符串是否与之前使用购买请求发送的令牌相匹配.作为进一步的安全预防措施,您应该在自己的安全服务器上执行验证.

无论是对还是错,我决定采取"进一步的安全预防措施"来设置服务器来执行购买验证.而且我没有存储我自己的购买记录 - 我总是称之为计费API.那么我真的有理由进行有效负载验证吗?验证API本身肯定会在报告购买项目之前验证用户的身份,如果攻击者已经破坏了设备(应用程序或Google Play API),我认为没有任何额外检查的好处用户在设备上识别可以轻易绕过的地方.或者有没有理由这样做,我没想到?

android android-billing

75
推荐指数
6
解决办法
2万
查看次数

Android应用内结算:无法启动异步操作,因为另一个异步操作(正在进行中)

我正在使用IabHelperGoogle的教程推荐的实用程序类,我受到这个错误的打击.显然IabHelper无法同时运行多个异步操作.我甚至设法通过尝试开始购买,同时库存盘点仍在进行中.

我已经尝试onActivityResult在我的主类中实现这里建议,但我甚至在错误命中之前都没有调用该方法.然后我发现了这个,但我不知道在哪里找到这个flagEndAsync方法 - 它不在IabHelper课堂上.

现在我正在寻找解决这个问题的方法(没有重新实现整个她的爆炸).我能想到的唯一解决方案是创建一个asyncActive在异步任务启动之前检查的布尔字段,如果有另一个任务处于活动状态,则不执行此操作.但是这有许多其他问题,并且不适用于各种活动.此外,我希望有一个异步任务队列,并在允许的情况下尽快运行,而不是根本不运行.

针对这个问题的解决方案?

android android-billing

70
推荐指数
8
解决办法
3万
查看次数

多个帐户的应用内购买

在应用购买/订阅时遇到问题:

如果设备上有多个帐户,我无法获得使用第二个帐户进行的购买.通过从Google Play网络界面安装应用程序,有时可以暂时解决此问题,但过了一段时间,购买将不会出现在查询中,从而迫使用户重新安装.

我正在使用此示例中的IabHelper类.

做一些谷歌搜索,我发现这个错误存在一段时间,但不幸的是我无法找出错误是在IabHelper类中还是在Google方面.

我想引起人们对谷歌的关注,因此他们可以在IabHelper课程或Play服务中为此提供适当的解决方案,或提供信息,以及如何处理.

我正在使用应用程序中的代码(在撰写本文时)900.000活跃用户安装,我必须触发相当多的退款,因为这.

如果有一个我想念的修复,请告诉我.

编辑:有时即使手机上只有一个帐户,也无法检索购买.

android in-app-billing google-play android-billing google-play-services

63
推荐指数
1
解决办法
5539
查看次数

从Fragment调用startIntentSenderForResult(Android Billing v3)

新的Android Billing v3文档和帮助程序代码startIntentSenderForResult()在启动购买流程时使用.我想从a开始购买流程(并收到结果)Fragment.

例如,文档建议调用

startIntentSenderForResult(pendingIntent.getIntentSender(),
    1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
    Integer.valueOf(0));
Run Code Online (Sandbox Code Playgroud)

帮助程序代码调用

mHelper.launchPurchaseFlow(this, SKU_GAS, 10001,   
    mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
Run Code Online (Sandbox Code Playgroud)

哪个叫startIntentSenderForResult().

问题是,在父节点上调用调用startIntentSenderForResult()原因而不是从调用它的位置(调用位置)调用原因.onActivityResult()ActivityFragmentIabHelper

我无法接受的onActivityResult()Activity,然后手动调用onActivityResult()Fragment,但有一种方法,使一个呼叫startIntentSenderForResult()从一个Fragment直接结果返回到FragmentonActivityResult()

android android-fragments android-activity android-billing

53
推荐指数
2
解决办法
2万
查看次数

Android In App Billing:无法启动launchPurchaseFlow,因为launchPurchaseFlow正在进行中

我是第一次实施In App Billing,我正在使用静态SKU ID测试我的第一次购买.

它第一次运作良好.我致电mHelper.launchPurchaseFlow(...)并完成了测试购买.我的活动收到onActivityResult回调,我确保处理它mHelper.handleActivityResult(...).一切都很棒.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Pass on the activity result to the helper for handling
    log("onActivityResult");
    if (!this.mHelper.handleActivityResult(requestCode, resultCode, data)) {
        log("cleared the launch flow");
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想测试下一部分,所以我重新启动了应用并尝试购买相同的SKU(静态purchasedSKU).

mHelper.launchPurchaseFlow(rootActivity, "android.test.purchased", 10002,   
       new IabHelper.OnIabPurchaseFinishedListener() {

        @Override …
Run Code Online (Sandbox Code Playgroud)

android in-app-billing android-billing

36
推荐指数
4
解决办法
3万
查看次数

在 android-billing-5.0 中获取 ProductDetails 价格

我已将我的 Kotlin 应用程序从 4.0 升级到 android-billing 5.0,因此,SkuDetails 现已弃用,因此我将使用迁移说明迁移到使用 ProductDetails 。

之前我使用SkuDetails.price向用户显示应用内购买的购买价格,但我在ProductDetails中找不到类似的方法。

在 Google Play Billing Library 5.0 中,是否有一种未弃用的方法来检索应用内购买或订阅的价格?

android in-app-billing kotlin android-billing play-billing-library

33
推荐指数
2
解决办法
9866
查看次数

与应用程序安装关联的帐户信息

对于在Android中实施应用内结算的用户来说,这是一个广受欢迎的问题,即如何处理多个帐户.如果用户配置了多个帐户,哪个帐户将用于应用内结算(因为没有选项让用户选择帐户)?挖了很多之后,下段在这里似乎可以解释它..

注意:要进行测试购买,许可测试帐户必须位于用户的Android设备上.如果设备有多个帐户,则会使用下载该应用的帐户进行购买.如果没有任何帐户下载了应用程序,则使用第一个帐户进行购买.用户可以通过展开购买对话框来确认正在进行购买的帐户.

我使用在应用程序计费中涉及的帐户创建开发人员有效负载,以便可以在以后某个时间或其他某个设备上正确还原.但是自Honeycomb以来,没有主账户这样的东西.用户可以删除任何帐户,可能是购买该应用程序的帐户,在这种情况下,帐户列表中的第一个帐户将用于计费.现在,如果我知道使用了哪个帐户,并且它是否"不是安装了应用程序的帐户",我至少可以告知用户以后的购买将不会恢复.

所以,我的问题是......

有没有办法找到用于下载应用程序的帐户?

Google Play似乎确实使用了这些信息.无论如何,我们可以与Google Play互动达到这个级别吗?

注意:PackageManager似乎没有解决这个问题.

android in-app-purchase google-account in-app-billing android-billing

30
推荐指数
1
解决办法
668
查看次数

Android结算例外

我正在测试我的账单,我得到了这个例外:

java.lang.IllegalStateException: Can't start async operation (launchPurchaseFlow) because another async operation(launchPurchaseFlow) is in progress.
        at utils.IabHelper.flagStartAsync(IabHelper.java:711)
        at utils.IabHelper.launchPurchaseFlow(IabHelper.java:316)
        at utils.IabHelper.launchPurchaseFlow(IabHelper.java:294)
        at com.problemio.SubscribeIntroActivity$6.onClick(SubscribeIntroActivity.java:117)
        at android.view.View.performClick(View.java:2532)
        at android.view.View$PerformClick.run(View.java:9308)
        at android.os.Handler.handleCallback(Handler.java:587)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:150)
        at android.app.ActivityThread.main(ActivityThread.java:4293)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
        at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我运行此代码后:

    Button subscribe = (Button)findViewById(R.id.subscribe);
    subscribe.setOnClickListener(new Button.OnClickListener() 
    {  
       public void onClick(View v) 
       {              
           // FIRST CHECK IF THE USER IS ALREADY A SUBSCRIBER.
          mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);

       }
    });   
Run Code Online (Sandbox Code Playgroud)

但在此之前,我将其作为测试用户运行,并使用测试产品ID,即:android.test.purchased并且它有效.但是,当我将产品ID更改为我自己的产品ID时,它会因上述异常而崩溃.

有没有想过为什么会这样?谢谢!

android android-billing

23
推荐指数
1
解决办法
8922
查看次数

android在app结算购买验证失败

我在我的Android应用程序中实现应用程序计费时遇到问题.我收到购买签名验证失败.在第一次我很难,它是base64键,但我检查了很多次,我仍然得到错误,然后我看了一下Security.java文件,我发现我编辑的这个方法获取一些信息关于什么是错的:

    public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {
    if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||
            TextUtils.isEmpty(signature)) {
        if(TextUtils.isEmpty(signedData)) Log.d(TAG, "SIGNED DATA EMPTY");
        if(TextUtils.isEmpty(base64PublicKey)) Log.d(TAG, "KEY IS EMPTY");
        if(TextUtils.isEmpty(signature)) Log.d(TAG, "SIGNATURE IS EMPTY");
        Log.e(TAG, "Purchase verification failed: missing data.");
        return false;
    }

    PublicKey key = Security.generatePublicKey(base64PublicKey);
    return Security.verify(key, signedData, signature);
}
Run Code Online (Sandbox Code Playgroud)

我得到"签名是空的".即使我按照以下步骤操作: - 使用我的发布密钥设置apk - 将其作为草稿添加 - 在设备上安装"adb -d install app.apk"

我正在测试真实购买.谢谢.

编辑购买流程很好,我打电话时收到错误queryInventoryAsync

android billing in-app-purchase in-app-billing android-billing

23
推荐指数
2
解决办法
3万
查看次数

android in-app billing v3 api中的开发者有效负载应该是多少?

我正在我的应用中实施应用内结算以解锁高级功能.应用内结算功能设置正确.除了"开发者有效载荷"之外,一切似乎都很好.

示例应用程序说

 /*
     * TODO: verify that the developer payload of the purchase is correct. It will be
     * the same one that you sent when initiating the purchase.
     *
     * WARNING: Locally generating a random string when starting a purchase and
     * verifying it here might seem like a good approach, but this will fail in the
     * case where the user purchases an item on one device and then uses your app on
     * a different device, because …
Run Code Online (Sandbox Code Playgroud)

android in-app-purchase in-app-billing android-billing

22
推荐指数
1
解决办法
2万
查看次数