Подтвердить что ты не робот

Получаю ли я шаги для проверки подписки на Android в приложении?

Я создаю приложение, которое не требует учетной записи пользователя/входа в систему и позволяет пользователю приобретать подписку. Я хочу использовать API разработчика Google Play, чтобы проверить, имеет ли пользователь приобретенную/активную подписку. Из всей документации я собрал следующие шаги.

Правильны ли они и могли бы вы ответить на два вопроса в них?

  • Создайте учетную запись службы в консоли API Google.
  • Сохраните закрытый ключ, который мне предоставлен (где, конечно, нет в моем коде/на устройстве, как этот примерный код предлагает)
  • Используйте Клиентскую библиотеку API Google API для Java для создания и подписи JWT с помощью закрытого ключа (как? документы дают мне этот, но это не код Java... Что мне делать с этим?)
  • Создайте запрос доступа к токену и получите доступ к API
  • Приложение может теперь отправить запрос GET API, чтобы узнать, у пользователя есть подписка
  • Когда токен доступа истекает, вернитесь к шагу 3.

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

РЕДАКТИРОВАТЬ: Эти шаги были неверными. См. Мой ответ ниже для правильных шагов. Однако обратите внимание, что это относится только к использованию учетной записи службы (поскольку я не хотел, чтобы пользователь явно разрешал доступ к API)

4b9b3361

Ответ 1

Как оказалось, мои шаги были неправильными. Мне потребовались недели, чтобы понять это, и он, похоже, не документирован нигде. Добро пожаловать:

  • Создайте учетную запись Веб-приложение в Консоль API Google. Поместите любой веб-сайт как "URI перенаправления"; это не имеет значения, так как вы действительно не будете использовать его. При создании учетной записи вы получите идентификатор клиента и секрет клиента.

  • В браузере на вашем компьютере перейдите к https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=[YOUR REDIRECT URI]&client_id=[YOUR CLIENT ID] и разрешите доступ, когда будет предложено.

  • Посмотрите в адресной строке. В конце URI, который вы ввели первоначально, будет токен обновления. Это выглядит как 1/..... Вам понадобится этот "код" на следующем шаге. Ток обновления не истекает.

  • Преобразуйте этот "код" в "токен обновления", перейдя в https://accounts.google.com/o/oauth2/token?client_id=[YOUR CLIENT ID]&client_secret=[YOUR CLIENT SECRET]&code=[CODE FROM PREVIOUS STEP]&grant_type=authorization_code&redirect_uri=[YOUR REDIRECT URI]. Вы можете сохранить полученное значение прямо в своей программе; он никогда не истекает, если явно не отменено. (этот шаг вставлен в @BrianWhite - см. комментарии) Убедитесь, что вы используете POST. (Вставлен Gintas)

  • В вашем коде отправьте запрос HttpPost на https://accounts.google.com/o/oauth2/token с помощью BasicNameValuePairs "grant_type","refresh_token", "client_id",[YOUR CLIENT ID], "client_secret",[YOUR CLIENT SECRET], "refresh_token",[YOUR REFRESH TOKEN]. Например, посмотрите здесь. Вам нужно будет сделать это в отдельном потоке, возможно используя AsyncTask. Это вернет объект JSONObject.

  • Получите токен доступа из возвращаемого объекта JSONObject. Например, посмотрите здесь. Вам нужно будет получить строку "access_token". Маркер доступа истекает через 1 час.

  • В вашем коде отправьте запрос HttpGet на https://www.googleapis.com/androidpublisher/v1/applications/[YOUR APP PACKAGE NAME]/subscriptions/[THE ID OF YOUR PUBLISHED SUBSCRIPTION FROM YOUR ANDROID DEVELOPER CONSOLE]/purchases/[THE PURCHASE TOKEN THE USER RECEIVES UPON PURCHASING THE SUBSCRIPTION]?accesstoken="[THE ACCESS TOKEN FROM STEP 4]". Например, посмотрите здесь.

Ответ 2

Если вы похожи на меня и хотите сделать это в PHP, вот как это сделать... Благодаря ответу Kalina мне потребовалось всего три дня, чтобы понять, как это сделать работает:).

Здесь:

  • перейдите в консоль Google для разработчиков https://console.developers.google.com/ и создайте веб-приложение . Поместите 'developers.google.com/oauthplayground' как 'URI перенаправления'; Вы будете использовать его на шаге 2. При создании учетной записи вы получите идентификатор клиента и клиентский секрет. Убедитесь, что вы добавили API разработчика Google Play для Android.

  • перейдите на игровую площадку Google oauth2 https://developers.google.com/oauthplayground/. Этот отличный инструмент - ваш лучший друг в течение следующих нескольких дней. Теперь перейдите к настройкам: убедитесь, что установлен Использовать собственные учетные данные OAuth. Только после этого вы можете заполнить свой идентификатор клиента и клиентский секрет в форме ниже.

  • В игровая площадка Google oauth2 перейдите к шагу 1 Выберите и авторизуйте API заполните область ввода в поле ввода https://www.googleapis.com/auth/androidpublisher. Я не смог найти API разработчика Android для Google Play в списке, возможно, они добавят некоторое время спустя. Нажмите AUTORIZE APIS. Следуйте приведенной ниже авторизации.

  • В игровая площадка Google oauth2 перейдите к шагу 2 Код авторизации Exchange для токенов. Если все пойдет хорошо, вы увидите код авторизации, начинающийся с /4. Если что-то не получилось хорошо проверить сообщение об ошибке справа. Теперь вы нажмете "токен обновления доступа". Скопируйте токен Refresh... он начнется с /1...

  • Теперь вы всегда можете получить токен доступа! вот как:

    $url ="https://accounts.google.com/o/oauth2/token";
    $fields = array(
       "client_id"=>"{your client id}",
       "client_secret"=>"{your client secret}",
       "refresh_token"=>"{your refresh token 1/.....}",
       "grant_type"=>"refresh_token"
    );
    
    $ch = curl_init($url);
    
    //set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_POST,count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    //execute post
    $lResponse_json = curl_exec($ch);
    
    //close connection
    curl_close($ch);
    

Теперь у вас есть уступ ACCESS TOKEN... JSON будет выглядеть так:

"access_token" : "{the access token}",  "token_type" : "Bearer",  "expires_in" : 3600

Наконец, вы готовы спросить у Google что-то! Вот как это сделать:

$lAccessToken = "{The access token you got in}" ;
$lPackageNameStr = "{your apps package name com.something.something}";
$lURLStr =  "https://www.googleapis.com/androidpublisher/v1.1/applications/$lPackageNameStr/subscriptions/$pProductIdStr/purchases/$pReceiptStr";

$curl = curl_init($lURLStr);

curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$curlheader[0] = "Authorization: Bearer " . $lAccessToken;
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlheader);

$json_response = curl_exec($curl);
curl_close($curl);

$responseObj = json_decode($json_response,true);

Возвращенный JSON будет содержать две временные метки, initiationTimestampMsec и validUntilTimestampMsec, время действия подписки. Оба являются миллисекундами, чтобы добавить к дате 1/1/1970!

Ответ 3

Пользователи .NET: Я надеюсь, что этот ответ спасет кого-то от печали.

Как отметил в 1998 году Кристофе Фондаччи, принятое решение отлично поработало несколько лет назад. Теперь это 2017, и процесс намного проще и быстрее.

Моим вариантом использования является проверка подписки на приложение, когда мое мобильное приложение отправляет информацию о покупке подписки на мой сервер RESTful, который, в свою очередь, связывается с Google для подтверждения покупки по подписке.

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

  • Войдите в свой Google Play Dev Console и нажмите приложение, которое вы настраиваете.
  • Посетите Настройки Доступ к API
  • В разделе Учетные записи служб нажмите кнопку Создать учетную запись.
  • По состоянию на январь 2017 года появляется диалог с указаниями по настройке учетной записи службы. В диалоговом окне вы попадете на консоль Google API; оттуда,

    A) Нажмите Создать учетную запись службы

    B) Создайте имя учетной записи службы, которая имеет смысл. Поскольку мы заинтересованы в доступе к службам Android Publisher, я выбрал "издатель".

    C) Для роли просто выберите что-то - вы можете изменить это позже.

    D) Выберите "Завершить новый закрытый ключ" и выберите P12 для .Net-реализаций. Не теряйте этот файл!

5) Теперь вы закончили с №4, вы увидите новую учетную запись службы; нажмите "Предоставить доступ", чтобы включить его.

6) Нажмите ссылку "Просмотр разрешений". Вы должны изменить разрешения на основе ваших потребностей и API.

Чтобы проверить покупки в приложении, перейдите в Cog- > Change Permissions и включите разрешения GLOBAL "Visiblity" и "Manage Orders".

ОК в этот момент вы настроили все, что было в конце Google. Теперь настройте сервер на сервер. Я рекомендую создавать приложение .Net Console, чтобы проверить свою реализацию, затем разгрузите ее там, где это необходимо.

1) Добавьте клиентскую библиотеку издателя Android из Nuget

PM> Install-Package Google.Apis.AndroidPublisher.v2

2) Добавьте файл P12 в корневой каталог проекта

3) Измените свойства P12, чтобы "Build Action" было "Content" и "Copy To Output Directory" на "Copy if newer".

4) Внедрите что-нибудь подобное, чтобы проверить ваш доступ и точную настройку.

using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Services;
using Google.Apis.Auth.OAuth2;
using Google.Apis.AndroidPublisher.v2;
...
public Task<SubscriptionPurchase> GetSubscriptionPurchase(string packageName, string productId, string purchaseToken)
{
    var certificate = new X509Certificate2(
                    "{{your p12 file name}}",
                    "{{ your p12 secret }}",
                    X509KeyStorageFlags.Exportable
                );
    var credentials = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer("{{ your service account email }}")
            {
                Scopes = new[] { AndroidPublisherService.Scope.Androidpublisher }
            }.FromCertificate(certificate))
            ;

    var service = new AndroidPublisherService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credentials,
        ApplicationName = "my server app name",
    });
    return service.Purchases.Subscriptions.Get(packageName, productId, purchaseToken).ExecuteAsync();
}

Удачи, надеюсь, это поможет кому-то.

Источники:

Использование OAuth 2.0 для серверных приложений

.NET Client Library для Google.Apis.AndroidPublisher.v2

Ответ 4

Я не знаю в 2012 году, но в 2015 году вы не должны выполнять какие-либо из этих шагов вручную. Мне было очень трудно найти документацию, поэтому я размещаю здесь, если это кому-то поможет.

  • Вы должны только запрашивать покупки приложений с вашего сервера по соображениям безопасности, так как иначе вы не можете доверять ни одному из двух концов процесса покупки.

Теперь на стороне сервера (я думаю, вы все равно можете использовать тот же код из своего приложения, если вам это абсолютно необходимо), включите в свой проект клиентскую библиотеку google-api-services-androidpublisher (см. https://developers.google.com/api-client-library/java/apis/androidpublisher/v1)

Как вы уже упоминали, вам нужна учетная запись службы с файлом P12 (клиентская библиотека принимает только файл P12).

Затем следующий код будет аутентифицироваться и получать информацию о покупке красиво:

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    List<String> scopes = new ArrayList<String>();
    scopes.add(AndroidPublisherScopes.ANDROIDPUBLISHER);

    Credential credential = new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
            .setServiceAccountId(googleServiceAccountId)
            .setServiceAccountPrivateKeyFromP12File(new File(googleServicePrivateKeyPath))
            .setServiceAccountScopes(scopes).build();
    AndroidPublisher publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).build();
    AndroidPublisher.Purchases purchases = publisher.purchases();
    final Get request = purchases.get(packageName, productId, token);
    final SubscriptionPurchase purchase = request.execute();

    // Do whatever you want with the purchase bean

Информацию о проверке подлинности Java-клиента можно найти здесь: https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Ответ 5

Я могу неправильно понять ваш вопрос, но я не вижу причины использовать ссылки, на которые вы ссылаетесь, чтобы получить In-App Billing для приложения для Android. Эта страница гораздо полезнее:

http://developer.android.com/guide/google/play/billing/index.html

Вы можете попробовать демо-приложение, которое они включают (Dungeons - http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-download). Это использует продукты (одноразовые покупки), а не подписки, но вы должны иметь возможность изменять, чтобы проверить, что вы хотите.

Я думаю, что ключом для вас был бы метод restoreTransactions, который они предоставляют в образце, чтобы узнать, есть ли в аккаунте Google Play какие-либо подписки для вашего приложения:

@Override
public void onRestoreTransactionsResponse(RestoreTransactions request, int responseCode) {
    if (responseCode == BillingVars.OK) {                        
        // Update the shared preferences so that we don't perform a RestoreTransactions again.
        // This is also where you could save any existing subscriptions/purchases the user may have.
        SharedPreferences prefs = getSharedPreferences(my_prefs_file, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.putBoolean(DB_INITIALIZED, true);
        edit.commit();
    } else {
        Log.e(TAG, "RestoreTransactions error: " + responseCode);
    }
}

Ответ 6

Поскольку у вас есть веб-сервис, который может вызвать ваше приложение, я бы рекомендовал безопасно хранить ваш секретный ключ на вашем сервере. Вы должны смотреть на перемещение как можно большего количества приложений в приложении, чтобы обслуживать звонки, см. эту ссылку. Я реализовал подписку в приложении, но это было до того, как эта часть API была отключена. Я должен был сделать свою собственную регистрацию и проверку безопасности, но похоже, что этот API делает большинство из вас для вас, используя OAuth, хотя похоже, что вы по-прежнему несете ответственность за сохранение запроса/проверки подписки.

Где он говорит о подписании вашей JWT с существующей библиотекой, они, похоже, предоставляют вам ссылки на библиотеку java, библиотеку Python и библиотеку PHP - это зависит от того, на что написан ваш веб-сервисный или серверный компонент (мой это С#, поэтому я использую RSACryptoServiceProvider), чтобы проверить подписанные покупки. Они используют объекты JSON для фактической передачи данных.

Ответ 7

Если у кого-то возникают проблемы с принятым окончательным шагом (# 7), я нашел ?access_token= для работы вместо ?accessToken=

Слишком плохое переполнение стека не позволит мне сделать этот комментарий непосредственно в потоке...