193 lines
6.0 KiB
Markdown
193 lines
6.0 KiB
Markdown
|
# ПСКБ Платежи 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
|
|||
|
<repositories>
|
|||
|
<repository>
|
|||
|
<snapshots>
|
|||
|
<enabled>false</enabled>
|
|||
|
</snapshots>
|
|||
|
<name>pscb</name>
|
|||
|
<url>https://nxs.pscb.ru/repository/pscb-releases/</url>
|
|||
|
</repository>
|
|||
|
</repositories>
|
|||
|
```
|
|||
|
|
|||
|
Добавить зависимость:
|
|||
|
```xml
|
|||
|
<dependencies>
|
|||
|
<dependency>
|
|||
|
<groupId>ru.pscb</groupId>
|
|||
|
<artifactId>online-java</artifactId>
|
|||
|
<version>1.0.0</version>
|
|||
|
</dependency>
|
|||
|
</dependencies>
|
|||
|
```
|
|||
|
|
|||
|
## Интеграция
|
|||
|
|
|||
|
#### Оплата картами
|
|||
|
|
|||
|
* Создайте экземпляр `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("<Your Google Merchant ID>", 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()
|
|||
|
}
|
|||
|
```
|