- Где найти и как отключить платные подписки на сервисы?
- Кирилл Сергеев
- Подписки в приложениях из App Store и Google Play
- Прямые подписки на приложения или сервисы
- Платные сервисы внутри системы (экосистемы)
- Отключение подписок через поддержку
- Отключение подписок через банк
- Заключение
- In-app Billing Subscriptions со стороны сервера
- Android in-app purchases, часть 1: конфигурация и добавление в проект
- Создание подписки/покупки
- Сравнение процесса покупки с App Store Connect
- Получение списка продуктов в приложении
- Про Adapty
Где найти и как отключить платные подписки на сервисы?
Кирилл Сергеев
Модель работы сервисов и приложений по подписке – штука для широкой аудитории относительно новая, и ко мне часто обращаются знакомые с просьбой показать, как отключить списания за ту или иную подписку. Иногда даже становится неприятно от подобных способов монетизации: человек скачал условный фоторедактор, согласился на бесплатный триальный период, но то ли по невнимательности, то ли из-за расплывчатых формулировок, а может, и по небольшой глупости не понял принципа работы, думая, что приложение еще дополнительно поинтересуется, снимать деньги или нет. Вспоминает этот человек о подписке в тот момент, когда ему приходит SMS от банка о списании нескольких сотен рублей. “Ладно, – чаще всего думает он, – наверное, я сам дурак и что-то неправильно понял, пойду поищу, где эти списания отключить”. И хорошо, если находит, ведь процесс отключения подписки может быть не так очевиден, как кажется на первый взгляд.
Идею для написания этого материала мне подали сразу два события. Во-первых, я решил навести порядок в своих подписках, так как понял, что как-то много я на них трачусь. Во-вторых, в сети появилась новость о том, что одна из крупнейших платежных систем MasterCard планирует изменить подход к безакцептным списаниям со своих карт. Компания отметила, что идет на такой шаг из-за участившихся жалоб клиентов на автоматические списания. Теперь продавцов обяжут получать дополнительное согласие от клиентов, а также давать подробные инструкции, как отменить подписку перед окончанием бесплатного периода. Более того, продавец, даже получив ваше согласие один раз, будет обязан после каждого списания вместе с квитанцией присылать инструкции по отключению на случай, если подписчик этого захочет. Пока непонятно, как это будет работать, но за такое стремление MasterCard можно только похвалить.
А пока ни MasterCard, ни его коллеги по рынку новшество не внедрили, давайте рассмотрим на конкретных примерах, где и как найти платные подписки, чтобы их отключить. Отмечу, что все сервисы перечислить физически довольно тяжело, поэтому я постараюсь рассмотреть принципы такого поиска, а вы уже по аналогии сможете разобраться если не со всеми, то с 99% сервисов. Приступим!
Подписки в приложениях из App Store и Google Play
Среди моих знакомых наиболее часто встречаются жалобы именно на подписки внутри приложений, как раз связанные с бесплатным пробным периодом. Искать их необходимо в соответствующем магазине приложений: для Android-аппаратов это Google Play, для iOS-устройств – App Store.
Самый очевидный путь как раз на Android:
Google Play – Боковое меню – Мои подписки
Здесь мы можем как отменить подписку, так и изменить способ оплаты, если это требуется.
На iOS путь немного сложнее, но тоже в целом на поверхности (сужу по тому, что знакомые с iOS обращаются чаще, чем с Android):
App Store – Ваша аватарка в правом верхнем углу – Управлять подписками
Помимо отмены подписки, здесь можно изменить ее тип, например, сменить семейную подписку на индивидуальную, годовую или студенческую.
Важно отметить, что таким способом мы можем отменять или редактировать только те подписки, которые были активированы с помощью In-App инструментов App Store или Google Play, а не собственных инструментов разработчика.
Прямые подписки на приложения или сервисы
Если вы совершили подписку не через In-App инструменты, а, например, на сайте того или иного сервиса или приложения, то и искать ее стоит там же – на официальном сайте в личном кабинете или в настройках официального приложения.
Возьмем, к примеру, подписку YouTube Premium: отмена или смена параметров подписки осуществляется в настройках аккаунта.
Аналогично можно поступить и с подпиской Яндекс Плюс (включающей Яндекс Музыку), хотя кнопку управления подпиской здесь пришлось поискать.
Платные сервисы внутри системы (экосистемы)
Есть еще один вид подписок – дополнительные функции операционной системы или оболочки (экосистемы), например, дополнительное место в iCloud, Samsung Cloud и т.п. Управление ими осуществляется в соответствующем меню настроек, как правило, в настройках фирменного аккаунта, под которым работает ваш смартфон. Под рукой у меня в данный момент только iPhone и Meizu, в оболочке которого нет никаких платных функций, поэтому рассмотрим только пример с iOS.
В iOS вне приложений и сторонних сервисов за деньги предлагается только дополнительное место в iCloud, управление которым осуществляется по пути:
Настройки – Аккаунт (первая строчка настроек с вашими данными) – iCloud – Управление хранилищем – Сменить план хранилища.
Здесь мы можем изменить объем своего облачного хранилища или вовсе отказаться от платного места, оставив бесплатные 5 ГБ.
Отключение подписок через поддержку
Выше мы с вами рассмотрели примеры, где можно отменить подписку самостоятельно, пусть и немного поискав заветную кнопку. Но есть и такие сервисы, где разработчики эту возможность не предусмотрели. Ярчайший пример – компания Adobe. Подписаться на её Creative Cloud – раз плюнуть, а вот найти потом кнопку отмены подписки нельзя – ее просто нет. Как ни крути, придется обращаться в техническую поддержку. Если не верите, можете убедиться по ссылке.
Продуктами Adobe я не пользуюсь, но с отменой подписки через техподдержку мне все же пришлось столкнуться, и это был Amazon. Желая заказать оттуда несколько гаджетов на адрес посредника, я решил немного схитрить и оформить триальный период подписки Amazon Prime, который позволил бы доставить мои покупки на склад в течение двух дней. Стоимость годовой подписки (тогда это был единственный вариант) – $99, триальный период – 1 месяц. Итак, я оформил Amazon Prime, заказал гаджеты и после того, как они поступили на склад посредника, зашел в свой Amazon-аккаунт и, как я думал, отказался от Amazon Prime. Каково же было мое удивление, когда спустя 30 дней $99 все равно списались с карты. К счастью, техподдержка без всяких проблем и вопросов отменила транзакцию, вернув средства, но так как покупка осуществлялась с рублевой карты, небольшую сумму на конвертации я все-таки потерял.
В общем, если кнопки отмены подписки найти не удается, то ищите, как обратиться в техподдержку, там вам наверняка помогут.
Отключение подписок через банк
Этот пункт пригодится на тот случай, если подписку не удается отключить ни самостоятельно, ни с помощью технической поддержки, либо когда вы не можете вспомнить, “откуда ноги растут”, и понять, откуда идут те или иные списания.
Единственный способ решить этот вопрос через банк – заблокировать и перевыпустить вашу пластиковую карту. В этом случае старые реквизиты будут заблокированы, и ни один сервис больше не сможет делать безакцептные списания с вашего счета. Кардинально, да, но зато эффективно.
Заключение
Не все сервисы одинаково полезны, равно как и не все сервисы абсолютно бесхитростны к вашему кошельку. Будьте внимательны, читайте все, что написано, и не позволяйте недобросовестным или просто хитрым разработчикам лезть к вам карман. А ликбез для этого я вам провел.
Источник
In-app Billing Subscriptions со стороны сервера
In-app Billing Subscriptions (подписки) позволяют автоматизировать списание средств со счета пользователя для приложений, разработанных под Android. Данный инструмент — большой помощник в задаче повышения монетизации приложений. В общем виде схема работы с подписками выглядит следующим образом:
- Пользователь покупает подписку на некоторые плюшки приложения
- В случае успешной покупки, приложение получает данные заказа пользователя, в частности идентификатор транзакции и токен продажи подписки, и передает их на сервер
- Сервер осуществляет проверку подписи заказа в Google Play, контролирует уникальность транзакции, определяет время завершения подписки и начисляет положенные блага
- По завершении подписки, сервер может определить факт продления и, в случае успеха, продолжить начисление благ
В статье представлены шаги по обеспечению серверной поддержки инструмента монетизации для In-App Billing version 2.
Для получения данных по подпискам со стороны сервера, Google предлагает использовать Google Play Android Developer API. API предоставляет всего два метода:
- Получение данных по подписке
- Отмена подписки. Ну как отмена… на самом деле отмена автоматической пролонгации подписки. Ибо по-справедливости весь период действия подписки оплачен наперед
Если попробовать получить данные по некоторой подписке myapp.month.test приложения com.myapp (кстати, все совпадения представленных ниже токенов, продуктов, идентификаторов и ключей случайны. Для повторения примеров прошу использовать данные своего аккаунта), результат будет следующим:
Для успешного вызова методов работы с подписками необходим токен доступа к API. Последний можно получить, выполнив авторизацию по протоколу OAuth2 с использованием секретных данных консоли. Идентифицироваться при авторизации можно различными способами. Важно, что для получения токена доступа к методам взаимодействия с подписками, нужно представиться веб-приложением, используя данные раздела Client ID for web applications:
Авторизация веб-приложением осуществляется в следующей последовательности
- Открыть в браузере ссылку accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher
&response_type=code&access_type=offline
&redirect_uri=http://example.com/oauth2callback
&client_id=someclientid.apps.googleusercontent.com
Здесь кроме прочего, обратите внимание на access type offline, польза которого станет очевидна позже - Осуществить логин
- Разрешить аккаунту доступ к запрошенным ресурсам на экране, подобном представленому
В результате Google предоставляет новый токен доступа, но без токена обновления. Все полученные таким образом токены являются валидными для выполнения запросов, но обновить их будет невозможно. Чтобы как можно реже выполнять процедуру, описанную выше, и хоть как-то автоматизировать процесс проверки подписок рекомендую предпринять следующие действия:
- Сохранить токен доступа в какое-нибудь хранилище
- Сохранить в максимально надежном месте токен обновления токена доступа. Кстати, он-то нам и доступен балгодаря access type offline. Если время действия кода обратной ссылки ограничено, про ограничение токена обновления данных нет. На моей практике сам по себе, он пока не завершился ни разу
- При устаревании токена доступа, о чем можно узнать по уже знакомому ответу с характерным кодом HTTP 401 на вызовы методов подписок, необходимо отправить запрос обновления токена доступа следующего содержания
Обеспечив себе получение свежих токенов при необходимости, можно смело проверять-отменять приобретенные платящими пользвоателями подписки. Пример получения данных о подписке:
Описание полей можно посомтреть в документации к запросу
Следует отметить расхождение значений initiationTimestampMsec и validUntilTimestampMsec:
- initiationTimestampMsec = 1357909784.285 секунды = 2013-01-11 17:09:44
- validUntilTimestampMsec = 1360588184.285 секунды = 2013-02-11 23:09:44
Полагаю, Google резервирует дополнительно 6 часов на списание средств со счета клиента. В случае возникновения проблем при списании, периодически пытается повторить. В конкретно этом случае по данным паблишмента деньги были списаны у клиента
в 2013-02-11 17:10. Кстати, подписки Facebook пытаются списать средства вплоть до 4 суток после завершения платежного периода. А вот iTunes начинает списывать деньги за сутки до окончания платежного периода так, чтобы к моменту завершения подписки было точно известно, продлена она или нет.
Если с данными запроса что-то не так, Google отвечает 400-м кодом HTTP. В некоторых случаях при некорректном запроса возникает HTTP 404.
Пример отмены подписки:
Обратите внимание на код ответа HTTP 204, а пустое тело ответа свидетельсвут об успешной отмене подписки. Если повторить запрос получения данных по подписке, можно в этом убедиться
Обратите внимание, дата окончания подписки не изменилась, но автопролонгация оказалась выключенной.
Для интеграции подписок в приложение, предлагаю следующую архитектуру системы серверной поддержки:
- buy — покупка подписки на стороне клиента
- verify — верификация данных подписки на стороне сервера, определение момента завершения подписки
- queue — очередь верифицированных подписок
- periodical verification — периодическая проверка подписок. Если подписка была продлена, ее можно записать обратно в очередь. Период проверки подписок надо выбирать таким образом, чтобы укладываться в лимит запросов к API. Для нашего приложения он составляет 15K/сутки
- access token refreshing — блок обновления токена доступа, если он устарел
Если кто-нибудь соберется реализовывать подписки, предлагаю две библиотеки:
Источник
Android in-app purchases, часть 1: конфигурация и добавление в проект
Всем привет, меня зовут Влад и я разработчик Android SDK для обработки платежей в мобильных приложениях в Adapty.
Внутренние покупки и в частности подписки являются наиболее популярным способом монетизировать приложение. С одной стороны, подписка дает разработчику возможность постоянно развивать контент и продукт, с другой стороны, благодаря им пользователь получает более высокое качество приложения в целом. Внутренние покупки облагаются 30% комиссией, но если пользователь подписан больше года или приложение зарабатывает меньше $1М в год, то комиссия составляет 15%.
Это первая статья из серии, посвящённой работе с внутренними покупками на Android. В этой серии мы охватываем темы от создания in-app purchases до серверной верификации платежей:
Android in-app purchases часть 1: конфигурация и добавление в проект. — Вы тут
В этой статье мы разберём, как:
создавать продукты в Google Play Console;
конфигурировать подписки: указывать длительность, стоимость, пробные периоды;
получать список продуктов в приложении.
Создание подписки/покупки
Перед тем, как мы начнем, убедитесь, что
Вы подписали все соглашения и готовы работать.
Перейдем к делу, а именно создадим наш первый продукт.
Переходим в наш аккаунт разработчика и выбираем нужное приложение.
Дальше в левом меню ищем секцию Продукты, выбираем Подписки и жмем на Создать Подписку.
Дальше попадаем в конфигуратор подписки, разберем важные вещи.
Создаем ID, который потом используем в приложении. Хорошо, когда в ID мы кодируем период подписки и какую-то еще полезную информацию. Это позволяет создавать продукты в одном стиле, чтобы в будущем было проще анализировать статистику по покупкам.
Название подписки, как пользователь ее увидит в магазине.
Описание подписки, пользователь тоже это увидит.
Скроллим ниже и выбираем период подписки, в нашем случае это неделя, и конфигурируем стоимость.
Обычно вы задаете цену в базовой валюте аккаунта, а система автоматически переводит цены в разные валюты разных стран. Но вы также можете поправить цену в конкретной стране вручную.
Обратите внимание, что Google сразу указывает налог в каждой стране, это очень круто, а в App Store Connect такого нет.
Скроллим ниже и опционально выбираем:
Бесплатный пробный период.
Начальная цена. Промо-предложение на первые периоды оплаты.
«Льготный период». То есть, если у пользователя проблема с оплатой, сколько дней вы продолжаете давать ему премиум доступ.
Возможность подписаться заново из Play Market, а не из приложения, после отмены подписки.
Сравнение процесса покупки с App Store Connect
Несмотря на то, что подписки значительно лучше монетизируются на iOS, админка Play Console выглядит намного удобнее. Она работает быстрее, лучше и проще структурирована, качественно локализована.
Сам процесс создания продукта предельно упрощен. Здесь мы описали, как создавать продукты на iOS.
Получение списка продуктов в приложении
После создания продуктов перейдем к созданию архитектуры в приложении для приема и обработки покупок. В целом процесс следующий:
Подключаем платежную библиотеку.
Разрабатываем структуру класса для взаимодействия с продуктами из Google Play.
Реализуем все методы обработки покупки.
Подключаем серверную верификацию покупки.
В этой части разберем первые два пункта.
Подключим Billing Library к проекту:
На момент написания статьи актуальной версией является 4.0.0. Вы можете в любой момент заменить ее на другую версию.
Создадим класс-обертку, который будет инкапсулировать логику взаимодействия с Google Play, и проинициализируем в нем BillingClient из библиотеки Billing Library. Назовем такой класс BillingClientWrapper.
Наш класс будет реализовывать интерфейс PurchasesUpdatedListener. Мы сразу переопределим его метод onPurchasesUpdated(billingResult: BillingResult, purchaseList: MutableList
?) , который вызывается после совершения покупки, но саму реализацию опишем уже в следующей статье.
Google рекомендует, чтобы одновременно было не больше одного активного соединения BillingClient’а с Google Play, чтобы колбэк о совершенной покупке не вызывался несколько раз. Для этого целесообразно иметь единственный экземпляр BillingClient в классе-синглтоне. Класс в примере выше сам по себе синглтоном не является, но мы можем провайдить его с помощью dependency injection (например, используя Dagger или Koin) таким образом, чтобы в один момент времени существовало не больше одного экземпляра.
Для совершения любого запроса с помощью Billing Library нужно, чтобы у BillingClient’а в момент запроса было активное соединение с Google Play, но в какой-то момент оно может быть утеряно. Для удобства напишем обертку, чтобы любой запрос выполнялся только при активном соединении.
Чтобы получить продукты, нам нужно знать их идентификаторы, которые мы задавали в маркете. Но для запроса этого недостаточно, нужно указать еще и тип продуктов (подписки или разовые покупки), поэтому общий список продуктов мы можем получить только путем «склеивания» результатов двух запросов.
Так как запрос на продукты асинхронный, нам нужен колбэк, в котором мы получим либо список продуктов, либо ошибку. Billing Library при ошибке возвращает один из определенных в ней BillingResponseCode, а также debugMessage. Создадим интерфейс колбэка и модель для ошибки:
Напишем приватный метод для получения данных о продуктах конкретного типа, а также публичный метод, который «склеит» результаты от двух запросов и вернет итоговый список продуктов или ошибку.
Таким образом мы получили информацию о продуктах (SkuDetails), где есть локализованные названия, цены, тип продукта, а для подписок еще и период платежа, а также информация о начальной цене и пробном периоде (если доступно данному пользователю). Финальный класс выглядит так:
На этом все, в следующих статьях мы расскажем о реализации покупок, тестировании и обработке ошибок.
Про Adapty
Как видите, в процессе добавления покупок в приложения на Android много нюансов. Если использовать готовые библиотеки, всё будет проще. Советую познакомиться с Adapty — SDK для in-app покупок. Он не только упрощает работу по добавлению покупок:
Встроенная аналитика позволяет быстро понять основные метрики приложения.
Когортный анализ отвечает на вопрос, как быстро сходится экономика.
А/Б тесты увеличивают выручку приложения.
Интеграции с внешними системами позволяют отправлять транзакции в сервисы атрибуции и продуктовой аналитики.
Промо-кампании уменьшают отток аудитории.
Open source SDK позволяет интегрировать подписки в приложение за несколько часов.
Серверная валидация и API для работы с другими платформами.
Познакомьтесь подробнее с этими возможностями, чтобы быстрее внедрить подписки в своё приложение и улучшить конверсии.
Источник