All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.tinkoff.acquiring.sdk.requests.InitRequest.kt Maven / Gradle / Ivy

There is a newer version: 4.1.4
Show newest version
/*
 * Copyright © 2020 Tinkoff Bank
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package ru.tinkoff.acquiring.sdk.requests

import ru.tinkoff.acquiring.sdk.models.Receipt
import ru.tinkoff.acquiring.sdk.models.Shop
import ru.tinkoff.acquiring.sdk.network.AcquiringApi.INIT_METHOD
import ru.tinkoff.acquiring.sdk.responses.InitResponse
import java.text.SimpleDateFormat
import java.util.*

/**
 * Инициирует новый платеж
 *
 * @author Mariya Chernyadieva, Taras Nagorny
 */
class InitRequest : AcquiringRequest(INIT_METHOD),
    PaymentAdditionalDataParamsDelegate by PaymentAdditionalDataParamsImpl() {

    /**
     * Сумма в копейках
     */
    var amount: Long = 0

    /**
     * Номер заказа в системе продавца
     */
    var orderId: String? = null

    /**
     * Название шаблона формы оплаты продавца
     */
    var payForm: String? = null

    /**
     * Идентификатор покупателя в системе продавца
     */
    var customerKey: String? = null

    /**
     * Краткое описание заказа, макс. длина 250 символов
     */
    var description: String? = null
        set(value) {
            field = value?.take(250)
        }

    /**
     * Язык платёжной формы.
     * ru - форма оплаты на русском языке;
     * en - форма оплаты на английском языке.
     * По-умолчанию - форма оплаты на русском языке
     */
    var language: String? = null

    /**
     * Форма проведения платежа [ru.tinkoff.acquiring.sdk.models.enums.PayType]
     */
    var payType: String? = null

    /**
     * Объект с данными чека
     */
    var receipt: Receipt? = null

    /**
     * Указывает, что совершается рекуррентный или нерекуррентный платеж
     */
    var recurrent: Boolean = false

    /**
     * Флаг, что происходит оплата в рекуретном режиме, и вместо вызова FinishAuthorize
     * необходимо вызвать Charge
     */
    var chargeFlag: Boolean = false

    /**
     * Объект, содержащий дополнительные параметры в виде "ключ":"значение".
     * Данные параметры будут переданы в запросе платежа/привязки карты.
     * Максимальная длина для каждого передаваемого параметра:
     * Ключ – 20 знаков,
     * Значение – 100 знаков.
     * Максимальное количество пар "ключ-значение" не может превышать 20
     */
    var data: Map? = null

    /**
     * Список с данными магазинов
     */
    var shops: List? = null

    /**
     * Список с данными чеков
     */
    var receipts: List? = null

    /**
     * Срок жизни ссылки
     */
    var redirectDueDate: Date? = null
        set(value) {
            field = value
            redirectDueDateFormat = dateFormat.format(value).let {
                StringBuilder(it).insert(it.length - 2, ":").toString()
            }
        }

    /**
     * Адрес для получения http нотификаций
     */
    var notificationURL: String? = null

    /**
     * Страница успеха
     */
    var successURL: String? = null

    /**
     * Страница ошибки
     */
    var failURL: String? = null

    private var redirectDueDateFormat: String? = null
    private val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault())

    override fun asMap(): MutableMap {
        val map = super.asMap()

        map.putIfNotNull(AMOUNT, amount.toString())
        map.putIfNotNull(ORDER_ID, orderId)
        map.putIfNotNull(CUSTOMER_KEY, customerKey)
        map.putIfNotNull(DESCRIPTION, description)
        map.putIfNotNull(PAY_FORM, payForm)
        map.putIfNotNull(RECURRENT, if (recurrent) RECURRENT_FLAG_Y else null)
        map.putIfNotNull(LANGUAGE, language)
        map.putIfNotNull(PAY_TYPE, payType)
        map.putIfNotNull(RECEIPT, receipt)
        map.putIfNotNull(RECEIPTS, receipts)
        map.putIfNotNull(SHOPS, shops)
        map.putIfNotNull(REDIRECT_DUE_DATE, redirectDueDateFormat)
        map.putIfNotNull(NOTIFICATION_URL, notificationURL)
        map.putIfNotNull(SUCCESS_URL, successURL)
        map.putIfNotNull(FAIL_URL, failURL)
        map.writeDataParams(data) {
            this[CHARGE_FLAG] = chargeFlag.toString()
        }
        return map
    }

    override fun validate() {
        orderId.validate(ORDER_ID)
        amount.validate(AMOUNT)
    }

    /**
     * Синхронный вызов метода API
     */
    override fun execute(onSuccess: (InitResponse) -> Unit, onFailure: (Exception) -> Unit) {
        super.performRequest(this, InitResponse::class.java, onSuccess, onFailure)
    }

    companion object {
        private const val RECURRENT_FLAG_Y = "Y"
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy