Flutter-SDK: відмінності між версіями

Матеріал з apidocs
Перейти до: навігація, пошук
Немає опису редагування
 
(Не показано 28 проміжних версій цього користувача)
Рядок 1: Рядок 1:
{{APINav}}
== Введеня ==
== Введеня ==
----Ця інструкція допоможе вам налаштувати і реалізувати можливості EasyPay SDK у вашому Flutter-додатку як для Android, так і для iOS. Виконуючи кроки в інструкції, ви зможете:
----Ця інструкція допоможе вам налаштувати і реалізувати можливості EasyPay SDK у вашому Flutter-додатку як для Android, так і для iOS. Виконуючи кроки в інструкції, ви зможете:


* Підключити SDK до вашого Flutter-проекту.
* Підключити SDK до вашого Flutter-проекту.
* Реалізувати функціонал для здійснення платежів.
* Реалізувати функціонал для здійснення платежів.  
* Додати можливість перегляду, додавання або видалення карток користувачів.
* Додати можливість перегляду, додавання або видалення карток користувачів.


Рядок 13: Рядок 14:


=== Налаштування залежностей ===
=== Налаштування залежностей ===
----Відкрийте файл '''settings.gradle''' у вашому проекті та додайте наступні налаштування:
----📄 <code>settings.gradle</code> (рівень проєкту)


'''settings.gradle''' (рівень проекту):<syntaxhighlight lang="markdown">
Відкрийте файл '''settings.gradle''' у вашому проекті та додайте наступні налаштування:
 
<syntaxhighlight lang="markdown">
pluginManagement {
pluginManagement {
     val flutterSdkPath = run {
     val flutterSdkPath = run {
Рядок 32: Рядок 35:
}
}


</syntaxhighlight>Це дозволить правильно налаштувати плагіни Flutter і залежності для проекту.
</syntaxhighlight>
<br> Це дозволить правильно налаштувати плагіни Flutter і залежності для проекту.
<br>


'''build.gradle''' (рівень додатку):<syntaxhighlight lang="markdown">
'''<code>build.gradle</code>''' (рівень додатку):
 
Додайте у секцію <code>dependencies</code> SDK EasyPay:<syntaxhighlight lang="markdown">
dependencies {
dependencies {
     implementation("ua.easypay:EasyPay-Sdk:1.0.0-alpha8")
     implementation("ua.easypay:EasyPay- Sdk:1.0.0")
}
}


</syntaxhighlight>
</syntaxhighlight>


== Ініціалізація SDK в класі Application ==
=== Ініціалізація SDK в класі Application ===
----
----
В Android потрібно ініціалізувати EasyPay SDK у класі '''Application'''. Створіть або відкрийте ваш клас '''FlutterApp''':<syntaxhighlight lang="kotlin">
В Android потрібно ініціалізувати EasyPay SDK у класі '''Application'''. Створіть або відкрийте ваш клас '''FlutterApp''':<syntaxhighlight lang="kotlin">
class FlutterApp : Application() {
class FlutterApp : Application() {
     override fun onCreate() {
     override fun onCreate() {
         super.onCreate()
         super.onCreate()
         EasyPaySdk.init(
         EasyPaySdk.INSTANCE.init(
             context = PlatformContext(this), // ініціалізація контексту
             PlatformContext(this),
             secret = "your secret", // Ваш секретний ключ
             "test",
             partnerKey = "your partner key" // Ваш партнерський ключ
             "easypay-test",
            null
         )
         )
     }
     }
}
}


</syntaxhighlight>Цей код ініціалізує SDK при запуску додатку на платформі Android.
</syntaxhighlight>


=== Створення MethodChannel для взаємодії з Flutter ===
=== Створення MethodChannel ===
На цьому етапі вам потрібно налаштувати '''MethodChannel''', який дозволить вашому Flutter додатку взаємодіяти з нативним кодом Android. Через цей канал ваш додаток зможе надсилати запити на Android для таких операцій, як ініціація процесу оплати чи відкриття екрану для роботи з картками користувача.<syntaxhighlight lang="kotlin">
На цьому етапі вам потрібно налаштувати '''MethodChannel''', який дозволить вашому Flutter додатку взаємодіяти з нативним кодом Android. Через цей канал ваш додаток зможе надсилати запити на Android для методів навігації на оплату та на перегляд/додавання/видалення карток.<syntaxhighlight lang="kotlin">
package ua.easypay.sdktestapp_flutter.test_app_with_sdk_flutter
package ua.easypay.sdktestapp_flutter.test_app_with_sdk_flutter


Рядок 67: Рядок 76:
import ua.easypay.sdk.data.model.arguments.SdkCardsContractArgs
import ua.easypay.sdk.data.model.arguments.SdkCardsContractArgs
import ua.easypay.sdk.data.model.arguments.SdkPaymentContractArgs
import ua.easypay.sdk.data.model.arguments.SdkPaymentContractArgs
import ua.easypay.sdk.presentation.SdkUserCardsActivity.Companion.navigate
import ua.easypay.sdk.presentation.SdkUserCardsActivity
import ua.easypay.sdk.presentation.instruments.PaymentInstrumentArgs
import ua.easypay.sdk.presentation.instruments.PaymentInstrumentArgs


Рядок 75: Рядок 84:


     private val paymentLauncher = registerForActivityResult(SdkPaymentContract()) { sdkResult ->
     private val paymentLauncher = registerForActivityResult(SdkPaymentContract()) { sdkResult ->
        println("SdkPaymentContract result: $sdkResult")
         pendingResult?.let { result ->
         pendingResult?.let { result ->
             result.success(sdkResult?.toString())
             result.success(sdkResult?.toString())
             pendingResult = null
             pendingResult = null // clear after use
         }
         }
     }
     }
Рядок 85: Рядок 95:


         MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
         MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
             if (call.method == "startPayment") {
             when (call.method) {
                val args = call.arguments as? Map<*, *>
                "startPayment" -> {
                if (args != null) {
                    println("call.arguments: ${call.arguments}")
                    try {
                    val args = call.arguments as? Map<*, *>
                        val serviceKey = args["serviceKey"] as? String ?: throw IllegalArgumentException("Missing serviceKey")
                    println("call.arguments after cast: $args")
                        val orderId = args["orderId"] as? String ?: throw IllegalArgumentException("Missing orderId")
                    if (args != null) {
                        val amount = (args["amount"] as? String)?.toDoubleOrNull() ?: throw IllegalArgumentException("Missing/invalid amount")
                        try {
                        val description = args["description"] as? String ?: throw IllegalArgumentException("Missing description")
                            val serviceKey = args["serviceKey"] as? String
                        val additionalItems = (args["additionalItems"] as? Map<*, *>)?.mapKeys { it.key.toString() }?.mapValues { it.value.toString() }
                                ?: throw IllegalArgumentException("Missing serviceKey")
                        val phoneNumber = args["phoneNumber"] as? String
                            val orderId = args["orderId"] as? String
                        val showPaymentResult = args["showPaymentResult"] as? Boolean ?: false
                                ?: throw IllegalArgumentException("Missing orderId")
                            val amount = (args["amount"] as? String)?.toDoubleOrNull()
                                ?: throw IllegalArgumentException("Missing or invalid amount")
                            val description = args["description"] as? String
                                ?: throw IllegalArgumentException("Missing description")
                            val additionalItems = (args["additionalItems"] as? Map<*, *>)?.mapKeys { it.key.toString() }?.mapValues { it.value.toString() }
                            val phoneNumber = args["phoneNumber"] as? String
                            val showPaymentResult = args["showPaymentResult"] as? Boolean ?: false


                        val paymentInstrumentArgs = PaymentInstrumentArgs(
                            val paymentInstrumentArgs = PaymentInstrumentArgs(
                            serviceKey = serviceKey,
                                serviceKey = serviceKey,
                            orderId = orderId,
                                orderId = orderId,
                            amount = amount,
                                amount = amount,
                            description = description,
                            additionalItems = additionalItems,
                            phoneNumber = phoneNumber
                        )


                        val sdkArgs = SdkPaymentContractArgs(
</syntaxhighlight>
                            paymentInstrumentArgs = paymentInstrumentArgs,
                            showPaymentResult = showPaymentResult
                        )
                        pendingResult = result


                        paymentLauncher.launch(sdkArgs)
== IOS частина ==
 
----
                    } catch (e: Exception) {
                        result.error("INVALID_ARGS", "Failed to parse args: ${e.localizedMessage}", null)
                    }
                } else {
                    result.error("INVALID_ARGS", "Args were null", null)
                }
            } else if (call.method == "openCardListScreen") {
                val phoneNumber = call.argument<String>("phoneNumber") ?: ""
                val args = SdkCardsContractArgs(phoneNumber = phoneNumber)
                [email protected](args)
                result.success(null)
            } else {
                result.notImplemented()
            }
        }
    }
}


</syntaxhighlight><div style="text-align: center; color: #003366; font-size: 24px; font-family: Arial, sans-serif; font-weight: bold; margin-top: 20%;">
=== Підключення EasyPay SDK до iOS проекту ===
== iOS частина ==
----</div>
 
== Підключення EasyPay SDK до iOS проекту ==
----Щоб підключити SDK для iOS у ваш проект, вам потрібно виконати наступні кроки:
----Щоб підключити SDK для iOS у ваш проект, вам потрібно виконати наступні кроки:


# '''Завантажте фреймворк EasyPaySdkIos''':
# '''Завантажте фреймворк EasyPaySdkIos''':
#* Завантажте '''<code>EasyPaySdkIos.xcframework</code>''' та вставте його в папку вашого iOS проекту - '''<code>YourProject/iOS/Runner/</code>'''.
#* Завантажте EasyPaySdkIos.xcframework за посиланням https://github.com/EasyPay-Mobile/EasyPay-Sdk-Ios та вставте його в папку вашого iOS проекту - YourProject/iOS/Runner/.
<br>


[[Файл:Знімок екрана 2025-06-11 о 13.44.35.png|центр|міні|600x600пкс]]
[[Файл:Знімок екрана 2025-06-11 о 13.44.35.png|центр|міні|600x600пкс]]
Рядок 148: Рядок 137:


* Переконайтеся, що '''<code>EasyPaySdkIos.xcframework</code>''' з'явився в секції '''Frameworks, Libraries, and Embedded Content''' у вашому Xcode проекті.
* Переконайтеся, що '''<code>EasyPaySdkIos.xcframework</code>''' з'явився в секції '''Frameworks, Libraries, and Embedded Content''' у вашому Xcode проекті.
<br>


3. '''Додайте папку <code>compose-resources</code> до Copy Bundle Resources''':
3. '''Додайте папку <code>compose-resources</code> до Copy Bundle Resources''':
Рядок 153: Рядок 143:
* У Xcode додайте папку '''<code>compose-resources</code>''', що знаходиться всередині '''<code>EasyPaySdkIos.xcframework</code>''', до '''Copy Bundle Resources'''. Це дозволить SDK використовувати необхідні ресурси.
* У Xcode додайте папку '''<code>compose-resources</code>''', що знаходиться всередині '''<code>EasyPaySdkIos.xcframework</code>''', до '''Copy Bundle Resources'''. Це дозволить SDK використовувати необхідні ресурси.
* Виберіть опцію '''"Create folder references"''' при додаванні цієї папки.
* Виберіть опцію '''"Create folder references"''' при додаванні цієї папки.
<br>


[[Файл:Знімок екрана 2025-06-11 о 13.45.22.png|центр|міні|600x600пкс]]
[[Файл:Знімок екрана 2025-06-11 о 13.45.22.png|центр|міні|600x600пкс]]
[[Файл:Знімок екрана 2025-06-11 о 13.45.53.png|центр|міні|600x600пкс]]
[[Файл:Знімок екрана 2025-06-11 о 13.45.53.png|центр|міні|600x600пкс]]
<br>
'''''Важливо''':'' при додаванні compose-resources в діалозі додавання у вас були обрані наступні опції
'''''Важливо''':'' при додаванні compose-resources в діалозі додавання у вас були обрані наступні опції


* Destination: Copy items if needed
* '''Destination''': Copy items if needed
* Added folders: Create folder references
* '''Added folders:''' Create folder references
<br>


[[Файл:Знімок екрана 2025-06-11 о 13.47.39.png|центр|міні|600x600пкс]]
[[Файл:Знімок екрана 2025-06-11 о 13.47.39.png|центр|міні|600x600пкс]]


 
=== Ініціалізація SDK в AppDelegate.swift ===
 
== Ініціалізація SDK в AppDelegate.swift ==
----Після підключення фреймворка потрібно ініціалізувати EasyPay SDK у вашому додатку. Це робиться в класі <code>AppDelegate.swift</code>.
----Після підключення фреймворка потрібно ініціалізувати EasyPay SDK у вашому додатку. Це робиться в класі <code>AppDelegate.swift</code>.


Рядок 199: Рядок 190:
</syntaxhighlight>
</syntaxhighlight>


==== Створення '''MethodChannel''' для методів навігації на оплату та на перегляд/додавання/видалення карток ====
=== Створення '''MethodChannel''' для методів навігації на оплату та на перегляд/додавання/видалення карток ===
----У цьому кроці налаштовується '''MethodChannel''' для взаємодії між Flutter та нативним кодом iOS. Це дозволяє відправляти запити з Flutter для запуску оплати або відкриття екрану для перегляду, додавання чи видалення карток.<syntaxhighlight lang="swift">
----У цьому кроці налаштовується '''MethodChannel''' для взаємодії між Flutter та нативним кодом iOS. Це дозволяє відправляти запити з Flutter для запуску оплати або відкриття екрану для перегляду, додавання чи видалення карток.<syntaxhighlight lang="swift">
import Flutter
import Flutter
Рядок 280: Рядок 271:
</syntaxhighlight>
</syntaxhighlight>


* '''"startPayment"''' — викликає екран для здійснення платежу.


* '''"openCardListScreen"''' — відкриває екран для перегляду карток.




=== Ініціалізація оплати ===
=== Ініціалізація оплати ===
У Flutter додатку створюється кнопка, яка викликає метод для ініціалізації платежу. Ось приклад:<syntaxhighlight lang="markdown">
----
У Flutter додатку створюється кнопка, яка викликає метод для ініціалізації платежу.  
 
Для запуску процесу оплати використовується виклик нативного методу <code>startPayment</code> через '''MethodChannel'''. У цьому прикладі ми створюємо кнопку, яка при натисканні передає всі необхідні параметри платежу.  <syntaxhighlight lang="markdown">
SizedBox(
SizedBox(
     width: double.infinity,
     width: double.infinity,
Рядок 316: Рядок 308:
</syntaxhighlight>
</syntaxhighlight>


== Перехід на флоу перегляду/додавання/видалення карток ==
=== Перехід на флоу перегляду/додавання/видалення карток ===
----
У цьому етапі необхідно реалізувати функціональність для переходу на екран, на якому користувач зможе переглядати, додавати або видаляти збережені картки. Це можна здійснити за допомогою '''<code>FloatingActionButton</code>''' у Flutter, який викликає нативний метод для відкриття екрану карток.<syntaxhighlight lang="markdown">
У цьому етапі необхідно реалізувати функціональність для переходу на екран, на якому користувач зможе переглядати, додавати або видаляти збережені картки. Це можна здійснити за допомогою '''<code>FloatingActionButton</code>''' у Flutter, який викликає нативний метод для відкриття екрану карток.<syntaxhighlight lang="markdown">
SizedBox(
SizedBox(
Рядок 337: Рядок 330:
</syntaxhighlight>
</syntaxhighlight>


==== Кроки для реалізації: ====


# '''Створення кнопки для навігації на екран карток''':
#* Використовується '''<code>FloatingActionButton</code>''' з текстом '''"Navigate to cards"'''. Це кнопка, яку користувач натискає для переходу на екран карток.
#* Кнопка розтягується на всю ширину екрана за допомогою '''<code>SizedBox</code>'''.
# '''Отримання номеру телефону''':
#* Коли користувач натискає на кнопку, '''номер телефону''' отримується з текстового поля '''_phoneNumberController.text'''. Це значення буде передано як параметр до нативного коду для відкриття екрану карток для конкретного користувача.
#
#

Поточна версія на 09:40, 11 вересня 2025

Merchant API

Головна сторінка

(Токенізація з передачею даних картки у запиті

Введеня


Ця інструкція допоможе вам налаштувати і реалізувати можливості EasyPay SDK у вашому Flutter-додатку як для Android, так і для iOS. Виконуючи кроки в інструкції, ви зможете:

  • Підключити SDK до вашого Flutter-проекту.
  • Реалізувати функціонал для здійснення платежів.
  • Додати можливість перегляду, додавання або видалення карток користувачів.


Незалежно від того, на якій платформі ви працюєте (Android чи iOS), SDK EasyPay забезпечить вам підтримку на обох платформах, дозволяючи вам створювати додатки з потужними платіжними функціями для ваших користувачів.

Android частина


Налаштування залежностей


📄 settings.gradle (рівень проєкту)

Відкрийте файл settings.gradle у вашому проекті та додайте наступні налаштування:

pluginManagement {
    val flutterSdkPath = run {
        val properties = java.util.Properties()
        file("local.properties").inputStream().use { properties.load(it) }
        val flutterSdkPath = properties.getProperty("flutter.sdk")
        require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
        flutterSdkPath
    }
    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}


Це дозволить правильно налаштувати плагіни Flutter і залежності для проекту.

build.gradle (рівень додатку):

Додайте у секцію dependencies SDK EasyPay:

dependencies {
    implementation("ua.easypay:EasyPay- Sdk:1.0.0")
}

Ініціалізація SDK в класі Application


В Android потрібно ініціалізувати EasyPay SDK у класі Application. Створіть або відкрийте ваш клас FlutterApp:

class FlutterApp : Application() {

    override fun onCreate() {
        super.onCreate()
        EasyPaySdk.INSTANCE.init(
            PlatformContext(this),
            "test",
            "easypay-test",
            null
        )
    }
}

Створення MethodChannel

На цьому етапі вам потрібно налаштувати MethodChannel, який дозволить вашому Flutter додатку взаємодіяти з нативним кодом Android. Через цей канал ваш додаток зможе надсилати запити на Android для методів навігації на оплату та на перегляд/додавання/видалення карток.

package ua.easypay.sdktestapp_flutter.test_app_with_sdk_flutter

import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import ua.easypay.sdk.data.contracts.SdkPaymentContract
import ua.easypay.sdk.data.model.arguments.SdkCardsContractArgs
import ua.easypay.sdk.data.model.arguments.SdkPaymentContractArgs
import ua.easypay.sdk.presentation.SdkUserCardsActivity
import ua.easypay.sdk.presentation.instruments.PaymentInstrumentArgs

class MainActivity : FlutterFragmentActivity() {
    private val CHANNEL = "com.example.sdk/payment"
    private var pendingResult: MethodChannel.Result? = null

    private val paymentLauncher = registerForActivityResult(SdkPaymentContract()) { sdkResult ->
        println("SdkPaymentContract result: $sdkResult")
        pendingResult?.let { result ->
            result.success(sdkResult?.toString())
            pendingResult = null // clear after use
        }
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "startPayment" -> {
                    println("call.arguments: ${call.arguments}")
                    val args = call.arguments as? Map<*, *>
                    println("call.arguments after cast: $args")
                    if (args != null) {
                        try {
                            val serviceKey = args["serviceKey"] as? String
                                ?: throw IllegalArgumentException("Missing serviceKey")
                            val orderId = args["orderId"] as? String
                                ?: throw IllegalArgumentException("Missing orderId")
                            val amount = (args["amount"] as? String)?.toDoubleOrNull()
                                ?: throw IllegalArgumentException("Missing or invalid amount")
                            val description = args["description"] as? String
                                ?: throw IllegalArgumentException("Missing description")
                            val additionalItems = (args["additionalItems"] as? Map<*, *>)?.mapKeys { it.key.toString() }?.mapValues { it.value.toString() }
                            val phoneNumber = args["phoneNumber"] as? String
                            val showPaymentResult = args["showPaymentResult"] as? Boolean ?: false

                            val paymentInstrumentArgs = PaymentInstrumentArgs(
                                serviceKey = serviceKey,
                                orderId = orderId,
                                amount = amount,

IOS частина


Підключення EasyPay SDK до iOS проекту


Щоб підключити SDK для iOS у ваш проект, вам потрібно виконати наступні кроки:

  1. Завантажте фреймворк EasyPaySdkIos:



2. Перевірте, чи з'явився фреймворк у Xcode:

  • Переконайтеся, що EasyPaySdkIos.xcframework з'явився в секції Frameworks, Libraries, and Embedded Content у вашому Xcode проекті.


3. Додайте папку compose-resources до Copy Bundle Resources:

  • У Xcode додайте папку compose-resources, що знаходиться всередині EasyPaySdkIos.xcframework, до Copy Bundle Resources. Це дозволить SDK використовувати необхідні ресурси.
  • Виберіть опцію "Create folder references" при додаванні цієї папки.



Важливо: при додаванні compose-resources в діалозі додавання у вас були обрані наступні опції

  • Destination: Copy items if needed
  • Added folders: Create folder references


Ініціалізація SDK в AppDelegate.swift


Після підключення фреймворка потрібно ініціалізувати EasyPay SDK у вашому додатку. Це робиться в класі AppDelegate.swift.

Імпортуйте необхідні бібліотеки:

Відкрийте файл AppDelegate.swift і додайте імпорт бібліотек для Flutter та EasyPay SDK:

import Flutter
import UIKit
import EasyPaySdkIos

Ініціалізація EasyPay SDK: Додайте ініціалізацію SDK в метод application(_:didFinishLaunchingWithOptions:

@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,

didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
EasyPaySdk.shared.doInit(
context: PlatformContext(),
secret: your secret",
partnerKey: “your partner key",
applePayMerchantId: "merchant.com.example"
)
GeneratedPluginRegistrant.register(with: self)
return super.application(application,
didFinishLaunchingWithOptions: launchOptions)
}
}

Створення MethodChannel для методів навігації на оплату та на перегляд/додавання/видалення карток


У цьому кроці налаштовується MethodChannel для взаємодії між Flutter та нативним кодом iOS. Це дозволяє відправляти запити з Flutter для запуску оплати або відкриття екрану для перегляду, додавання чи видалення карток.

import Flutter
import UIKit
import EasyPaySdkIos
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
EasyPaySdk.shared.doInit(
context: PlatformContext(),
secret: your secret",
partnerKey: “your partner key",
applePayMerchantId: "merchant.com.example"
)
let controller = window?.rootViewController as!
FlutterViewController
let channel = FlutterMethodChannel(name: "com.example.sdk/
payment", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler { [weak controller] call, result in
if call.method == "startPayment" {
guard let args = call.arguments as? [String: Any] else {
result(FlutterError(code: "INVALID_ARGS", message:
"Args were null", details: nil))
return
}
let vc = createPaymentVC(args: args) { sdkResult in

if let sdkResult = sdkResult {
result(sdkResult.description) // send result
back to Flutter
} else {
result("Cancelled")
}
}
controller?.present(vc, animated: true)
} else if call.method == "openCardListScreen" {
let phoneNumber = (call.arguments as? [String: Any])?
["phoneNumber"] as? String ?? ""
let vc =
SdkCardsViewControllerKt.SdkCardsViewController(
args: SdkCardsContractArgs(phoneNumber: phoneNumber,
urlToNotifyMerchant: nil)) {
result(nil)
}
controller?.present(vc, animated: true)
} else {
result(FlutterMethodNotImplemented)
}
}
GeneratedPluginRegistrant.register(with: self)
return super.application(application,
didFinishLaunchingWithOptions: launchOptions)
}
}
func createPaymentVC(args: [String: Any], onResult: @escaping
(EPaySdkResult?) -> Void) -> UIViewController{
let params = SdkPaymentContractArgs(
paymentInstrumentArgs: PaymentInstrumentArgs(
serviceKey: args["serviceKey"] as? String ?? "",
orderId: args["orderId"] as? String ?? "",
amount: Double(args["amount"] as? String ?? "0") ?? 0.0,
description: args["description"] as? String ?? "",
additionalItems: (args["additionalItems"] as? [String:
String]) ?? [:],
phoneNumber: args["phoneNumber"] as? String
),
showPaymentResult: args["showPaymentResult"] as? Bool ?? false
)
let vc = SdkPaymentViewControllerKt.SdkPaymentViewController(args:
params) { result in
onResult(result)
}
vc.modalPresentationStyle = .fullScreen
return vc
}



Ініціалізація оплати


У Flutter додатку створюється кнопка, яка викликає метод для ініціалізації платежу.

Для запуску процесу оплати використовується виклик нативного методу startPayment через MethodChannel. У цьому прикладі ми створюємо кнопку, яка при натисканні передає всі необхідні параметри платежу.

SizedBox(
    width: double.infinity,
    child: FloatingActionButton.extended(
        onPressed: () async {
            final args = {
                'serviceKey': 'SomeServiceKey',
                'orderId': 'SomeOrderId',
                'amount': '3.0',
                'description': 'payment description',
                'phoneNumber': '380990000000',
                'showPaymentResult': true,
            };
            try {
                final result = await platform.invokeMethod('startPayment', args);
                setState(() {
                    _paymentResult = result;
                });
            } on PlatformException catch (e) {
                setState(() {
                    _paymentResult = "Failed to get payment result: '${e.message}'.";
                });
            }
        },
        label: const Text('Make payment'),
    ),
)

Перехід на флоу перегляду/додавання/видалення карток


У цьому етапі необхідно реалізувати функціональність для переходу на екран, на якому користувач зможе переглядати, додавати або видаляти збережені картки. Це можна здійснити за допомогою FloatingActionButton у Flutter, який викликає нативний метод для відкриття екрану карток.

SizedBox(
    width: double.infinity,
    child: FloatingActionButton.extended(
        onPressed: () async {
            final phoneNumber = _phoneNumberController.text;
            try {
                await platform.invokeMethod('openCardListScreen', {
                    'phoneNumber': phoneNumber,
                });
            } on PlatformException catch (e) {
                print('Failed to open card list screen: ${e.message}');
            }
        },
        label: const Text('Navigate to cards'),
    ),
)