Pull to refresh

Библиотека для работы с API Яндекс.Денег и демонстрационное Android-приложение

Reading time 3 min
Views 3.4K
Добрый день, хабросообщество.

Хочу поделиться своей разработкой — Android-библиотекой для работы с API Яндекс.Денег.

Не далее чем 15 апреля Яндекс открыл API для работы с Я.Деньгами. Как и все ранее открытые API по работе с сервисами Яндекса, он основывается на авторизации через OAuth. В текущей реализации API позволяет запрашивать информацию об аккаунте, запрашивать список операций по счету и совершать платежи по шаблонам. Подробно — в документации, вопросы можно задать в клубе разработчиков.

В результате была запилена библиотека и демо-приложение для Android, работающее с кошельком через API.

Собственно основой библиотеки относительно Android-приложения является класс OAuthActivity, от которого следует наследовать вашу Activity, которая будет выполнять первичную OAuth-авторизацию приложения. Результат авторизации приложения — токен доступа, с помощью которого инициализируется класс YandexMoneyService который, используя данный токен может выполнять следующие действия (пока)
  • getAccountInfo: Запрашивать информацию об аккаунте — метод API account-info
  • getOperationHistory: Запрашивает историю операций — метод API operation-history

При вызове без аргументов второй метод возвращает все операции (как зачисления так и списания). Пейджинг пока не поддерживается. В качестве аргумента возможно передать объект класса YandexMoneyOperationTypes для указания конкретно операции.

Также в состае блиблиотеки присутствует хранилище токенов. Чтобы каждый раз не запрашивать авторизацию токен можно сохранить. Для этого используются наследники класса AccessTokenStorage а именно SharedPreferencesStorage и EncryptedSharedPreferencesStorage. Вторая реализация отличается тем, что хранит токен в зашифрованном по алгоритму 3DES виде.

Для использования авторизации по протоколу OAuth приложение должно определить класс-наследник OAuthActivity реализовав в нем следующие методы:
  • getRequiredPermissions — метод, возвращающий набор прав, требуемых приложению. Для Яндекс.Денег используем контейнер YandexMoneyPermissions
  • getClientId — идентификатор клиента в системе Яндекс.Деньги. Его выдадут на стадии регистрации приложения
  • getAppId — идентификатор приложения. Используется для составления redirect_uri — адреса, фактически идентифицирует приложение при обработке ответа авторизации, лучше задать его = названию package приложения
  • getServer — сервер, у которого запрашивать авторизацию
  • getTokenStorage — возвращает хранилище токенов, используемое для сохранения полученного токена авторизации

Об успехе или провале авторизации сообщается путем запуска Activity через отправку Action == «ru.elifantiev.yandex.oauth.AUTH_RESULT» (см. OAuthActivity.ACTION_AUTH_RESULT). В Intent помещается признак успеха (.AUTH_RESULT_EXTRA) равный AUTH_RESULT_OK или AUTH_RESULT_ERROR. Ошибка размещается в Extra .EXTRA_AUTH_RESULT_ERROR.

Еще один важный момент. Для успешной обработка возврата из авторизации приложения (а она, по требования Яндекса, выполняется во встроенном браузере ОС) требуется обработка наследником OAuthActivity Intent'ов, описываемых следующим фильтром:

<intent-filter>
   <action android:name="android.intent.action.VIEW"/>
   <category android:name="android.intent.category.DEFAULT"/>
   <category android:name="android.intent.category.BROWSABLE"/>
   <data android:scheme="oauth" android:host="@string/app_id"/>
</intent-filter>

Фактически, это обработка перенаправления браузера на URL oauth://appId (где appId — идентификатор приложения, тот же что в методе getAppId, у меня он сохранен в ресурсах приложения).

О демо приложении…

Состоит из 3 Activity — AppLoginActivity, AuthActivity и MainActivity.

AppLoginActivity при первом старте приложения предлагает пройти процедуру авторизации приложения (запускает AuthActivity которая в свою очередь — наследник OAuthActivity). Ели приложение уже успешно проходило авторизацию — выводится диалог запроса PIN-кода.

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

Результат авторизации приходит обратно в AppLoginActivity где обрабатывается (выводится сообщение об ошибке или сохраняется состояние — авторизация пройдена). В случае успеха запускается MainAcitivty которая запускает вызов сервисов.

Что в итоге… Хочется получить критику относительно реализации, собрать жалобы и предложения и т.п. Желающие попилить это вместе — welcome.

P.S. Автор никакого отношения к Яндексу и Яндекс.Деньгам не имеет.
EDIT с ключем, лежащим в сорцах, приложение не заведется. Зарегистрируйте свое приложение с альтернативным адресом перенаправления и получите свой индентификатор.
Tags:
Hubs:
+29
Comments 2
Comments Comments 2

Articles