Samsung in app purchase сеть недоступна ic100000 9002 com adobe reader
Привет, я Влад, core разработчик Adapty SDK для Android. Продолжаю серию статей про то, как внедрять внутренние покупки в приложение Google Play. Остальные посты можно найти по ссылкам:
Android in-app purchases, часть 4: коды ошибок от Billing Library и как не облажаться с тестированием. — Вы тут.
Сегодня мы поговорим о кодах ошибок, которые мы можем получить от Billing Library в методе getResponseCode().
Пример того, как мы передавали ошибки в свои колбэки, можно посмотреть в этой статье. С одной ошибкой мы уже знакомы по предыдущим статьям — это USER_CANCELED, когда пользователь закрывает диалог покупки, ничего не купив. Давайте познакомимся с остальными.
Коды ошибок
Начнем с самых простых ошибок – с говорящим названием ERROR (responseCode 6) и чуть более говорящим названием DEVELOPER_ERROR (responseCode 5). Для первого случая гугл пишет в документации «Fatal error during the API action», для второго – «Invalid arguments provided to the API». Например, я смог получить DEVELOPER_ERROR, когда для запроса querySkuDetailsAsync() в билдер в setType() передал пустую строку.
Но не всё так просто. Я пошел дальше и в методе launchBillingFlow() использовал измененный SkuDetails (вытащил json из SkuDetails реального продукта, поменял в нем productId и передал в конструктор новому SkuDetails). По сути это invalid argument, и я ожидал получить DEVELOPER_ERROR, но… получил ERROR.
Отдельного упоминания заслуживает текст, который показывается в диалоге в этом кейсе — сравните английский и русский вариант:
Это, конечно, был искусственный пример. Гораздо ближе к реальности кейс, когда гугл отклонил оплату. Если при тестировании покупок с тестовой карты, о чем мы расскажем в конце статьи, в диалоге покупки выбрать «test card, always declined», вернется также ошибка ERROR, но уже с адекватным текстом.
В третьей статье, где описывалась смена подписки, мы для одного из proration mode увеличили цену годовой подписки почти в 3 раза, но не сказали, какая там должна была быть ошибка, если бы мы этого не сделали. Исправляемся.
Так как там, получается, указан неправильный proration mode, по логике мы должны получить всё ту же DEVELOPER_ERROR. Но нет, мы получаем SERVICE_UNAVAILABLE (responseCode 2). Ее же мы получаем и если указать любое левое число в качестве proration mode (это int, а не enum, нас никто не остановит), и если указать неправильный purchaseToken. Смотрим в документацию про SERVICE_UNAVAILABLE – «Network connection is down». Так, стоп…
При этом еще мы видим интересный диалог.
Что еще любопытно – в кейсе с ERROR при закрытии диалога НЕ через кнопку «ОК» (то есть, теми способами, которые интерпретируются как возврат назад) в onPurchasesUpdated() пришло, собственно, ERROR, а в случае с SERVICE_UNAVAILABLE в аналогичном кейсе приходит USER_CANCELED (но если нажать «ОК» в диалоге, то мы, как и ожидали, получим SERVICE_UNAVAILABLE).
Ну и в случае с отсутствием интернета SERVICE_UNAVAILABLE тоже приходит, тут не соврали.
Вот остальные коды ошибок с небольшими комментариями, так сказать, honorable mentions.
BILLING_UNAVAILABLE (responseCode 3). Гугл поясняет, что «Billing API version is not supported for the type requested». Я смог воспроизвести эту ошибку, разлогинившись из Google-аккаунта, а также на Хуавее без Google Play Services. Возможно, она также воспроизведется на старых телефонах, где не обновляли Google Play.
SERVICE_DISCONNECTED (responseCode -1). Приложение иногда дисконнектится от сервиса Google Play. Это может произойти, если Play Store вдруг решит обновиться. Поэтому лучше перестраховаться и коннектиться перед каждым вызовом методов Billing Library, как в предыдущих статьях. А еще мы с гуглом советуем добавить какую-нибудь retry policy, если эта ошибка всё же придет в ответе.
SERVICE_TIMEOUT (responseCode -3). Название говорит само за себя — мы слишком долго ждали ответ от Google Play.
FEATURE NOT SUPPORTED (responseCode -2). В классе BillingClient есть пять констант FeatureType. Их доступность на данном устройстве можно проверять с помощью метода billingClient.isFeatureSupported(BillingClient.FeatureType.НужнаяФича). У меня на телефоне (Xiaomi Mi A2 Lite) FEATURE_NOT_SUPPORTED вернулось только для SUBSCRIPTIONS_ON_VR. При этом для IN_APP_ITEMS_ON_VR, как и для всех остальных фич, вернулось OK.
ITEM_NOT_OWNED (responseCode 8). Возникает при попытке законсьюмить покупку, которой у нас нет. Например, повторно после успешного консьюма.
ITEM_ALREADY_OWNED (responseCode 7). А тут наоборот – при попытке купить продукт, который у нас уже есть. В таком кейсе просто нужно обновить UI и сделать кнопку покупки некликабельной.
Самая популярная ошибка
Последняя и, наверное, самая популярная ошибка в начале пути внедрения in-app purchases — это ITEM_UNAVAILABLE (responseCode 4). Она говорит о том, что продукт недоступен для покупки, но не говорит, почему. А причины могут быть самые разные: от тестирования на неправильном аккаунте или неправильной сборке до покупки неактивированного продукта.
Вот чек-лист, что нужно сделать, чтобы избежать ее при тестировании:
Добавить в этот test track гугл-аккаунты тестировщиков, что особенно актуально для internal testing или закрытой альфы/беты. Там же будет ссылка в разделе How testers join your test, по которой тестировщики должны будут принять приглашение.
Покупать можно только активированный продукт. После создания продукта в Play Console есть кнопка activate, более детально процесс создания продукта мы описывали в первой статье.
Удостовериться, что тестирование на устройстве проходит с гугл-аккаунта, который является тестировщиком. Очевидный пункт, но бывает всякое, и это тоже нужно проверить, если вы получили такую ошибку.
applicationId сборки, с которой тестируется покупка, должно полностью совпадать с applicationId из Play Console. Это особенно важно для тех, у кого добавляется суффикс в дебажных сборках.
Добавить email-адреса тестировщиков в раздел Setup → License Testing в левом меню аккаунта (не приложения), чтобы они покупали продукты бесплатно с тестовой карты, а не с реальной. Еще один плюс, что подписки в данном случае будут иметь тестовую длительность. Не связано с этой ошибкой, но тоже полезное знание.
Заключение
Ошибки способны сильно усложнить работу, поэтому всегда важно понимать, как они могут возникнуть. Учитывая, сколько шагов нужно пройти, чтобы получить доступ к продуктам, проще всего словить ITEM_UNAVAILABLE. Поэтому я надеюсь, что мой чек-лист вам поможет.
Про Adapty
Для более простой работы с ошибками советую попробовать Adapty SDK для внедрения внутренних покупок в приложения. Кроме технической части, Adapty даёт много преимуществ:
Встроенная аналитика позволяет быстро понять основные метрики приложения.
Когортный анализ отвечает на вопрос, как быстро сходится экономика.
А/Б тесты увеличивают выручку приложения.
Интеграции с внешними системами позволяют отправлять транзакции в сервисы атрибуции и продуктовой аналитики.
Промо-кампании уменьшают отток аудитории.
Open source SDK позволяет интегрировать подписки в приложение за несколько часов.
Серверная валидация и API для работы с другими платформами.
Познакомьтесь подробнее с этими возможностями, чтобы быстрее внедрить подписки в своё приложение и улучшить конверсии.
Samsung In-App Purchase (IAP) is a payment service that makes it possible to sell a variety of items in applications for Samsung Galaxy Store and internally manages communication with supporting IAP services in the Samsung ecosystem, such as Samsung Account, Samsung Checkout, and Samsung Rewards.
In-App Purchase can be used either to make a one-off payment or to pay for a regular subscription. Items that can be sold through In-App Purchase include premium content, virtual goods such as in-game items, and specific services with different length license terms.
IAP offers an SDK and Server APIs:
- IAP Helper class and Helper APIs enable you to easily integrate IAP functionality into your app, such as configuring IAP, getting item details, offering and selling items, and managing purchased items.
- IAP Server APIs enable you to communicate with IAP server to verify item purchases, create a service token, and check subscription status.
Payment methods, including credit card, phone bill, and PayPal, are available for Samsung In-App Purchase in more than 120 countries. To apply Samsung In-App Purchase to your applications successfully, make sure you read the following documents thoroughly.
Four basic steps to selling in-app items
Download the Samsung In-App Purchase SDK and integrate it into your application.
- SDK Download
Request commercial status through the Samsung Galaxy Store Seller Portal.
Before you can charge for your application or in-app item, you need to request commercial seller status and register your payment information.
Upload your binary file to Samsung Galaxy Store Seller Portal.
You can add in-app items only after you register a binary to which Samsung In-App Purchase is applied.
Add in-app items and register item-related information:
Item ID, Item Title, Item Type, Price, and so on.
Expanded Availability for Galaxy Watch
Samsung In-App Purchase supports Android devices and Tizen-based Galaxy Watch devices.
To sell items in applications exclusive to the Galaxy Watch, you must have a thorough understanding of the Tizen SDK. The In-App Purchase feature can be implemented by using the Extension SDK.
Check out the opportunities for generating revenue through the Galaxy Watch by clicking the following link.
IAP v6.0 is supported since Android API 18 or higher. It does not work properly in lower versions.
Samsung IAP Unity Plugin
Access Samsung IAP from the Unity development platform. The Samsung IAP Unity plugin (sometimes called the Samsung Unity IAP plugin) contains all Samsung IAP related scripts and libraries. See Unity IAP Plugin for more information.
Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.
- Samsung Community
- :
- Get Help
- :
- Phones
- :
- Galaxy S Phones
- :
- Samsung In-app purchase error
Original topic:
Samsung In-app purchase error
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
Trying to purchase credits for game my daughter plays and keep getting a Samsung checkout error that the purchase can't be completed. We have restarted the phone, uninstalled then reinstalled the game, reset the phone and tried on a different samsung phone but still get the same error. We reached out to the app developer and was told the the issue is with the samsung payment system and reached out to Samsung support but have not gotten any resolution.
1 Solution
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
Try uninstalling the game and installing it through the Google Play Store. This should allow you to make the purchase the Play Store rather than the Galaxy Store.
Be sure to click " ✓ Accept as Solution" when you find an answer that works for you.
Please note, notification emails are a DO NOT REPLY address, you must log-in on the community page in order to respond.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
Try uninstalling the game and installing it through the Google Play Store. This should allow you to make the purchase the Play Store rather than the Galaxy Store.
Be sure to click " ✓ Accept as Solution" when you find an answer that works for you.
Please note, notification emails are a DO NOT REPLY address, you must log-in on the community page in order to respond.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
09-22-2020 08:07 PM in
I have the same error in Free Fire and Fortnite, so far only hapoen in app purchase, Samsung Support dont give any Fix to this, I was buying using samsung but after too many times I start getting this error message, it seems the samsung account is restricted to purchase for security purposes but the support dont eant to help to fix this
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
09-23-2020 04:40 AM in
I don't think I'd call that a solution. It's a workaround. The problem for many people who are having this issue is that we have Samsung points that we'd like to use (I personally have about $90 worth), and this glitch makes them useless.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
10-20-2020 09:10 PM in
Did you find the solution bro .
@userGrmcm0t9vE wrote:Trying to purchase credits for game my daughter plays and keep getting a Samsung checkout error that the purchase can't be completed. We have restarted the phone, uninstalled then reinstalled the game, reset the phone and tried on a different samsung phone but still get the same error. We reached out to the app developer and was told the the issue is with the samsung payment system and reached out to Samsung support but have not gotten any resolution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
10-21-2020 04:13 AM in
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
12-04-2020 03:15 AM in
Just started having this issue any solution
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
02-26-2021 02:12 PM in
i am having the same issue. and not getting an answer
Has anyone figured this out?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Email to a Friend
02-26-2021 02:32 PM in
An Accepted Solution has been marked and provided for this thread. The thread will now be locked for further replies. in hopes to keep the integrity of the thread from steering in a non-technical manner. If you have a separate concern, feel free to post again or send one of our moderators a private message with more details. Please note duplicate posts on similar subjects starting 2/1/21, will be removed to keep our community organized and make it easier for our users to find resolutions and needed content. Remember that if you do make a post, please include as many details about your symptoms as possible. Also, make sure that your title is a good summary of the overall situation that's occurring with your product. Thank you for being part of the community!
With some apps, you can buy additional content or services within the app. We call these "in-app purchases." Examples include a powerful sword in a game, a key that unlocks more features of an app, or virtual currency used for purchases.
If your in-app purchase doesn’t show up, doesn’t work or won’t download, you can:
- Troubleshoot the issue on your own.
- Contact the developer for support.
- Request a refund.
If you're trying to make an in-app purchase but the transaction is declined or the payment won't go through, try to fix payment issues on Google Play.
Troubleshoot the issue on your own
If these steps don't fix your issue, contact the developer. It's the developers' responsibility to offer support for their apps and to make sure they work well for you.
Check your connectivity
Check that you have a WiFi or mobile data connection which is active and working. A simple way to do this is by searching the web. Click on this link to search Google for puppies. If you see information on puppies, your internet connection is probably not the issue.
If that search doesn’t work, connectivity might be a problem. Try to fix your connectivity issues.
Force stop, then reopen the app or game
If you haven't received an in-app item you bought, try closing and restarting the app or game you’re using.
- On your device, open the main Settings app .
- Tap Apps or Manage applications (depending on your device, this may be different).
- Tap the app you used to make your in-app purchase.
- Tap Force stop.
- Re-open the app you used to make your in-app purchase.
- Check if your item has been delivered.
Check if your payment is complete
You receive your in-app purchase when your transaction is complete. You can check if the payment went through in the Play Store app or on the Google Play web page.
Check payment with the Play Store app
- Open the Google Play Store app .
- At the top right, tap your Profile picture.
- Tap Payments & subscriptionsBudget & history.
Check payment with a web browser
- On your computer, go to your Google Play account.
- At the top, click Order History.
- Find your in-app purchase.
Restart the device
Sometimes restarting the device can help fix in-app purchase issues. To restart:
- On your mobile device, hold down the power button.
- Tap Power off or Restart (depending on your device this text may be different).
- If needed, hold down the power button again to turn the device back on.
- Wait for the device to start back up.
- Re-open the app or game and check if the in-app purchase has been delivered.
Update the Play Store app
In-app purchases work best when you run the latest version of the Play Store. To update the app:
- On your Android phone or tablet, open the Google Play Store app .
- At the top right, tap the Profile picture.
- Tap Settings AboutPlay Store version.
- The app updates or notifies you that your version is up to date.
Make sure date and time are correct
If you have recently changed the date and time on your device, make sure the date and time are correct:
- On your Android phone or tablet, open your device's Settings app .
- Tap Date & time.
- Look for "Automatic date & time" and "Automatic time zone" and check if they’re switched on or off. Then follow the relevant steps below.
If "Automatic date & time" and "Automatic time zone" are turned off
- Turn on both the date & time and time zone settings.
- Wait a few minutes, and check to see if your problem is fixed.
- If it’s not, try restarting your device and check again.
If "Automatic date & time" and "Automatic time zone" are switched on
- If both of these settings are on, the date and time probably isn’t your issue. Check your connectivity and restart your device, or try the other troubleshooting steps.
Contact the app's developer for support
If you're still having issues with an in-app purchase and want to give feedback or get help, you can contact the app's developer.
The app developer is the best place to:
- Get help to fix an issue with an app or game.
- Learn more about using an app.
- Get an in-app purchase added to your account.
- Ask about an in-app purchase that wasn’t delivered.
- Get help with username and password sign in problems for specific apps.
Request a refund
Depending on the details of your purchase and issue, you may be able to get a refund. Find more information on returns and refunds on Google Play.
Привет, я Влад, core разработчик Android SDK в Adapty. Это заключительная статья из серии туториалов по внедрению внутренних покупок в мобильные приложения:
iOS in-app purchases:
Android in-app purchases:
Написано совместно с:
Андреем Кяшкиным,
Работа с продуктами на сервере
Для получения данных о продуктах на iOS/Android с помощью StoreKit/Billing Library нам нужно передавать id продуктов, информацию о которых мы хотим запросить — то есть, нет способа получить все доступные продукты, не зная о них вообще ничего. Бэкенд дает нам замечательное преимущество — не зашивать id продуктов на клиенте и тем самым иметь возможность манипулировать списком актуальных продуктов без обновления приложения.
Таким образом, мы можем отдавать на клиент общую модель продукта:
product_id — это id продукта в сторе. Может возникнуть вопрос, почему таких полей, как описание продукта или цена, в этой модели нет. Тут важно понимать, что создание продуктов в соответствующих консолях никто не отменял, просто часть клиентской логики мы переносим на бэк, а другую ее часть мы перенести не можем. Помимо самого совершения покупки, которое без участия сторов невозможно (пока ещё), информацию о продукте по id тоже нужно получать от стора напрямую, потому что Apple и Google отдают локализованные значения в зависимости от того, к какой стране привязан данный аккаунт.
introductory_offer_eligibility , promotional_offer_eligibility и promotional_offer_id — это поля, которые несут в себе информацию о скидочных предложениях, доступных конкретному пользователю. В отличие от предыдущего пункта, эти штуки мы как раз вынесли на бэк, потому что — внезапно — ни AppStore, ни Play Market напрямую не дают информацию, доступно ли intro или promo для конкретного пользователя. Соответственно, у самого продукта может быть intro, но данному пользователю оно недоступно, потому что он его уже использовал. И чтобы отобразить это в UI, вычислять это нужно самостоятельно, лучше на бэке.
И теперь флоу получения продуктов на клиенте будет выглядеть так:
Получаем историю транзакций от стора на девайсе.
Отправляем данные о транзакциях на сервер. В этом месте бэк вычисляет, доступны ли данному пользователю скидочные предложения.
Запрашиваем у бэка продукты.
По id продуктов запрашиваем у стора всю остальную информацию.
Отображаем в UI.
Предоставление кросс-доступа пользователю
Как только вы вынесли продукты на сервер и сделали само понятие «продукт» универсальным, стоит задуматься о том, как сделать то же самое для понятия «статус покупки». Идея в том, что если у вас больше одной платформы, то покупка на одном устройстве должна разблокировать доступ к контенту на любом устройстве вне зависимости от ОС, но в пределах аккаунта, с которого она была совершена. Если у вас больше одного продукта, то сделать это не так просто, т.к. вам на устройстве необходимо понимать, что именно купил пользователь, и давать ему доступ к той или иной части вашего приложения.
Так выглядит проверка на наличие уровня доступа:
Таким образом, мы абстрагируемся от понятия «покупка» и «платформа», в сторону одного общего абстрактного понятия «доступ». Единственный недостаток этого подхода — что уровни доступа вам придется указывать напрямую в коде, но обычно их не очень много (один или два) и они весьма статичны, так что их поддержка не должна вызывать сложностей. Также не забывайте получать актуальный уровень доступа где-то на запуске приложения, чтобы обрабатывать случай, когда покупка была сделана на другом устройстве / платформе.
В большинстве случаев приложение ограничивается одним уровнем доступа «купленный», т.е. пользователь или что-то купил, или ничего не купил. В этом случае достаточно будет обойтись одним уровнем доступа, но благодаря ему обработка кроссплатформенных покупок не доставит вам проблем в будущем.
Синхронизация истории покупок и восстановление покупок
просто запросив рецепт (receipt) — актуально, если в пределах установки уже были совершены какие-то покупки;
запустив процесс восстановления покупок (restore purchases).
А вот на iOS 15+ появилась возможность получать все entitlements пользователя в любой момент.
О получении рецептов мы уже писали в предыдущих статьях, поговорим чуть больше про восстановление. Восстановление не стоит запускать сразу же на старте, т.к. оно вызывает показ окна для пользователя, где требуется ввести логин и пароль от аккаунта. Подобный интерфейс на старте без каких-либо предшествующих действий со стороны пользователя может отпугнуть и создать ощущение мошенничества.
Как только пользователь сам инициировал процесс восстановления покупок, то тут уже можно спокойно обращаться к системному фреймворку работы с покупками. После успешного восстановления необходимо пересинхронизировать все покупки пользователя на сервер, что позволит определить текущее состояние его подписки; понять, доступны ли ему скидки; возможно составить какую-то аналитику для этого аккаунта.
В iOS 15+ появился listener, который в две строки можно запустить на старте приложения. Этот listener получает все текущие покупки, которые есть у пользователя, в виде массива и на старте обновляет их данные – статус и проч. В целом, при первом запуске приложения рестор покупок больше не нужен, т.к. в реал-тайме можно получить обновления по всем покупкам пользователя между разными девайсами.
Обработка покупок, когда сервер не отвечает
К сожалению, такое бывает. Если сервер лежит и покупка в это время невозможна, вы теряете не только подписчиков, но и деньги, как в настоящем, так и будущие автосписания, которые были бы возможны, если бы покупка состоялась.
При этом с ошибками от сторов на iOS или Android, как правило, сложно что-то сделать, кроме как показать ошибку в UI, а вот в случае недоступности нашего бэка мы можем чуть лучше сгладить углы.
Например, мы можем локально кэшировать продукты после их получения с бэка. Таким образом, если при запросе на продукты код ответа 500 и после нескольких повторных запросов ничего не поменялось, мы просто берем продукты из кэша и идем с ними в стор.
Тогда встаёт вопрос, что делать, если сервер лежал при первом запуске приложения, и в кэше пока ничего нет. Можно, конечно, показать ошибку, а можно «зашить» данные о продуктах прямо в сборку, чтобы в том кейсе, когда сервер упал, а пользователь открыл приложение впервые, мы бы могли ему сразу же на онбординге предложить совершить покупку.
Второе критичное место, где нам очень нужен бэк – это валидация покупки. Чтобы не расстраивать пользователя, можно сразу дать ему доступ, но при этом пытаться провалидировать покупку при любом удобном случае, например, при следующем запуске приложения или при возвращении приложения в foreground. Решение дать пользователю доступ к контенту без всех проверок может показаться поспешным, но если у вас преимущественно онлайн-контент, нечестным пользователям будет сложно пользоваться приложением без интернета, и рано или поздно неправомерный доступ будет отозван.
Заключение
В этой статье мы затронули более сложные механики работы с продуктами и покупками. Как правило, о них задумываются сразу после того, как сделали базовую интеграцию и основные механики уже работают: показ экрана оплаты, отображение актуальной информации о продуктах, покупка, обработка самых популярных ошибок.
Как видите, процесс подключения покупок довольно трудоёмкий и требует учёта очень разных сценариев. Упростить задачу можно с помощью сторонних сервисов. Например, в Adapty все продвинутые кейсы и, тем более, базовое подключение покупок с серверной валидацией уже готовы. Для работы нужно создать аккаунт и подключить Adapty SDK. Так вы сэкономите пару месяцев разработки и начнёте быстрее монетизироваться. Для роста продаж в Adapty есть продвинутая аналитика, когортный анализ, а/б тесты пейволлов и интеграции с сервисами аналитики и атрибуции.
Читайте также: