В этом руководстве описывается, как интегрироваться с API-интерфейсами для поддержки внешних предложений в соответствующих приложениях и регионах. Дополнительную информацию о программе внешних предложений, в том числе о требованиях к участию и географическом охвате, см. в требованиях к программе .
Настройка платежной библиотеки Play
Чтобы использовать API внешних предложений, добавьте версию 6.2.1 или более позднюю версию библиотеки платежей Play в свое приложение Android. Если вам необходимо перейти с более ранней версии, следуйте инструкциям в руководстве по миграции , прежде чем пытаться реализовать внешние предложения.
Подключитесь к Google Play
Первые шаги в процессе интеграции такие же, как описано в руководстве по интеграции биллинга , с некоторыми изменениями при инициализации BillingClient
:
- Вам нужно вызвать новый метод, чтобы указать, что вы хотите использовать внешние предложения:
enableExternalOffer
.
В следующем примере демонстрируется инициализация BillingClient
с этими изменениями:
Котлин
var billingClient = BillingClient.newBuilder(context)
.enableExternalOffer()
.build()
Ява
private BillingClient billingClient = BillingClient.newBuilder(context)
.enableExternalOffer()
.build();
После инициализации BillingClient
вам необходимо установить соединение с Google Play , как описано в руководстве по интеграции.
Проверить наличие
Ваше приложение должно подтвердить доступность внешних предложений, вызвав isExternalOfferAvailableAsync
.
Этот API возвращает BillingResponseCode.OK
, если доступны внешние предложения. Подробную информацию о том, как ваше приложение должно реагировать на другие коды ответа, см. в разделе «Обработка ответов».
Котлин
billingClient.isExternalOfferAvailableAsync(
object : ExternalOfferAvailabilityListener {
override fun onExternalOfferAvailabilityResponse(
billingResult: BillingResult) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling external offers unavailable, etc.
return
}
// External offers are available. Continue with steps in the
// guide.
})
Ява
billingClient.isExternalOfferAvailableAsync(
new ExternalOfferAvailabilityListener() {
@Override
public void onExternalOfferAvailabilityResponse(
BillingResult billingResult) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors,
// handling external offers being unavailable, etc.
return;
}
// External offers are available. Continue with steps in the
// guide.
}
});
Подготовьте токен внешней транзакции
Чтобы сообщить о внешней транзакции в Google Play, у вас должен быть токен внешней транзакции, сгенерированный из библиотеки платежей Play. Новый токен внешней транзакции должен создаваться каждый раз, когда пользователь посещает внешний веб-сайт через API внешних предложений. Это можно сделать, вызвав API createExternalOfferReportingDetailsAsync
. Этот токен должен быть сгенерирован непосредственно перед тем, как пользователь будет направлен за пределы приложения. Его никогда не следует кэшировать, а новый должен создаваться каждый раз, когда пользователь выходит за пределы приложения.
Котлин
billingClient.createExternalOfferReportingDetailsAsync(
object : ExternalOfferReportingDetailsListener {
override fun onExternalOfferReportingDetailsResponse(
billingResult: BillingResult,
externalOfferReportingDetails: ExternalOfferReportingDetails?) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return
}
val externalTransactionToken =
externalOfferReportingDetails?.externalTransactionToken
// Persist the transaction token locally. Pass it to the external
// website when showExternalOfferInformationDialog is called.
}
})
Ява
billingClient.createExternalOfferReportingDetailsAsync(
new ExternalOfferReportingDetailsListener() {
@Override
public void onExternalOfferReportingDetailsResponse(
BillingResult billingResult,
@Nullable ExternalOfferReportingDetails
externalOfferReportingDetails) {
if (billingResult.getResponseCode() != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
return;
}
String transactionToken =
externalOfferReportingDetails.getExternalTransactionToken();
// Persist the external transaction token locally. Pass it to the
// external website when showExternalOfferInformationDialog is
// called.
}
});
Информационный диалог для пользователей
Для интеграции с внешними предложениями ваше подходящее приложение должно отображать информационный экран, который поможет пользователям понять, что их собираются перенаправить за пределы приложения на внешний веб-сайт. Информационный экран необходимо показывать пользователям путем вызова API showExternalOfferInformationDialog
перед каждой ссылкой на внешнее предложение.
Котлин
// An activity reference from which the external offers information dialog
// will be launched.
val activity : Activity = ...;
val listener : ExternalOfferInformationDialogListener =
ExternalOfferInformationDialogListener {
override fun onExternalOfferInformationDialogResponse(
billingResult: BillingResult){
// Check billingResult
}
}
val billingResult = billingClient.showExternalOfferInformationDialog(
activity, listener)
Ява
// An activity reference from which the external offers information dialog
// will be launched.
Activity activity = ...;
ExternalOfferInformationDialogListener listener =
new ExternalOfferInformationDialogListener() {
@Override
public void onExternalOfferInformationDialogResponse(
BillingResult billingResult) {
if (billingResult.responseCode != BillingResponseCode.OK) {
// Handle failures such as retrying due to network errors.
}
// Open the external website, passing along the external transaction
// token as a URL parameter. If the user purchases an item, be sure
// to report the transaction to Google Play.
}
}
BillingResult billingResult =
billingClient.showExternalOfferInformationDialog(activity, listener);
Если этот метод возвращает BillingResponseCode.OK
, ваше приложение может перенаправить пользователя на внешний веб-сайт. Если метод возвращает BillingResponseCode.USER_CANCELED
, ваше приложение не должно продолжать открывать веб-сайт.
Сообщайте о транзакциях в Google Play
Обо всех внешних транзакциях необходимо сообщать в Google Play, вызывая API разработчика Google Play со своей серверной части. О внешних транзакциях необходимо сообщать при предоставлении externalTransactionToken
полученного с помощью API createExternalOfferReportingDetailsAsync
. Если пользователь совершает несколько покупок, вы можете использовать один и тот же externalTransactionToken
для отчета о каждой покупке. Чтобы узнать, как сообщить о транзакции, см. руководство по интеграции с серверной частью .
Обработка ответов
При возникновении ошибки методы isExternalOfferAvailableAsync
, createExternalOfferReportingDetailsAsync
и showExternalOfferInformationDialog
могут возвращать ответы, отличные от BillingResponseCode.OK
. Рассмотрите возможность обработки этих кодов ответа следующим образом:
-
ERROR
: Это внутренняя ошибка. Не продолжайте транзакцию или открытие внешнего веб-сайта. Повторите попытку, вызвавshowExternalOfferInformationDialog()
, чтобы отобразить диалоговое окно с информацией для пользователя в следующий раз, когда вы попытаетесь направить пользователя за пределы приложения. -
FEATURE_NOT_SUPPORTED
: API внешних предложений не поддерживаются Play Store на текущем устройстве. Не продолжайте транзакцию или открытие внешнего веб-сайта. -
USER_CANCELED
: не открывайте внешний веб-сайт. ВызовитеshowExternalOfferInformationDialog()
еще раз, чтобы отобразить диалоговое окно с информацией для пользователя в следующий раз, когда вы попытаетесь направить пользователя за пределы приложения. -
BILLING_UNAVAILABLE
: транзакция не подлежит участию во внешних предложениях и поэтому не должна проводиться в рамках этой программы. Это связано либо с тем, что пользователь не находится в стране, подходящей для участия в этой программе, либо с тем, что ваша учетная запись не была успешно зарегистрирована в программе. В последнем случае проверьте статус регистрации в консоли разработчика Play. -
DEVELOPER_ERROR
: в запросе произошла ошибка. Прежде чем продолжить, используйте сообщение отладки, чтобы выявить и исправить ошибку. -
NETWORK_ERROR, SERVICE_DISCONNECTED, SERVICE_UNAVAILABLE
: это временные ошибки, которые следует обрабатывать с помощью соответствующей политики повторных попыток. В случаеSERVICE_DISCONNECTED
перед повторной попыткой повторно установите соединение с Google Play.
Тестируйте внешние предложения
Тестеры лицензий следует использовать для проверки интеграции ваших внешних предложений. Вам не будет выставлен счет за транзакции, инициированные учетными записями тестировщиков лицензий. Дополнительные сведения о настройке тестеров лицензий см. в разделе Проверка выставления счетов в приложении с помощью лицензирования приложений .
Следующие шаги
Завершив интеграцию в приложении, вы готовы интегрировать свою серверную часть .