Время истечения срока действия элемента подписки в приложении в Android

Я пытаюсь получить время истечения срока действия или статус подписки, чтобы убедиться, регулярно ли пользователь платит за мой товар или нет. Когда я запрашиваю, используя

Purchase monthlySubscription = inv.getPurchase("itemName");

or

ArrayList<String> ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");

Он возвращает следующие данные

{  
       "packageName":"com.abcPackage",
       "productId":"auto1week",
       "purchaseTime":1453369299644,
       "purchaseState":0,
       "developerPayload":"PAY_LOAD",
       "purchaseToken":"TOKEN",
       "autoRenewing":true
}

Проблема в том, что PurchaseTime остается неизменным через несколько недель, который должен меняться после каждой покупки.

Я попробовал API разработчиков Google Play

https://developers.google.com/android-publisher/#subscriptions

но мне трудно реализовать это на моем устройстве Android.

Я буду признателен, если кто-то может пошагово помочь мне получить эти данные на устройстве Android.

https://developers.google.com/android-publisher/api-ref/purchases/subscriptions

Любая помощь в этом отношении будет высоко оценена.


person Jan    schedule 04.02.2016    source источник
comment
Удалите полезную нагрузку разработчика и купите токен.   -  person Shajeel Afzal    schedule 04.02.2016
comment
Я заметил то же самое с моими тестовыми покупками. Кажется, PurchaseTime — это всегда время первой покупки подписки. Я не могу найти много информации об этом, касающемся обновления для каждой покупки. Я думаю, что единственный реальный вариант на данный момент — это подключиться к API и подтвердить покупку там.   -  person Brian    schedule 07.03.2016


Ответы (1)


Не уверен, что это поможет, но вот мой код на стороне сервера (на java), который подключается к API разработчика и возвращает срок действия подписки.

Я создал учетную запись службы в консоли разработчика Google и следовал несколько тупым инструкциям, чтобы создать файл ключа в src/resources/keys.json. APPLICATION_NAME — это имя пакета моего приложения, а PRODUCT_ID — это идентификатор подписки из консоли разработчика Google PLAY.

Извините, это не совсем «шаг за шагом», как вы просили, но я также выполняю проверку на стороне сервера, а не на клиенте. Я предполагаю, что на клиенте вы могли бы выполнить какую-то мягкую проверку, проверив PurchaseState == 0 (1 = отменено, 2 = возмещено) и autoRenewing == true. Однако вы можете застрять там, если они отменят подписку, поскольку вы все равно должны предоставлять услуги в течение всего срока действия подписки.

    public static Long doSomeWork(String token){
        log.debug("Google Validation: Doing some work:" + token);

        try{
            // Creating new Trusted Transport
            HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

            // Getting Auth Creds
            Credential cred = getAuthCredential();

            // Building Android Publisher API call
            AndroidPublisher ap = new AndroidPublisher.Builder(httpTransport, JSON_FACTORY, cred)
                    .setApplicationName(APPLICATION_NAME).build();

            // Get Subscription
            AndroidPublisher.Purchases.Subscriptions.Get get = ap.purchases().subscriptions().get(
                    APPLICATION_NAME,
                    PRODUCT_ID,
                    token);

            SubscriptionPurchase subscription = get.execute();
            log.debug(subscription.toPrettyString());

            log.debug("DONE (not null)");
            return subscription.getExpiryTimeMillis();

        } catch(IOException ex) {
            ex.printStackTrace();
        } catch (GeneralSecurityException ex2) {
            ex2.printStackTrace();
        }

        log.debug("DONE (failure) (0)");
        return 0L;

    }

    private static Credential getAuthCredential(){

        log.debug("getAuthCredential");
        try{
            //Read the credentials from the keys file.  This file is obtained from the
            // Google Developer Console (not the Play Developer Console
            InputStream is = GoogleReceiptValidation.class.getClassLoader().getResourceAsStream("keys.json");
            String str = IOUtils.toString(is);
            is.close();
            JSONObject obj = new JSONObject(str);
            InputStream stream = new ByteArrayInputStream(obj.toString().getBytes());

            //This is apparently "beta functionality".
            GoogleCredential creds = GoogleCredential.fromStream(stream);
            creds = creds.createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));

            return creds;
        } catch (IOException ex){
            ex.printStackTrace();
        } catch (JSONException ex2){
            ex2.printStackTrace();
        }

        log.debug("No Creds found - returning null");

        return null;

    }
person Brian    schedule 07.03.2016
comment
Спасибо за вклад, но мне не нужен серверный код. - person Jan; 07.03.2016