多账户的应用内购买

73

我遇到了一个与应用内购买/订阅相关的问题:

如果设备上有多个帐户,我无法获取使用第二个帐户进行的购买。有时可以通过从Google Play Web接口安装应用程序来临时解决此问题,但过一段时间后,购买将不会出现在查询中,强制用户重新安装。

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

通过一些谷歌搜索,我发现这个bug已经存在一段时间了,但不幸的是我无法确定错误是在IabHelper类中还是在谷歌的服务器端。

我想引起谷歌的注意,以便他们提供适当的修复版本,无论是在IabHelper类中还是在Play Services中,或提供信息,说明如何处理此问题。

我正在使用该代码的一个拥有(在撰写本文时)900,000活跃用户安装量的应用程序,由于这个问题,我必须触发相当多的退款。

如果我错过了某个修复方法,请告诉我。

编辑:有时根本无法检索购买记录,即使手机上只有一个帐户。


1
这不是吸引 Google 注意的地方。您需要在 https://code.google.com/p/android/issues/list 上记录您的错误。 - Murtaza Khursheed Hussain
那个问题追踪器是错的。这是Playstore、Play服务、钱包或购买问题。https://code.google.com/p/android/issues/detail?id=53307 - stefple
你使用的IAP版本是什么? - zaifrun
你能在编辑中突出显示具体的问题吗?这将使社区更容易一眼识别特定问题,帮助我们更快地帮助你。 - keithmaxx
这里的所有答案都很糟糕。在2017年,特别是对于测试其应用程序的开发人员来说,是否有适当的解决方案,可以从apk中进行测试? - msangel
@msangel 不幸的是不行。 - stefple
7个回答

1

1
看起来似乎没有一种解决方法,但让我们尝试做到这一点。
  1. When the user first install the app get his/her primary email or all accounts on the device

  2. Ask the user what email will they be using for future payment/ or which account is active for google play.

    you can use this code to get the account

    Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
    Account[] accounts = AccountManager.get(context).getAccounts();
    for (Account account : accounts) {
        if (emailPattern.matcher(account.name).matches()) {
            String possibleEmail = account.name;
            ...
        }
    }
    

    Don't forget to ask for permission

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    

    After the user selects the email, you can send a link via email to confirm this email address

  3. Lead all the payment to that specific email.

方法二

使用新的“通过Gmail发送和接收付款”功能

  1. 创建一个电子邮件意图并向电子邮件意图发送特定数据并进行付款。

  2. 成功后,向用户电子邮件发送代码

  3. 使用代码激活他们所购买的任何内容。

方法三

使用另一个支付库或网关来进行应用内购买,而不是使用Google Play。


2
方法3在发布到Play商店时违反了Google的政策,我想方法2也是一样的。 方法1中,无法执行#3,因为在应用内购买库中没有选择帐户的选项。 - 3c71
@3c71 所以没有办法处理它吗?没有办法让用户通过代码“恢复”购买吗? - android developer
@androiddeveloper 是的,想法是在Play商店中使用用于购买应用内项目的相同帐户进行登录,并且如下面的答案所提到的那样,将用于购买应用内项目的帐户作为“主”帐户。这是用户的解决方法,我们无法在开发端进行任何操作。如果他们给你一个解释的机会,那么你很幸运。 - 3c71
@androiddeveloper,我看到了一些不好的评论,看起来像是这个问题,并且有一个用户联系过我,但是在十年中只有一次。我早就放弃了这个问题并忘记了它。我不知道Google是否在Play商店中修复或改进了它,或者根本没有做任何事情,但是我已经很久没有收到/阅读任何投诉了。 - 3c71
不好意思,它仍然没有修复。:( - jomin v george
显示剩余3条评论

0

几个月后,我遇到了同样的问题。 经过数小时的寻找解决方案,我想到了一个解决方法,就像这样:

您可以使用OAuth 2.0。

但是,您还必须从后端进行管理。 我不是后端开发人员,所以我不知道它在后端中如何实现,但在应用程序方面,我已经做了类似于这样的事情,

您可以使用第一个允许在服务器端进行身份验证的Google帐户。 OAuth 2.0是一种简化工具,可为开发人员提供一种轻松的方式来允许用户访问您的应用程序。 OAuthHmacSigner类负责管理身份验证。

signer = new OAuthHmacSigner();
signer.clientSharedSecret = Constants.CONSUMER_SECRET;

然后,Android活动使用以下代码启动OAuth流程:

launchOauth.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        startActivity(new Intent().setClass(v.getContext(),
            PrepareRequestTokenActivity.class));
    }
});

为了获取OAuth 2.0访问令牌,您只需要调用:

AccountManager.getAuthToken()

希望这能有所帮助 :)


0

这肯定是应用内购买服务API中的一个错误。

这里

有一个类似的问题,正如其中一个答案所提到的,也许您需要引入登录机制,并将从帐户购买的内容存储到您的服务器上或本地设备上的加密文件中或类似的东西。


我不会把购买存储在其他地方。 - stefple
如果在另一台设备上需要相同的购买信息,我们该怎么办?或者,如果同一帐户在不同的设备上同步,如何获取购买信息? - Nithinjith
在这种情况下,您需要从服务器同步它。每当用户登录您的应用程序时,您将检查他是否是现有用户。如果是,则从数据库中获取详细信息,否则在数据库中创建新条目。 - psykid

0
我有两个账户,但其中一个无法使用。我进入了安卓的设置,然后进入了账户偏好设置。我将我的主要账户从无法使用的那个更改为可用的那个。然后我将新账户分配为所有应用程序的主要账户,包括谷歌播放。这对我有效。有时,如果由于某种原因它不起作用,您也可以在线访问互联网上的谷歌播放商店。

0
尝试获取具有以.apk或.xcode结尾的文件签名的重复点。

-2

我不确定这是否是你正在寻找的答案,但也许建立一个共享的Google Play家庭图书馆就足够了。如果需要,它可以为最多5个用户共享相同的购买(应用程序、音乐、电影等)。

(请参见:https://support.google.com/googleplay/answer/7007852?hl=en


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接