{"id":19345413,"url":"https://github.com/robokassa/sdk-android","last_synced_at":"2025-09-09T21:47:55.127Z","repository":{"id":247398138,"uuid":"824475384","full_name":"robokassa/sdk-android","owner":"robokassa","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-20T07:33:24.000Z","size":535,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T19:02:50.826Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/robokassa.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-05T08:03:47.000Z","updated_at":"2024-12-20T07:33:28.000Z","dependencies_parsed_at":"2024-07-08T15:12:36.862Z","dependency_job_id":"5fa298f2-9238-46e3-b449-cd6dab73540b","html_url":"https://github.com/robokassa/sdk-android","commit_stats":null,"previous_names":["robokassa/sdk-android"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robokassa%2Fsdk-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robokassa%2Fsdk-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robokassa%2Fsdk-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robokassa%2Fsdk-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robokassa","download_url":"https://codeload.github.com/robokassa/sdk-android/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250328281,"owners_count":21412592,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T04:06:35.295Z","updated_at":"2025-09-09T21:47:55.119Z","avatar_url":"https://github.com/robokassa.png","language":"Kotlin","readme":"# Robokassa SDK Android\nSDK позволяет интегрировать прием платежей через сервис Robokassa в мобильное приложение Android.\nБиблиотека написана на языке Kotlin.\n\n## Требования к проекту\nДля работы Robokassa SDK необходимо:\n- Android версии 7.0 и выше (API level 24).\n\n**ВНИМАНИЕ! Часть функционала SDK такая как закрытие фрейма после оплаты или возврат в приложение работает только в боевом режиме - поэтому не рекомендуется использовать testMode=true.** \n\n## Подключение SDK\n### Общая информация\nДля работы с SDK вам понадобятся:\n\n- MerchantLogin - идентификатор (логин) магазина\n- Password #1 – пароль для подписи запросов к сервису\n- Password #2 – пароль для подписи запросов к сервису\n\nДанные можно найти в личном кабинете (ЛК) Robokassa.\n\nВ корне репозитория собран проект состоящий из библиотеки (Robokassa_Library) и демо приложения (app) которое показывает пример интеграции SDK:\n\n\u003cimg alt=\"Демо экран\" src=\"https://ipol.ru/webService/robokassa/sc3.png\" width=\"300\"/\u003e\n\u003cimg alt=\"Плат.форма\" src=\"https://ipol.ru/webService/robokassa/sc4.png\" width=\"300\"/\u003e\n\nДля сборки демо-приложения откройте все содержимое репозитория как проект, укажите свои api-ключи в **app/src/main/java/com/robokassa_sample/MainActivity.kt** и запустите его.\n\nДля автоматического возврата в приложение после оплаты через другие банковские (платежные) приложения, в которых есть опция возврата в магазин, необходимо зарегистрировать диплинк в приложении.\n\nЭто действие делается на уровне манифеста приложения вне SDK.\n\n```xml\n\u003cintent-filter android:autoVerify=\"true\"\u003e\n    \u003caction android:name=\"android.intent.action.VIEW\" /\u003e\n    \u003ccategory android:name=\"android.intent.category.DEFAULT\" /\u003e\n    \u003ccategory android:name=\"android.intent.category.BROWSABLE\" /\u003e\n    \u003cdata android:scheme=\"http\" /\u003e\n    \u003cdata android:scheme=\"https\" /\u003e\n    \u003cdata android:host=\"ipol.ru\" /\u003e\n    \u003cdata android:host=\"*.ipol.ru\" /\u003e\n    \u003cdata android:pathPattern=\"webService/*\" /\u003e\n\u003c/intent-filter\u003e\n```\n```xml\n\u003cintent-filter android:autoVerify=\"true\"\u003e\n    \u003caction android:name=\"android.intent.action.VIEW\" /\u003e\n    \u003ccategory android:name=\"android.intent.category.DEFAULT\" /\u003e\n    \u003ccategory android:name=\"android.intent.category.BROWSABLE\" /\u003e\n    \u003cdata android:scheme=\"robokassa\" /\u003e\n    \u003cdata android:host=\"open\" /\u003e\n\u003c/intent-filter\u003e\n```\n\nЧтобы это заработало у вас, вы должны разместить на веб-сервере аналогичные ссылки со следующим содержимым:\n\n```html\n\u003chtml\u003e\n    \u003cbody\u003e\n   \t \u003cscript\u003e\n   \t\t document.location.href=\"intent://scan/#Intent;scheme=robokassa://open;package=com.robokassa_sample;end';';\";\n   \t \u003c/script\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\nи прописать их как как Success Url и Fail Url в ЛК Робокассы.\n\nПри сборке и запуске демо-приложения вы можете прописать наши ссылки в ЛК робокассы:\n\n- https://ipol.ru/webService/robokassa/success.html\n- https://ipol.ru/webService/robokassa/fail.html\n\nчтобы увидеть функционал в действии.\n\nНесколько видео примеров как выглядит работа демо-приложения:\n\n- Пример с оплатой по СБП без автовозврата в приложение: https://disk.yandex.ru/i/-3GlA7WG8WvVEQ\n- Пример с оплатой Сбер Пэй с автовозвратом в приложение: https://disk.yandex.ru/i/c3kxR2fMOFimAA\n- Пример стандартной оплаты картой: https://disk.yandex.ru/i/osoCRRcpG0yn2w\n\nЕсли у вас нет подходящего веб-сервера, мы можем разместить вашу ссылку Success Url и Fail Url у нас на сервере.\n\nТакже для проверки статуса платежа после возврата в приложение необходимо добавить вызов кода проверки статуса:\n\n```kotlin\nprivate fun checkIntent(i : Intent?) {\n    val data = i?.data\n    if (data?.scheme == \"robokassa\") {\n        val prefs = getSharedPreferences(\"robokassa.pay.prefs\", Context.MODE_PRIVATE)\n        val paramStr = prefs.getString(\"pay\", \"\")\n        try {\n            paramStr.toParams()?.let {\n                payProcess.launch(\n                    RobokassaPayLauncher.StartPay(\n                        it,\n                        testMode = testMode,\n                        onlyCheck = true\n                    )\n                )\n            } ?: run {\n                showAnswerMessage(\"Нет сохраненных платежных данных\")\n            }\n        } catch (e: Exception) {\n            showAnswerMessage(\"Нет сохраненных платежных данных\")\n        }\n    }\n}\n```\n\nЛогика работы проверки статуса при возврате в приложение - в момент перехода во внешнее приложение в память (SharedPreferences) внутри SDK сохраняются параметры последнего незавершенного платежа,\nих можно прочитать из памяти по ключу \"pay\". При вызове проверки статуса и успешном ответе от платежного шлюза, информация о незавершенном платеже удаляется из памяти.\n    \n### Подключение зависимостей\nДля подключения библиотеки в ваш проект вы можете:\n\n  - либо скачать и подключить aar файл (из app/lib). Добавьте его в папку lib вашего проекта и подключите зависимость в [build.gradle].\n```groovy\nimplementation (name: 'robokassa-library', ext: 'aar')\n```\n  \n  - либо выгрузите Robokassa_Library в папку проекта и подключите библиотеку как модуль, указав в [settings.gradle] вашего проекта.\n```groovy\ninclude(\":Robokassa_Library\")\n```\n\n\n## Проведение платежей\nБиблиотека использует стандартную платежную форму Robokassa в виде WebView, что упрощает интеграцию и не требует реализации собственных платежных форм и серверных решений.\nПроцесс платежа состоит из 2-х этапов: вызова платежного окна Robokassa с заданными параметрами и затем, если требуется, осуществления дополнительного запроса к сервису Robokassa для необходимого действия - отмены или подтверждения отложенного платежя или проведения повторной оплаты.\n\n### Вызов платежного окна\nЧтобы настроить платежное окно для проведения платежа, требуется:\n\n1. Создать объект [PaymentParams](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/params/PaymentParams.kt), который включает в себя:\n\n   - данные о заказе [OrderParams](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/params/OrderParams.kt)\n   \n   - данные о покупателе [CustomerParams](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/params/CustomerParams.kt)\n   \n   - данные о внешнем виде страницы оплаты [ViewParams](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/params/ViewParams.kt)\n\n```kotlin\n    val paymentParams =\n    PaymentParams().setParams {\n        orderParams {                           // данные заказа\n            invoiceId = 12345                   // номер заказа в системе продавца\n            orderSum = 200.50\t\t\t        // сумма заказа\n            isRecurrent = false                 // флаг определяющий является ли платеж повторяющимся\n            isHold = false                      // флаг определяющий является ли платеж отложенным\n            description = \"Оплата по заказу\"    // описание, показываемое покупателю в платежном окне\n            receipt = Receipt                   // объект фискального чека\n        }\n        customerParams {                        // данные покупателя\n            culture = Culture.RU                // язык интерфейса\n            email = \"john@doe.com\"              // электронная почта покупателя для отправки уведомлений об оплате\n        }\n        viewParams {\n            toolbarText = \"Рекуррентный платеж\" // заголовок окна оплаты\n        }\n    }.also {\n        it.setCredentials(MERCHANT_LOGIN, PASSWORD_1, PASSWORD_2)\n    }\n```\n\n2. Зарегистрировать контракт [RobokassaPayLauncher.Contract](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/pay/RobokassaPayLauncher.kt), и вызвать [ActivityResultLauncher.launch](https://developer.android.com/reference/androidx/activity/result/ActivityResultLauncher#launch(kotlin.Any))\n\n```kotlin\n    val payProcessLauncher = registerForActivityResult(RobokassaPayLauncher.Contract) {\n        when(it) {\n            is RobokassaPayLauncher.Canceled -\u003e {\n                // платеж прерван пользователем\n            }\n            is RobokassaPayLauncher.Error -\u003e {\n                // во время проведения платежа произошла ошибка\n            }\n            is RobokassaPayLauncher.Success -\u003e {\n                // платеж выполнен успешно\n            }\n        }\n    }\n    payProcessLauncher.launch(RobokassaPayLauncher.StartPay(paymentParams))\n```\n\n3. Результат платежа вернется в ActivityResultCallback:\n\n   - при успешно завершенном платеже возвращается [RobokassaPayLauncher.Success](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/pay/RobokassaPayLauncher.kt), который содержит в себе:\n   \n     - invoiceId - номер оплаченного заказа\n     \n     - opKey - идентификатор операции (нужен для оплаты по сохраненной карте)\n     \n     - resultCode [CheckRequestCode](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/models/CheckPay.kt) - код результата выполнения запроса в платежном окне\n     \n     - stateCode [CheckPayStateCode](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/models/CheckPay.kt) - код состояния платежа\n     \n   - при отмене платежа возвращается RobokassaPayLauncher.Canceled\n   \n   - при неуспешном платеже в ответ приходит [RobokassaPayLauncher.Error](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/pay/RobokassaPayLauncher.kt), внутри которого находятся:\n   \n     - error - Throwable\n     \n     - resultCode [CheckRequestCode](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/models/CheckPay.kt) - код результата выполнения запроса в платежном окне\n     \n     - stateCode [CheckPayStateCode](https://bitbucket.org/ipol/rk-sdk-android/src/main/Robokassa_Library/src/main/java/com/robokassa/library/models/CheckPay.kt) - код состояния платежа\n     \n     - desc - текстовое описание ошибки\n     \n### Дополнительные запросы\nЕсли в платежном окне был вызван не обычный платеж, а холдирование средств или рекуррентный платеж, то далее потребуется вызвать дополнительный метод SDK.\n\n1. При выполнении отложенного платежа (холдировании) необходимо вызвать либо отмену, либо подтверждение платежа\n   \n```kotlin\n    // Подтверждение отложенного платежа, в качестве paymentParams рекомендуется использовать объект, созданный на этапе вызова платежного окна\n    val pa = PaymentAction.init()\n    pa.confirmHold(paymentParams)\n    lifecycleScope.launch {\n        pa.state.collect { ps -\u003e\n            if (ps is PayActionState) {\n                if (ps.success) {\n                    // платеж успешно подтвержден\n                } else {\n                    // операция завершена с ошибкой\n                }\n            }\n        }\n    }\n    \n    // Отмена отложенного платежа, в качестве paymentParams рекомендуется использовать объект, созданный на этапе вызова платежного окна\n    val pa = PaymentAction.init()\n    pa.cancelHold(paymentParams)\n    lifecycleScope.launch {\n        pa.state.collect { ps -\u003e\n            if (ps is PayActionState) {\n                if (ps.success) {\n                    // платеж успешно отменен\n                } else {\n                    // операция завершена с ошибкой\n                }\n            }\n        }\n    }\n```\n   \n2. При выполнении рекуррентного платежа можно вызвать повторный платеж с прежними параметрами\n   \n```kotlin\n    // Совершение повторного платежа\n    val paymentParams =\n    PaymentParams().setParams {\n        orderParams {                           // данные заказа\n            invoiceId = 12345                   // номер заказа в системе продавца\n            previousInvoiceId = 55              // номер первичного заказа, созданного с флагом isRecurrent = true\n            orderSum = 200.50\t\t\t        // сумма заказа\n        }\n    }.also {\n        it.setCredentials(MERCHANT_LOGIN, PASSWORD_1, PASSWORD_2)\n    }\n    val pa = PaymentAction.init()\n    pa.payRecurrent(paymentParams)\n    lifecycleScope.launch {\n        pa.state.collect { ps -\u003e\n            if (ps is PayRecurrentState) {\n                if (ps.success) {\n                    // повторный платеж успешно инициирован на стороне Robokassa\n                } else {\n                    // операция завершена с ошибкой\n                }\n            }\n        }\n    }\n```\n\n3. При выполнении повторного платежа по ранее сохраненной карте необходимо заново вызвать платежное окно Robokassa, указав код предыдущей операции с этой картой\n   \n```kotlin\n    // Совершение повторного платежа\n    val paymentParams =\n    PaymentParams().setParams {\n        orderParams {                           // данные заказа\n            invoiceId = 12345                   // номер заказа в системе продавца\n            orderSum = 200.50\t\t\t        // сумма заказа\n            token = opKey                       // идентификатор предыдущей операции с картой\n            description = \"Оплата по заказу\"    // описание, показываемое покупателю в платежном окне\n            receipt = Receipt                   // объект фискального чека\n        }\n        customerParams {                        // данные покупателя\n            culture = Culture.RU                // язык интерфейса\n            email = \"john@doe.com\"              // электронная почта покупателя для отправки уведомлений об оплате\n        }\n        viewParams {\n            toolbarText = \"Оплата сохраненной картой\" // заголовок окна оплаты\n        }\n    }.also {\n        it.setCredentials(MERCHANT_LOGIN, PASSWORD_1, PASSWORD_2)\n    }\n    payProcessLauncher.launch(RobokassaPayLauncher.StartPay(paymentParams))\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobokassa%2Fsdk-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobokassa%2Fsdk-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobokassa%2Fsdk-android/lists"}