На основе com.android.billingclient:billing:1.2 происходит упаковка всего процесса оплаты.
Рекомендую к использованию мою универсальную рекламную быстро интегрируемую платформу ADEasy: https://blog.csdn.net/u013640004/article/details/105416193.
Эта версия подходит только для использования в одном activity, иначе необходимо решить проблему с очисткой слушателей. Рекомендуется попробовать использовать последнюю версию: GoogleBilling1.2.2.13 .
QQ группа для общения: 425219113 (для обсуждения языков программирования).
=============Использование============
Скачайте GoogleBuillingUtil.
Подключитесь к API.
==========build.gradle(Module)==========
android {
dependencies {
implementation 'com.android.billingclient:billing:1.2.2'
//Если используется isGooglePlayServicesAvailable метод, то необходимо импортировать этот пакет, но можно отказаться от этого метода.
implementation "com.google.android.gms:play-services-location:16.0.0"
}
}
//В aar уже есть разрешения, приложение может игнорировать их, но другие способы интеграции требуют наличия этого разрешения.
<uses-permission
android:name="com.android.vending.BILLING"
android:required="false"/>
//Вызвать перед GoogleBillingUtil.build(). Необходимо вызвать только один раз.
GoogleBillingUtil.setSkus(new String[]{"Идентификатор товара для покупки"},new String[]{"Идентификатор подписки на товар"})//Если нет, передайте null или new String[], а не new String[]{}
private GoogleBillingUtil googleBillingUtil = null;
private MyOnPurchaseFinishedListener mOnPurchaseFinishedListener = new MyOnPurchaseFinishedListener();//Слушатель для завершения покупки
private MyOnQueryFinishedListener mOnQueryFinishedListener = new MyOnQueryFinishedListener();//Слушатель завершения запроса
private MyOnStartSetupFinishedListener mOnStartSetupFinishedListener = new MyOnStartSetupFinishedListener ();//Слушатель результата запуска
private MyOnConsumeResponseListener mOnConsumeResponseListener = new MyOnConsumeResponseListener();//Слушатель ответа на потребление
@Override
protected void onCreate(...) {
super.onCreate(...);
GoogleBillingUtil.setIsAutoConsumeAsync(false);//Рекомендуется отключить автоматическое потребление при наличии проверки на стороне сервера, вместо этого реализовать логику потребления самостоятельно.
googleBillingUtil = GoogleBillingUtil.getInstance()
.setOnPurchaseFinishedListener(mOnPurchaseFinishedListener)//Обратите внимание, что установка слушателя является необязательной и зависит от ваших потребностей.
.setOnQueryFinishedListener(mOnQueryFinishedListener)
.setOnStartSetupFinishedListener(mOnStartSetupFinishedListener)
.setOnConsumeResponseListener(mOnConsumeResponseListener )
.build(context);
}
public void queryInventoryInApp() 查询 список товаров для покупки
public void queryInventorySubs() 查询 список подписок на товары
public void purchaseInApp(Activity activity,String skuId) Покупка внутри приложения
public void purchaseSubs(Activity activity,String skuId) Подписка
//Если следующая или предыдущая страница не использует googleBuillingUtil.getInstance(), необходимо вызвать cleanListener() перед finish или startActivity, чтобы очистить интерфейс.
//Можно попробовать так
@Override
public void onBackPressed() {
GoogleBillingUtil.cleanListener();
super.onBackPressed();
}
//Нажмите кнопку возврата
public void onBackClick()
{
GoogleBillingUtil.cleanListener();
this.finish();
}
//Если вы используете googleBuilingUtil только один раз, вы можете выбрать использование endConnection() для разрыва соединения с сервисом Google, а затем повторно подключиться при следующем использовании.
//Обратный вызов интерфейса запроса товаров
private class MyOnQueryFinishedListener implements GoogleBillingUtil.OnQueryFinishedListener
{
@Override
public void onQuerySuccess(String skuType,List<SkuDetails> list) {
//Запрос выполнен успешно, возвращён список товаров,
//skuDetails.getPrice() получает цену (текст)
//skuDetails.getType() получает тип sub или inapp, поскольку результаты запросов sub и inapp проходят здесь, поэтому необходимо проверить.
//googleBillingUtil.getSubsPositionBySku(skuDetails.getSku()) получает текущий номер позиции subs sku
//googleBillingUtil.getInAppPositionBySku(skuDetails.getSku()) получает текущую позицию inapp suk
}
@Override
public void onQueryFail(int responseCode) {
//Ошибка запроса
}
@Override
public void onQueryError() {
//Ошибки запроса
}}
//Обратный звонок после инициализации сервиса
private class MyOnStartSetupFinishedListener реализует GoogleBillingUtil.OnStartSetupFinishedListener
{
//...;
}
//Обратный звонок при покупке товара
private class MyOnPurchaseFinishedListener реализует GoogleBillingUtil.OnPurchaseFinishedListener
{
@Override
public void ```
onPurchaseSuccess(List<Purchase> list) {
// Внутренний закуп или подписка успешны, можно получить sku через purchase.getSku() и определить, какой это товар
}
@Override
public void onPurchaseFail(int responseCode) {
}
@Override
public void onPurchError() {
}
Ответный код | Значение | Описание |
---|---|---|
BILLING_RESPONSE_RESULT_OK | 0 | Успех |
BILLING_RESPONSE_RESULT_USER_CANCELED | 1 | Пользователь нажал «Назад» или отменил диалог |
BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE | 2 | Сетевое соединение прервано |
BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE | 3 | Запрошенный тип не поддерживается API версии Billing (проблема с платёжной средой) |
BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE | 4 | Запрос на товар больше не доступен. |
BILLING_RESPONSE_RESULT_DEVELOPER_ERROR | 5 | Параметры, переданные в API, недействительны. Эта ошибка также может указывать на то, что приложение не было должным образом подписано или настроено для покупки в Google Play, или что у приложения нет необходимых разрешений в его манифесте. |
BILLING_RESPONSE_RESULT_ERROR | 6 | Серьёзная ошибка во время операции API |
BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED | 7 | Не удалось купить, потому что товар уже есть |
BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED | 8 | Не удалось потратить, потому что товара ещё нет |
1. Сбой инициализации, код ошибки: 3, это проблема с платёжной средой.
Возможные причины: используется эмулятор, устаревшая версия три-в-одном, платёжная среда приложения не настроена (подключение к сервисам Google, разрешения на оплату), VPN не поддерживает регион.
Решение: а. Сначала проверьте среду. Загрузите из магазина приложение с покупками и посмотрите, работает ли оно. б. Если чужое приложение работает, попробуйте снова протестировать своё приложение, чтобы убедиться, что платёжная среда работает нормально.
2. Можно запросить цену, но нельзя купить, появляется сообщение «Товар нельзя купить».
Это проблема базовой конфигурации, возможны следующие причины: версия не соответствует онлайн-версии, используется тестовый аккаунт (скорее всего), подпись не совпадает.
3. Можно запросить цену, но платёжное окно не открывается, код ошибки: 3, ошибка: Error:In-app billing error: Null data in IAB activity result.
Причина в том, что вы не предоставили разрешение на всплывающее окно платёжного окна Google Play Store, многие мобильные телефоны имеют управление всплывающими окнами, особенно Xiaomi, если разрешение не предоставлено, никаких подсказок не будет, и они будут заблокированы. (Эта проблема больше не существует в новой версии магазина Google).
4. Платёж показывает успех, но вызывается обратный вызов onQueryFail, и возвращаемый список товаров равен нулю.
Это связано с тем, что вы неправильно используете метод, помните, что purchaseInApp — это покупка, а purchaseSubs — подписка. То же самое относится и к запросу. Кроме того, при запросе ошибка, скорее всего, связана с тем, что вы передали пустую строку вместо пустого массива при настройке SKUS.
5. Возвращаемый список товаров имеет нулевую длину при запросе.
При настройке SKUs порядок внутренних покупок и подписок был перепутан, он должен быть первым для внутренних покупок, а вторым параметром — для подписок.
Или товар ещё не выпущен, нужно подождать некоторое время (очень вероятно, новые товары не отвечают ни на какие запросы или покупки, независимо от того, как они запрашиваются или покупаются на стороне Google).
6. Мы обнаружили, что ваше приложение использует старую версию Google Play Developer API. Начиная с 1 декабря 2019 года мы больше не будем поддерживать версии 1 и 2 этого API. Пожалуйста, обновите используемый вами API до версии 3 до этой даты. Обратите внимание, что это изменение не связано с отказом от AIDL/платёжной библиотеки.
Обновитесь до com.android.billingclient:billing, откажитесь от использования кода, связанного с AIDL.
Фоновый режим также необходимо обновить до версии v3 проверочного интерфейса. Подробности см. в официальной документации Google.
==================API описание=============
// Инициализация
// Запрос, покупка и потребление 4. public void queryInventoryInApp() запрос списка товаров для внутренней покупки 5. public void queryInventorySubs() запрос списка товаров по подписке 6. public void purchaseInApp(Activity activity, String skuId) инициировать внутреннюю покупку 7. public void purchaseSubs(Activity activity, String skuId) начать подписку 8. public void consumeAsync(String purchaseToken) потреблять товары (обычно не нужно вызывать вручную, автоматически вызывается при покупке)
// История покупок, количество активных подписок 9. public List queryPurchasesInApp() получить список уже купленных товаров 10. public List queryPurchasesSubs() получить список уже подписанных товаров 11. public int getPurchasesSizeSubs() — получение количества активных подписок (-1 — ошибка запроса, 0 — нет активных подписок, >0 — есть активные подписки).
// Удобное средство 12. public int getSubsPositionBySku(String sku) — получение номера товара по подписке по sku. 13. public int getInAppPositionBySku(String sku) — получение номера внутриигрового товара по sku. 14. public String getSubsSkuByPosition(int position) — получение sku товара по подписке по номеру позиции. 15. public String getInAppSkuByPosition(int position) — получение sku внутриигрового товара по номеру позиции. 16. private String getSkuType(String sku) — определение типа товара (inapp — внутриигровой товар, subs — товар по подписке).
// Интерфейс настройки 17. public GoogleBillingUtil setOnPurchaseFinishedListener(OnPurchaseFinishedListener onPurchaseFinishedListener) — установка интерфейса обратного вызова при покупке. 18. public GoogleBillingUtil setOnQueryFinishedListener(OnQueryFinishedListener onQueryFinishedListener) — настройка интерфейса обратного вызова для получения информации о товаре. 19. public GoogleBillingUtil setOnStartSetupFinishedListener(OnStartSetupFinishedListener onStartSetupFinishedListener) — интерфейс обратного вызова после завершения инициализации сервиса.
// Прочее 20. public void setIsAutoConsumeAsync(boolean isAutoConsumeAsync) — установка режима автоматического потребления товаров (использовать с осторожностью). 21. public static void cleanListener() — очистка всех слушателей для предотвращения утечек памяти и других проблем. 22. public static void endConnection() — разрыв соединения с сервисом Google (обычно не рекомендуется вызывать этот метод, лучше оставить соединение открытым).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )