Создание транзакций цифровой подписки

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

Ключевые термины: Цифровой товар по подписке — это единица хранения запасов (SKU), требующая от пользователя периодической оплаты, как, например, онлайн-журнал. Это отличается от потребляемого цифрового товара, который пользователь должен повторно приобрести вручную, или от непотребляемого цифрового товара, который автоматически приобретается только один раз.

Дополнительную информацию о цифровых подписках см. в документации Android, посвященной функциям подписки .

Поток транзакций

В этом руководстве описываются все этапы разработки в том виде, в каком они происходят в потоке транзакций цифровых товаров. Когда ваше действие обрабатывает транзакции с цифровыми товарами, оно использует следующий поток:

  1. Настройте клиент API цифровых покупок . Ваше действие использует API цифровых покупок для связи с вашим инвентарем Google Play и совершения транзакций. Прежде чем ваше действие сделает что-либо еще, оно создает клиент JWT со служебным ключом для связи с API цифровых покупок.
  2. Сбор информации . Ваше действие собирает основную информацию о пользователе и вашем инвентаре в Google Play для подготовки к транзакции.
    1. Проверка требований к транзакции . Ваше действие использует помощник по требованиям к цифровым транзакциям в начале процесса покупки, чтобы убедиться, что пользователь может совершить транзакцию.
    2. Соберите доступный инвентарь . Ваше действие проверяет ваш инвентарь в Google Play и определяет, какие предметы в настоящее время доступны для покупки.
  3. Создайте заказ : ваше действие представляет пользователю доступные цифровые товары, чтобы он мог выбрать один для покупки.
  4. Завершите покупку . Ваше действие использует API цифровых покупок, чтобы инициировать покупку по выбору пользователя в магазине Google Play.
  5. Обработка результата : ваше действие получает код состояния транзакции и уведомляет пользователя об успешной покупке (или предпринимает дополнительные действия).

Ограничения и рекомендации по проверке

К Действиям с транзакциями применяются дополнительные политики. Проверка действий, включающих транзакции, может занять несколько недель, поэтому учтите это время при планировании графика выпуска. Чтобы облегчить процесс проверки, убедитесь, что вы соблюдаете правила и рекомендации для транзакций , прежде чем отправлять свое действие на проверку.

Действия по продаже цифровых товаров могут быть развернуты только в следующих странах:

  • Австралия
  • Бразилия
  • Канада
  • Индонезия
  • Япония
  • Мексика
  • Россия
  • Сингапур
  • Таиланд
  • Турция
  • Великобритания
  • Соединенные Штаты

Предварительные условия

Прежде чем включить цифровые транзакции в свое действие, вам необходимы следующие предварительные условия:

Свяжите приложение для Android

Если у вас в настоящее время нет приложения Android с разрешением на выставление счетов в консоли Google Play, выполните следующие действия:

  1. В Android Studio или Android IDE по вашему выбору создайте новый проект. Выберите параметры в подсказках по настройке проекта, чтобы создать очень простое приложение.
  2. Дайте проекту имя пакета, например com.mycompany.myapp . Не оставляйте это имя по умолчанию, так как вы не сможете загружать пакеты, содержащие com.example в консоль Play.
  3. Откройте файл AndroidManifest.xml вашего приложения.
  4. Добавьте следующую строку кода внутри элемента manifest :

    <uses-permission android:name="com.android.vending.BILLING" />

    Ваш файл AndroidManifest.xml должен выглядеть как следующий блок кода:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.mycompany.myapp">
        <uses-permission android:name="com.android.vending.BILLING" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme" />
    </manifest>
    
  5. Создайте свое приложение в виде подписанного APK. В Android Studio выполните следующие действия:

    1. Перейдите в раздел «Сборка» , «Создать подписанный пакет / APK» .
    2. Нажмите "Далее .
    3. В разделе «Путь к хранилищу ключей» нажмите «Создать новый» .
    4. Заполните каждое поле и нажмите «ОК» . Запишите свой пароль хранилища ключей и пароль ключа и сохраните их в надежном месте, так как они вам понадобятся позже.
    5. Нажмите "Далее .
    6. Выберите выпуск .
    7. Выберите V1 (подпись JAR) .
    8. Нажмите «Готово» .
    9. Через несколько секунд Android Studio создаст файл app-release.apk . Найдите этот файл для дальнейшего использования.
  6. В консоли Google Play создайте новое приложение.

  7. Перейдите в раздел «Выпуски приложений» .

  8. В разделе «Закрытые треки» выберите «Управление» , затем «Альфа» .

  9. Нажмите кнопку «Создать выпуск» .

  10. В разделе «Разрешить Google управлять вашим ключом подписи и защищать его» введите информацию о своем ключе подписи.

  11. Загрузите свой APK-файл.

  12. Нажмите Сохранить .

Создайте свои цифровые товары

Если у вас в настоящее время нет цифровых товаров в консоли Play, выполните следующие действия:

  1. В консоли Google Play выберите «Продукты для продажи в приложении» , затем «Подписки» . Если вы видите предупреждение, следуйте предыдущим инструкциям, чтобы создать приложение для Android, или нажмите ссылку, чтобы создать профиль продавца.
  2. Нажмите Создать подписку .
  3. Заполните поля для вашего цифрового продукта. Запишите идентификатор продукта, по которому вы будете ссылаться на этот продукт в своем действии.
  4. Нажмите Сохранить .
  5. Повторите шаги 2–4 для каждого продукта, который вы хотите продать.

Пример подписок в консоли Google Play.

Подготовьте проект действий

Настроив цифровые товары в консоли Google Play, вы должны включить цифровые транзакции и связать свой проект Actions с приложением Play.

Настраивать

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

  1. В консоли «Действия» откройте свой проект или создайте новый.
  2. Перейдите в раздел «Развертывание» , затем «Информация о каталоге» .
  3. В разделе «Дополнительная информация и транзакции » установите флажок « Да» в разделе «Используют ли ваши действия API цифровых покупок для выполнения транзакций с цифровыми товарами» .
  4. Нажмите Сохранить .

Создайте ключ API цифровых товаров

Чтобы отправлять запросы к API цифровых товаров, вам необходимо загрузить ключ учетной записи службы JSON, связанный с вашим проектом консоли Actions.

Чтобы получить ключ сервисной учетной записи, выполните следующие действия:

  1. В консоли «Действия» щелкните значок с тремя точками в правом верхнем углу, затем выберите «Настройки проекта».
  2. Найдите идентификатор проекта вашего действия.
  3. Перейдите по этой ссылке, заменив « <project_id> » идентификатором вашего проекта: https://console.developers.google.com/apis/credentials?project=project_id .
  4. В главной навигации перейдите в раздел «Учетные данные» .
  5. На появившейся странице нажмите «Создать учетные данные» , затем «Ключ сервисной учетной записи» .
  6. Перейдите в раздел «Учетная запись службы» и нажмите «Новая учетная запись службы» .
  7. Присвойте учетной записи службы имя, например digitaltransactions.
  8. Нажмите Создать .
  9. Установите роль Project > Owner .
  10. Нажмите Продолжить .
  11. Нажмите Создать ключ .
  12. Выберите тип ключа JSON .
  13. Нажмите «Создать ключ» и загрузите ключ учетной записи службы JSON.

Сохраните этот ключ сервисной учетной записи в надежном месте. Вы будете использовать этот ключ для создания клиента для API цифровых покупок.

Подключитесь к своему инвентарю Play

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

Чтобы подключить веб-домен и приложение консоли Play к проекту Actions, выполните следующие действия:

  1. В консоли «Действия» выберите «Развертывание» , затем «Проверка бренда» .
  2. Если вы не подключили ни одного объекта, сначала подключите веб-сайт:

    1. Нажмите кнопку веб-ресурса ( </> ).
    2. Введите URL-адрес своего веб-домена и нажмите «Подключиться» .

    Google отправляет электронное письмо с дальнейшими инструкциями лицу, подтвердившему этот веб-домен в консоли поиска Google . Как только получатель этого письма выполнит эти действия, веб-сайт должен появиться в разделе «Проверка бренда» .

  3. Если у вас есть хотя бы один подключенный веб-сайт, выполните следующие действия, чтобы подключить приложение Android:

    1. В консоли «Действия» выберите «Развертывание» , затем «Проверка бренда» .
    2. Нажмите «Подключить приложение» .
    3. На появившейся странице следуйте инструкциям, чтобы подтвердить свой веб-домен на консоли Play. Выберите приложение Play, содержащее ваши цифровые товары, и введите URL-адрес веб-домена точно так, как он показан на странице проверки бренда .

      Google еще раз отправляет подтверждающее электронное письмо подтвержденному владельцу домена. Как только они одобряют проверку, ваше приложение Play должно появиться в разделе «Проверка бренда» .

    4. Включите покупки в Access Play .

Изображение, показывающее веб-сайт и приложения, связанные с проектом Actions.

Создайте свой поток покупок

Подготовив проект Actions и инвентарь цифровых товаров, создайте поток покупки цифровых товаров в веб-перехватчике для выполнения разговоров.

1. Настройте API-клиент цифровых покупок.

В веб-перехватчике выполнения разговора создайте клиент JWT с ключом JSON вашего сервисного аккаунта и областью действия https://www.googleapis.com/auth/actions.purchases.digital .

Следующий код Node.js создает клиент JWT для API цифровых покупок:

  const serviceAccount = {'my-file.json'};
  const request = require('request');
  const {google} = require('googleapis');

  const jwtClient = new google.auth.JWT(
    serviceAccount.client_email, null, serviceAccount.private_key,
    ['https://www.googleapis.com/auth/actions.purchases.digital'],
    null
  );

2. Соберите информацию

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

2. а. Проверка требований к транзакции

Рекомендуется убедиться, что учетная запись пользователя настроена для выполнения транзакций, прежде чем предоставлять ему возможность совершить покупку. Вам следует перейти к сцене DigitalPurchaseCheck , которая проверяет, что пользователь проверен, выполняет ли он транзакцию на разрешенной поверхности (умный дисплей, интеллектуальная колонка или Android) и находится ли он в регионе, где осуществляются цифровые транзакции. поддерживается.

Чтобы создать сцену проверки цифровой покупки, выполните следующие действия:

  1. На вкладке «Сцены» добавьте новую сцену с именем DigitalPurchaseCheck .
  2. В разделе «Заполнение слотов» нажмите + , чтобы добавить новый слот.
  3. В разделе «Выбор типа» выберите actions.type.DigitalPurchaseCheckResult в качестве типа слота.
  4. В поле имени слота дайте слоту имя DigitalPurchaseCheck .
  5. Установите флажок Настроить обратную запись значения слота (включено по умолчанию).
  6. Нажмите Сохранить .

Проверка цифровой покупки приведет к одному из следующих результатов:

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

Чтобы обработать результат проверки цифровой покупки, выполните следующие действия:

  1. На вкладке «Сцены» выберите только что созданную сцену DigitalPurchaseCheck .
  2. В разделе «Условие» нажмите «+» , чтобы добавить новое условие.
  3. В текстовом поле введите следующий синтаксис условия, чтобы проверить условие успеха:

    scene.slots.status == "FINAL" && session.params.DigitalPurchaseCheck.resultType == "CAN_PURCHASE"
    
  4. Наведите курсор на только что добавленное условие и щелкните стрелку вверх, чтобы поместить его перед if scene.slots.status == "FINAL" .

  5. Включите запросы на отправку и предоставьте простое приглашение, сообщающее пользователю, что он готов совершить транзакцию:

    candidates:
      - first_simple:
          variants:
            - speech: >-
                You are ready to purchase digital goods.
    
  6. В разделе «Переход» выберите другую сцену, позволяющую пользователю продолжить разговор и приступить к совершению транзакции.

  7. Выберите условие else if scene.slots.status == "FINAL" .

  8. Включите запросы на отправку и предоставьте простой запрос, сообщающий пользователю, что он не может совершить транзакцию:

    candidates:
      - first_simple:
          variants:
            - speech: Sorry you cannot perform a digital purchase.
    
  9. В разделе «Переход» выберите «Завершить разговор» , чтобы завершить разговор.

2. б. Соберите доступный инвентарь

Используйте API цифровых покупок, чтобы запросить доступный на данный момент инвентарь в магазине Play, а затем встроить его в массив объектов JSON для каждого продукта. Вы ссылаетесь на этот массив позже, чтобы показать пользователю, какие опции доступны для покупки.

Каждый ваш цифровой товар представлен в виде SKU в формате JSON. Следующий код Node.js описывает ожидаемое форматирование каждого SKU:

body = {
  skus: [
    skuId: {
      skuType: one of "SKU_TYPE_IN_APP" or "SKU_TYPE_SUBSCRIPTION"
      id: string,
      packageName: string
    }
    formattedPrice: string,
    title: string,
    description: string
  ]
}

Отправьте запрос POST в конечную точку https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet , где {packageName} — это имя пакета вашего приложения в консоли Google Play (например, com.myapp.digitalgoods . com.myapp.digitalgoods ) и отформатируйте результат в массив объектов SKU.

Чтобы получить в результирующем массиве только определенные цифровые товары, укажите идентификаторы цифровых товаров (как показано под каждым продуктом в приложении в консоли Google Play), которые вы хотите сделать доступными для покупки в body.ids .

Следующий код Node.js запрашивает список доступных товаров у API цифровых покупок и форматирует результат как массив SKU:

return jwtClient.authorize((err, tokens) => {
    if (err) {
      throw new Error(`Auth error: ${err}`);
    }

    const packageName = 'com.example.projectname';

    request.post(`https://actions.googleapis.com/v3/packages/${packageName}/skus:batchGet`, {
      'auth': {
        'bearer': tokens.access_token,
      },
      'json': true,
      'body': {
        'conversationId': conv.session.id,
        'skuType': 'SKU_TYPE_IN_APP',
        // This request is filtered to only retrieve SKUs for the following product IDs
        'ids': ['annual.subscription']
      },
    }, (err, httpResponse, body) => {
      if (err) {
        throw new Error(`API request error: ${err}`);
      }
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
      console.log(JSON.stringify(body));
    });
  });
});

3. Наведите порядок

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

Следующий код Node.js считывает массив объектов SKU и создает ответ списка с одним элементом списка для каждого:

const items = [];
const entries = [];
skus.forEach((sku) => {
   const key = `${sku.skuId.skuType},${sku.skuId.id}`
   items.push({
       key: key
   });
   entries.push({
       name: key,
       synonyms: [],
       display: {
           title: sku.title,
           description: `${sku.description} | ${sku.formattedPrice}`,
       }
   });
});

conv.session.typeOverrides = [{
   name: 'type_name',
   mode: 'TYPE_REPLACE',
   synonym: {
       entries: entries
   }
}];

conv.add(new List({
   title: 'List title',
   subtitle: 'List subtitle',
   items: items,
}));

Создать покупку по выбору пользователя

Как только пользователь выберет товар, вы можете создать заказ. Для этого в слоте, связанном с выбранным элементом, вы можете вызвать свой вебхук, чтобы создать заказ. После выполнения сохраните данные заказа в параметре сеанса. Объект заказа используется в разных сценах одного и того же сеанса.

conv.session.params.purchase = {
  "@type": "type.googleapis.com/google.actions.transactions.v3.CompletePurchaseValueSpec",
  "skuId": {
    "skuType": "<SKU_TYPE_IN_APP>",
    "id": "<SKU_ID>",
    "packageName": "<PACKAGE_NAME>"
  },
  "developerPayload": ""
};

Вместо этого в Actions Builder вы можете использовать редактор JSON для настройки слота с указанным выше объектом заказа. Обе реализации используют один и тот же формат CompletePurchaseValueSpec , который вы можете найти в справочнике по полезной нагрузке веб-перехватчика JSON .

4. Завершите покупку

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

Создайте полную сцену покупки

  1. На вкладке «Сцены» добавьте новую сцену с именем CompletePurchase .
  2. В разделе «Заполнение слотов» нажмите + , чтобы добавить новый слот.
  3. В разделе «Выбор типа» выберите actions.type.CompletePurchaseValue в качестве типа слота.
  4. В поле имени слота укажите имя CompletePurchase .
  5. Установите флажок Настроить обратную запись значения слота (включено по умолчанию).
  6. В разделе «Настроить слот» выберите Use session parameter в раскрывающемся списке.
  7. В разделе «Настроить слот» введите в текстовое поле имя параметра сеанса, используемого для хранения заказа (т. е. $session.params.purchase ).
  8. Нажмите Сохранить .

5. Работайте с результатом

Слот с типом actions.type.CompletePurchaseValue может иметь следующие результаты:

  • PURCHASE_STATUS_OK : покупка прошла успешно. На этом этапе транзакция завершена, поэтому выйдите из потока транзакций и вернитесь к разговору.
  • PURCHASE_STATUS_ALREADY_OWNED : транзакция не удалась, поскольку этот элемент уже принадлежит пользователю. Избегайте этой ошибки, проверяя предыдущие покупки пользователя и адаптируя отображаемые товары, чтобы у него не было возможности повторно приобрести уже имеющиеся у него предметы.
  • PURCHASE_STATUS_ITEM_UNAVAILABLE : транзакция не удалась, поскольку запрошенный элемент недоступен. Избегайте этой ошибки, проверяя доступные SKU ближе к моменту покупки.
  • PURCHASE_STATUS_ITEM_CHANGE_REQUESTED : транзакция не удалась, поскольку пользователь решил приобрести что-то еще. Повторите запрос при построении заказа, чтобы пользователь мог сразу принять другое решение.
  • PURCHASE_STATUS_USER_CANCELLED : транзакция не удалась, поскольку пользователь отменил процесс покупки. Поскольку пользователь преждевременно вышел из потока, спросите его, хотят ли они повторить транзакцию или вообще выйти из транзакции.
  • PURCHASE_STATUS_ERROR : транзакция не удалась по неизвестной причине. Сообщите пользователю, что транзакция не удалась, и спросите, хочет ли он повторить попытку.
  • PURCHASE_STATUS_UNSPECIFIED : транзакция не удалась по неизвестной причине, что привело к неизвестному статусу. Обработайте этот статус ошибки, сообщив пользователю, что транзакция не удалась, и спросите, хотят ли они повторить попытку.

Вам следует обрабатывать каждый из этих результатов из сцены CompletePurchase .

  1. На вкладке «Сцены» выберите только что созданную сцену CompletePurchase .
  2. В разделе «Условие» нажмите «+» , чтобы добавить новое условие.
  3. В текстовом поле введите следующий синтаксис условия, чтобы проверить условие успеха:

    scene.slots.status == "FINAL" && session.params.CompletePurchase.purchaseStatus == "PURCHASE_STATUS_OK"
    
  4. Наведите курсор на только что добавленное условие и щелкните стрелку вверх, чтобы поместить его перед if scene.slots.status == "FINAL" .

  5. Включите запросы на отправку и предоставьте простое приглашение, сообщающее пользователю, что он готов совершить транзакцию:

    candidates:
      - first_simple:
          variants:
            - speech: >-
                Your purchase was successful.
    
  6. В разделе «Переход» выберите «Завершить разговор» , чтобы завершить разговор.

Повторите вышеуказанные шаги для каждого типа результата покупки, который вы хотите поддержать.

Отражать покупки пользователя

Когда пользователь запрашивает ваше действие, объект user JSON запроса включает список его покупок. Проверьте эту информацию и измените ответ вашего действия в зависимости от того, за какой контент заплатил пользователь.

В следующем примере кода показан user объект запроса, который включает в себя packageEntitlements предыдущих покупок в приложении, которые они совершили для пакета com.digitalgoods.application :

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "example_session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
      "packageEntitlements": [
        {
          "packageName": "com.digitalgoods.application",
          "entitlements": [
            {
              "sku": "non-consumable.1",
              "skuType": "SKU_TYPE_IN_APP"
            }
            {
              "sku": "consumable.2",
              "skuType": "SKU_TYPE_IN_APP"
            }
          ]
        },
        {
          "packageName": "com.digitalgoods.application",
          "entitlements": [
            {
              "sku": "annual.subscription",
              "skuType": "SKU_TYPE_SUBSCRIPTION",
              "inAppDetails": {
                "inAppPurchaseData": {
                  "autoRenewing": true,
                  "purchaseState": 0,
                  "productId": "annual.subscription",
                  "purchaseToken": "12345",
                  "developerPayload": "HSUSER_IW82",
                  "packageName": "com.digitalgoods.application",
                  "orderId": "GPA.233.2.32.3300783",
                  "purchaseTime": 1517385876421
                },
                "inAppDataSignature": "V+Q=="
              }
            }
          ]
        }
      ]
     }
   },
  "homeStructure": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

Проверьте свой проект

При тестировании вашего проекта вы можете включить режим «песочницы» в консоли «Действия», чтобы протестировать свое действие без взимания платы за способ оплаты. Чтобы включить режим песочницы, выполните следующие действия:

  1. В консоли «Действия» нажмите «Тест» в области навигации.
  2. Нажмите «Настройки» .
  3. Включите опцию «Песочница разработки» .