Skip to content

Commit

Permalink
Merge pull request #228 from Merkost/master
Browse files Browse the repository at this point in the history
Added Activity Result API support with example
  • Loading branch information
jQwout authored Apr 3, 2023
2 parents cd32f28 + cb63a3c commit 9bfb975
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 5 deletions.
7 changes: 3 additions & 4 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,9 @@ AcquiringSdk.isDeveloperMode = true // используется тестовый
AcquiringSdk.isDebug = true // включение логирования запросов
```

Кроме того, в некоторых случаях к запросам к API эквайринга необходимо добавлять некий токен (подпись
запроса). Передача токена для SDK терминалов в общем случае не обязательна и зависит от настроек
терминала. Задание способа генерации токена в случаях, когда это необходимо, может выглядеть следующим
образом (для более подробной информации см. kDoc `AcquiringSdk.tokenGenerator`):
Кроме того, в некоторых случаях к запросам к API эквайринга есть возможность добавлять некий токен (подпись запроса).
Задание способа генерации токена в случаях, когда это необходимо, может выглядеть следующим образом
(для более подробной информации см. kDoc AcquiringSdk.tokenGenerator):
```kotlin
AcquiringSdk.tokenGenerator = SampleAcquiringTokenGenerator(password) // генерация токена с использованием пароля
// В целях безопасности не рекомендуется хранить пароль в коде приложения
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ import android.view.View
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
Expand All @@ -34,6 +37,7 @@ import ru.tinkoff.acquiring.sample.models.Book
import ru.tinkoff.acquiring.sample.models.BooksRegistry
import ru.tinkoff.acquiring.sample.models.Cart
import ru.tinkoff.acquiring.sdk.AcquiringSdk
import ru.tinkoff.acquiring.sdk.TinkoffAcquiring
import ru.tinkoff.acquiring.sdk.models.options.screen.PaymentOptions
import ru.tinkoff.acquiring.sdk.payment.PaymentProcess.Companion.configure
import ru.tinkoff.acquiring.yandexpay.models.YandexPayData
Expand All @@ -55,6 +59,23 @@ class DetailsActivity : PayableActivity() {

private var book: Book? = null

private val paymentContract =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result: ActivityResult ->
when (result.resultCode) {
RESULT_OK -> {
Toast.makeText(this,
R.string.notification_payment_success,
Toast.LENGTH_SHORT).show()
}
RESULT_CANCELED -> Toast.makeText(this,
R.string.payment_cancelled,
Toast.LENGTH_SHORT).show()
TinkoffAcquiring.RESULT_ERROR -> Toast.makeText(this,
R.string.payment_failed,
Toast.LENGTH_SHORT).show()
}
}

public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

Expand Down Expand Up @@ -84,7 +105,11 @@ class DetailsActivity : PayableActivity() {

val buttonBuy = findViewById<TextView>(R.id.btn_buy_now)
buttonBuy.setOnClickListener {
initPayment()
//Стандартный метод проведения оплаты с получением результата в OnActivityResult
//initPayment()

//Метод проведения оплаты с получением результата в ActivityResultAPI
initActivityResultAPIPayment()
}

val sbpButton = findViewById<View>(R.id.btn_fps_pay)
Expand All @@ -100,6 +125,12 @@ class DetailsActivity : PayableActivity() {
fillViews()
}

private fun initActivityResultAPIPayment() {
val pendingIntent = getPaymentPendingIntent()
val intentSenderRequest = IntentSenderRequest.Builder(pendingIntent).build()
paymentContract.launch(intentSenderRequest)
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.details_menu, menu)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package ru.tinkoff.acquiring.sample.ui

import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.PendingIntent
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
Expand Down Expand Up @@ -140,6 +141,10 @@ open class PayableActivity : AppCompatActivity() {
tinkoffAcquiring.openPaymentScreen(this, createPaymentOptions(), PAYMENT_REQUEST_CODE)
}

protected fun getPaymentPendingIntent(): PendingIntent {
return tinkoffAcquiring.getPaymentPendingIntent(this, createPaymentOptions(), PAYMENT_REQUEST_CODE)
}

protected fun openDynamicQrScreen() {
tinkoffAcquiring.openDynamicQrScreen(this, createPaymentOptions(), DYNAMIC_QR_PAYMENT_REQUEST_CODE)
}
Expand Down
34 changes: 34 additions & 0 deletions ui/src/main/java/ru/tinkoff/acquiring/sdk/TinkoffAcquiring.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.app.Activity
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.fragment.app.Fragment
import kotlinx.coroutines.*
import ru.tinkoff.acquiring.sdk.localization.LocalizationSource
Expand Down Expand Up @@ -120,6 +121,39 @@ class TinkoffAcquiring(
return PaymentProcess(sdk, applicationContext).createFinishProcess(paymentId, paymentSource)
}

/**
* Получение Acquiring SDK PendingIntent для проведения оплаты и получения результата с помощью Activity Result API
*
* @param activity контекст для запуска экрана из Activity
* @param options настройки платежной сессии и визуального отображения экрана
* @param requestCode код для получения результата, по завершению оплаты
* @param state вспомогательный параметр для запуска экрана Acquiring SDK
* с заданного состояния
* @return настроенный PendingIntent
*/
@JvmOverloads
fun getPaymentPendingIntent(
activity: Activity,
options: PaymentOptions,
requestCode: Int,
state: AsdkState = DefaultState
): PendingIntent {
options.asdkState = state
val intent = prepareIntent(activity, options, PaymentActivity::class.java)

val flags = when {
Build.VERSION.SDK_INT < Build.VERSION_CODES.S -> PendingIntent.FLAG_UPDATE_CURRENT
else -> PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
}

return PendingIntent.getActivity(
activity,
requestCode,
intent,
flags
)
}

/**
* Запуск экрана Acquiring SDK для проведения оплаты
*
Expand Down

0 comments on commit 9bfb975

Please sign in to comment.