标识用户的令牌

时间:2013-06-19 16:30:48

标签: android in-app-purchase in-app-billing billing android-billing

我正在开发一个Android应用程序,我希望该应用程序的某些功能不是免费的。

我曾考虑过使用应用内结算版本3 API,因此我定义了一个"应用内商品"在开发者控制台中。

阅读完文档后,我知道当我开始购买流程时,我应该传入一个字符串令牌,以帮助应用程序唯一地识别进行购买的用户。

但是我怎样才能获得识别用户的字符串标记?

由于

2 个答案:

答案 0 :(得分:19)

您可以使用开发人员有效负载来识别用户和安全性。

根据应用程序计费要求中的应用程序,有两种方法可以生成开发人员有效负载。

1)如果您使用的是非托管项目(非耗材项目),那么您只需使用 UserID 即可唯一识别用户,尤其是您的应用。您可以将开发人员有效负载作为UserID发送。

如果您将用户的电子邮件ID存储到服务器中,则可以将电子邮件地址放入开发人员有效负载中以获取唯一ID。当用户付费购买产品后从谷歌播放得到回复,然后从该用户帐户的服务器数据库中获取,与您的开发者有效负载相匹配。

本地数据库(与SQLite一样):

     UserID
     (Automatecally  
       generated by   product type     userEmailAddress
      Sql database)        


        1            product1            abc@gmail.com
        2            product1            xyz@gmail.com
        3            product1            pqr@gmail.com

您可以将其作为userID传递给有效负载

- >它会在一段时间内产生问题。如果您不想使用服务器数据库,那么您可以简单地忽略开发有效负载使其成为一个空白字符串,它将不会对您的代码产生更多影响。检查此链接的Nikolay Elenkov回答:stackoverflow.com/questions/14553515 /

2)如果您正在使用耗材(托管项目),那么您可以使用随机生成的字符串

step 1: before on create method declare this:

            private static final char[] symbols = new char[36];

        static {
            for (int idx = 0; idx < 10; ++idx)
                symbols[idx] = (char) ('0' + idx);
            for (int idx = 10; idx < 36; ++idx)
                symbols[idx] = (char) ('a' + idx - 10);
        }

第2步:在您的活动中设置RandomString和SessionIdentifierGenerator类

    public class RandomString {

        /*
         * static { for (int idx = 0; idx < 10; ++idx) symbols[idx] = (char)
         * ('0' + idx); for (int idx = 10; idx < 36; ++idx) symbols[idx] =
         * (char) ('a' + idx - 10); }
         */

        private final Random random = new Random();

        private final char[] buf;

        public RandomString(int length) {
            if (length < 1)
                throw new IllegalArgumentException("length < 1: " + length);
            buf = new char[length];
        }

        public String nextString() {
            for (int idx = 0; idx < buf.length; ++idx)
                buf[idx] = symbols[random.nextInt(symbols.length)];
            return new String(buf);
        }

    }

    public final class SessionIdentifierGenerator {

        private SecureRandom random = new SecureRandom();

        public String nextSessionId() {
            return new BigInteger(130, random).toString(32);
        }

    }

第3步:将有效负载传递到您的购买请求中:

    RandomString randomString = new RandomString(36);
            System.out.println("RandomString>>>>" + randomString.nextString());
            /* String payload = ""; */
            // bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ
            String payload = randomString.nextString();
            Log.e("Random generated Payload", ">>>>>" + payload);

        Log.d(TAG, "Launching purchase flow for infinite gas subscription.");
            mHelper.launchPurchaseFlow(this, SKU_GAS,
                    IabHelper.ITEM_TYPE_INAPP, RC_REQUEST,
                    mPurchaseFinishedListener, payload);

    for more inforamation check this link:
    http://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string

记下这个:

  
    

安全建议:当您收到Google Play的购买回复时,请务必检查返回的数据签名,     orderId,以及Purchase对象中的developerPayload字符串     确保您获得了预期的值。你应该验证     orderId是您之前没有的唯一值     已处理,developerPayload字符串与您的令牌匹配     先前已通过购买请求发送。作为进一步的安全     预防措施,您应该自己进行安全验证     服务器

  
   check this link:
   http://developer.android.com/google/play/billing/billing_integrate.html
for more details check this link:

http://developer.android.com/google/play/billing/billing_best_practices.html

希望它会对你有所帮助。

答案 1 :(得分:-1)

为什么不为每个用户创建一个UUID?

String uniqueID = UUID.randomUUID().toString();