# ПСКБ Платежи Java/Kotlin Библиотека является дополнением к API системы интернет-эквайринга [ПСКБ "Платежи"](https://online.pscb.ru) и позволяет подключить приём платежей по картам в приложениях на JVM (Java/Kotlin/Groovy) с минимальными усилиями. ## Возможности На текущий момент библиотека поддерживает: - Оплата картами - Google Pay ## Подключение зависимостей #### Gradle ```groovy maven { name "pscb" url "https://nxs.pscb.ru/repository/pscb-releases/" } dependencies { implementation "ru.pscb:online-java:1.0.0" } ``` #### Maven Прописать репозиторий: ```xml false pscb https://nxs.pscb.ru/repository/pscb-releases/ ``` Добавить зависимость: ```xml ru.pscb online-java 1.0.0 ``` ## Интеграция #### Оплата картами * Создайте экземпляр `PSCBOnlineClient` с вашими настройками: ```kotlin val apiClient = DefaultPSCBOnlineClient( environment = BackendEnvironment.SANDBOX, // или PRODUCTION marketPlaceId = 123456, /* <-- Your MarketPlace ID */ signingKey = "Your Signing Key" ) // или val sandboxApi = PSCBOnlineClient.sandbox(/* Your MarketPlace ID */, "Your Signing Key") val productionApi = PSCBOnlineClient.production(/* Your MarketPlace ID */, "Your Signing Key") ``` > `environment` - окружение, в рамках которого библиотека взаимодействует с сервисом. `SANDBOX` - тестовое > окружение; `PRODUCTION` - продуктовое. > `Your MarketPlace ID` - ваш идентификатор в системе ПСКБ-Онлайн. > `Your Signing Key` - ваш ключ подписи запросов к системе. * Создайте экземпляр `Payment` ```kotlin val payment = Payment(amount = BigDecimal(1000.00), orderId = "Order-ID") ``` > `amount` - сумма в рублях. (_На текущий момент другая валюта не поддерживается._) > `orderId` - уникальный идентификатор заказа в рамках магазина. _Для детальной информации, какие параметры присутствуют, смотрите документацию `Payment`._ * Для приёма оплаты картами создайте экземпляр класса `CardData`. ```kotlin val card = CardData( "4761349750010326", expiryDate = YearMonth.of(2022, 12), cvCode = "851" ) ``` * Создайте токен запроса, используя экземпляр `PSCBOnlineClient`, созданный ранее. ```kotlin val request = client.makeRequestWithCardData(card, payment) ``` * Отправьте токен запроса на сервер ПСКБ-Онлайн. ```kotlin // Send request to backend client.send(request) { response -> println("Error ${response.error}") println("Status ${response.status}") println("Response ${response.response}") } ``` > В случае успешного выполнения запроса, `response` будет содержать информацию о принятом платеже, его ID, состояние и > прочие данные. ##### Полный пример на Kotlin ```kotlin object App { private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss") @JvmStatic fun main(vararg args: String) { val client = PSCBOnlineClient.sandbox(marketPlaceId = 1234567890, signingKey = "111111") val card = CardData("4761120010000491", YearMonth.of(2022, 2), "500") val payment = Payment(BigDecimal(100), "APP-" + LocalDateTime.now().format(formatter)) val request = client.makeRequestWithCardData(card, payment) val future = client.send(request) { error, response -> println("Error $error") println("Response $response") } future.join() } } ``` #### Google Pay 1. Получите свой Google Merchant ID 2. В своём `Activity` создайте экземпляр `com.google.android.gms.wallet.PaymentsClient` ```kotlin paymentsClient = PSCBAPI.createPaymentClient(this, WalletConstants.ENVIRONMENT_TEST) ``` 3. Также там создайте экземпляр `ru.pscb.library.client.PSCBOnlineClient` ```kotlin apiClient = DefaultPSCBOnlineClient( environment = BackendEnvironment.SANDBOX, // или PRODUCTION marketPlaceId = 123456, /* <-- Your MarketPlace ID */ signingKey = "Your Signing Key" ) ``` 4. Обработайте намерие оплаты пользователя ```kotlin val request = PSCBAPI.makePaymentRequest("", price) AutoResolveHelper.resolveTask( paymentsClient.loadPaymentData(request), this, LOAD_PAYMENT_DATA_REQUEST_CODE ) ``` 5. Обработайте авторизацию пользователя и отправьте данные на бэкенд сервер ```kotlin val payment = Payment(price, Date().toString()) val request = apiClient.makeRequestWithTokenData(paymentData, payment) val toast = Toast(this) apiClient.send(request) { throwable, response -> if (throwable != null) { toast.setText("Rawr") Log.d("HandlePaymentSuccess", "Failed to init a payment", throwable) } if (response != null) { toast.setText("Meow") Log.d("HandlePaymentSuccess", "Backend response $response") } toast.show() } ```