diff --git a/CHANGELOG.md b/CHANGELOG.md index 348833e..25146cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ ### NEXT_VERSION_DESCRIPTION_BEGIN ### NEXT_VERSION_DESCRIPTION_END +## [1.3.0] (22-12-2023) + +* Update payment method via Sber + ## [1.2.2] (29-09-2023) * Fix unnecessary_non_null_assertion warnings in test diff --git a/README.md b/README.md index c037e3d..5f94bdb 100644 --- a/README.md +++ b/README.md @@ -46,14 +46,16 @@ source 'https://git.yoomoney.ru/scm/sdk/cocoa-pod-specs.git' ``` -Решение проблем подключения: +## Решение проблем подключения/сборки -А. В случае когда `pod install` завершается с ошибкой – попробуйте команду `pod update YooKassaPayments` +1. pod install` завершается с ошибкой -B. В некоторых сложных случаях рекомендуем сбросить кэш cocoapods. Это можно сделать несколькими способам. +* Попробуйте команду `pod update YooKassaPayments` + +* В некоторых сложных случаях рекомендуем сбросить кэш cocoapods. Это можно сделать несколькими способам. Вариант 1: выполнить набор команд для сброса кэша для пода YooKassaPayments и его зависимостей: - ``` + ```bash pod cache clean FunctionalSwift --all pod cache clean MoneyAuth --all pod cache clean ThreatMetrixAdapter --all @@ -69,6 +71,11 @@ B. В некоторых сложных случаях рекомендуем с Далее рекомендуем выполнить `flutter clean`, `pod clean` и `pod deintegrate YOUR_PROJECT_NAME.xcodeproj` для последущей чистой установки командой `pod install` + +2. При сборке получили ошибку `xcode no such module '__ObjC'` + +* Откройте ios проект в Xcode, выберите target `Runner`, перейдите в найтройки Build Settings и выставьте флаг `Build Libraries for Distribution` в `NO`. Для project `Runner` проделайте тоже самое — Project Runner -> Build Settings -> установите Build Libraries for Distribution в NO. +Далее в Xcode Product -> Clean build folder.., и также очистите содержимое DerivedData ## Быстрая интеграция @@ -101,8 +108,10 @@ var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputD ```dart var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData); -var token = result.token; -var paymentMethodType = result.paymentMethodType; +if (result is SuccessTokenizationResult) { + var token = result.token; + var paymentMethodType = result.paymentMethodType; +} ``` 4. Закройте модуль SDK и отправьте токен в вашу систему. Затем [создайте платеж](https://yookassa.ru/developers/api#create_payment) по API ЮKassa, в параметре `payment_token` передайте токен, полученный в SDK. Способ подтверждения при создании платежа зависит от способа оплаты, который выбрал пользователь. Он приходит вместе с токеном в `paymentMethodType`. @@ -110,7 +119,10 @@ var paymentMethodType = result.paymentMethodType; 5. Подтверждение платежа. При необходимости система может запросить процесс подтверждения платежа, при котором пользователь подтверждает транзакцию с помощью сторонних сервисов. Плагин поддерживает два типа подтверждения платежа - 3Dsecure (при оплате банковской картой) и App2App сценарий (при оплате через SberPay). Ссылку вы получаете от бекенда Кассы после проведения платежа на шаге 4. ```dart -await YookassaPaymentsFlutter.confirmation("3ds / App2App ссылка", result.paymentMethodType); +var clientApplicationKey = "<Ключ для клиентских приложений>"; +var shopId = "<Идентификатор магазина в ЮKassa)>"; + +await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId); // обработайте результат подтверждения на следущей строке (после возврата управления) ``` Завершение процесса `YookassaPaymentsFlutter.confirmation` не несет информацию о том, что пользователь фактически подтвердил платеж (он мог его пропустить). После получения результата рекомендуем запросить статус платежа. @@ -122,8 +134,6 @@ await YookassaPaymentsFlutter.confirmation("3ds / App2App ссылка", result. `.yooMoney` — ЮMoney (платежи из кошелька или привязанной картой)\ `.bankCard` — банковская карта (карты можно сканировать)\ `.sberbank` — SberPay (с подтверждением через приложение Сбербанк Онлайн, если оно установленно, иначе с подтверждением по смс)\ -`.applePay` — Apple Pay\ -`.googlePay` — Google Pay `.sbp` - СБП\ ## Настройка способов оплаты @@ -153,16 +163,6 @@ if (<Условие для ЮMoney>) { paymentMethodTypes.add(PaymentMethod.yooMoney); } -if <Условие для Apple Pay> { - // Добавляем в paymentMethodTypes элемент `.applePay` - paymentMethodTypes.insert(.applePay) -} - -if <Условие для Google Pay> { - // Добавляем в paymentMethodTypes элемент `.googlePay` - paymentMethodTypes.insert(.googlePay) -} - if <Условие для СБП> { // Добавляем в paymentMethodTypes элемент `.sbp` paymentMethodTypes.insert(.sbp) @@ -437,8 +437,9 @@ android { ```dart var clientApplicationKey = "<Ключ для клиентских приложений>"; +var shopId = "<Идентификатор магазина в ЮKassa)>"; -await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey); +await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId); ) ``` `confirmationUrl` вы получите в ответе от API ЮKassa при [создании платежа](https://yookassa.ru/developers/api#create_payment); он имеет вид "https://qr.nspk.ru/id?type=&bank=&sum=&cur=&crc=&payment_id=" @@ -535,8 +536,8 @@ func didFinishConfirmation(paymentMethodType: PaymentMethodType) { ### Amount | Параметр | Тип | Описание | -| -------- | -------- | -------- | -| value | Double | Сумма платежа | +| -------- |----------| -------- | +| value | String | Сумма платежа | | currency | Currency | Валюта платежа | ### Currency @@ -566,12 +567,15 @@ func didFinishConfirmation(paymentMethodType: PaymentMethodType) { Если вы хотите использовать нашу реализацию подтверждения платежа, не закрывайте модуль SDK после получения токена.\ Отправьте токен на ваш сервер и после успешной оплаты закройте модуль.\ -Если ваш сервер сообщил о необходимости подтверждения платежа (т.е. платёж пришёл со статусом `pending`), вызовите метод `confirmation(confirmationUrl, paymentMethodType)`. +Если ваш сервер сообщил о необходимости подтверждения платежа (т.е. платёж пришёл со статусом `pending`), вызовите метод `confirmation(confirmationUrl, paymentMethodType, clientApplicationKey, shopId)`. Пример кода: ```dart -await YookassaPaymentsFlutter.confirmation(confirmationUrl, result.paymentMethodType); +var clientApplicationKey = "<Ключ для клиентских приложений>"; +var shopId = "<Идентификатор магазина в ЮKassa)>"; + +await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId); ) ``` @@ -582,8 +586,9 @@ await YookassaPaymentsFlutter.confirmation(confirmationUrl, result.paymentMethod ```dart var clientApplicationKey = "<Ключ для клиентских приложений>"; +var shopId = "<Идентификатор магазина в ЮKassa)>"; -await YookassaPaymentsFlutter.confirmation(confirmationUrl, result.paymentMethodType, clientApplicationKey); +await YookassaPaymentsFlutter.confirmation(confirmationUrl, result.paymentMethodType, clientApplicationKey, shopId); ) ``` `confirmationUrl` вы получите в ответе от API ЮKassa при [создании платежа](https://yookassa.ru/developers/api#create_payment); он имеет вид "https://qr.nspk.ru/id?type=&bank=&sum=&cur=&crc=&payment_id=" diff --git a/Sberpay via SberSDK.md b/Sberpay via SberSDK.md new file mode 100644 index 0000000..73806b8 --- /dev/null +++ b/Sberpay via SberSDK.md @@ -0,0 +1,229 @@ +# Проведение платежа через SberSDK + +Функциональность доступна ограниченному кругу наших клиентов, так как находится в тестировании. Чтобы попасть в число ранних пользователей необходимо связаться со своим менеджером и запросить доступ. + +- [Настройка оплаты через SberPay с нуля](#чистая-настройка) +- [Переход со старой версии SberPay](#переход-на-новую-версию) + +С помощью SDK можно провести и подтвердить платеж через актуальное приложение Сбербанка, если оно установленно, иначе с подтверждением по смс. + +## Настройка оплаты через SberPay с нуля + +(!) Далее описание настройки метода `SberPay`, если ранее вы его не использовали. + +В `TokenizationModuleInputData` необходимо передавать `applicationScheme` – схема для возврата в приложение после успешной оплаты с помощью `SberPay` в приложении Сбербанка. + +Пример `applicationScheme`: + +```dart +let tokenizationModuleInputData = TokenizationModuleInputData( + ... + applicationScheme: "examplescheme://" +``` + +## Чтобы провести платёж: + +### 1. При создании `TokenizationModuleInputData` передайте значение `PaymentMethod.sberbank` в `tokenizationSettings`. + +```dart +var tokenizationSettings = const TokenizationSettings(PaymentMethodTypes([ + PaymentMethod.sberbank +])); + +var tokenizationModuleInputData = + TokenizationModuleInputData(clientApplicationKey: "<Ключ для клиентских приложений>", + title: "Космические объекты", + subtitle: "Комета повышенной яркости, период обращения — 112 лет", + amount: Amount(value: 999.9, currency: Currency.rub), + shopId: "<Идентификатор магазина в ЮKassa)>", + savePaymentMethod: SavePaymentMethod.on, + tokenizationSettings: tokenizationSettings); +``` + +### 2. Запустите процесс токенизации, передав TokenizationModuleInputData + +```dart +var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData); +``` + +### 3. Получите токен + +```dart +var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData); +if (result is SuccessTokenizationResult) { + var token = result.token; + var paymentMethodType = result.paymentMethodType; +} else if (result is ErrorTokenizationResult) { + // обработайте ошибку +} +``` + +### 4. [Создайте платеж](https://yookassa.ru/developers/api#create_payment) с токеном по API ЮKassa. + +## Для подтверждения платежа через приложение Сбербанка: + +### 1. Добавьте уникальную схему диплинка + +Для **iOS** в `Info.plist` добавьте следующие строки: + +```plistbase +CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + ${BUNDLE_ID} + CFBundleURLSchemes + + examplescheme + + + +``` + +Для **android** в ваш файл build.gradle в блок android.defaultConfig добавьте строку + +``` +android { + defaultConfig { + resValue "string", "ym_app_scheme", "exampleapp" + } +} +``` +или добавить в ваш strings.xml строку вида: +``` + + exampleapp + +``` + +где `examplescheme` - схема для открытия вашего приложения, которую вы указали в `applicationScheme` при создании `TokenizationModuleInputData`. Через эту схему будет открываться ваше приложение после успешной оплаты с помощью `SberPay`. + +### 2. Для android подключите библиотеку профилирования формата .aar + +Попросите у менеджера по подключению библиотеку профилирования формата .aar. Создайте папку libs в модуле где подключаете sdk и добавьте туда файл aar-файл. В build.gradle того же модуля в dependencies добавьте: +```groovy +dependencies { + implementation fileTree(dir: "libs", include: ["*.aar"]) +} +``` + +### 3. Добавить в `Info.plist` новые схемы для обращения в сервисам Сбера + +``` +LSApplicationQueriesSchemes + + sbolidexternallogin + sberbankidexternallogin + +``` + +и расширенные настройки для http-соединений к сервисам Сбера + +``` +NSAppTransportSecurity + + NSExceptionDomains + + gate1.spaymentsplus.ru + + NSExceptionAllowsInsecureHTTPLoads + + + ift.gate2.spaymentsplus.ru + + NSExceptionAllowsInsecureHTTPLoads + + + cms-res.online.sberbank.ru + + NSExceptionAllowsInsecureHTTPLoads + + + + +``` + +### 4. Подтверждение платежа. При необходимости система может запросить процесс подтверждения платежа, при котором пользователь подтверждает транзакцию с помощью сервисов Сбера. Ссылку вы получаете от бекенда Кассы после проведения платежа на шаге 4. + +```dart +var clientApplicationKey = "<Ключ для клиентских приложений>"; +var shopId = "<Идентификатор магазина в ЮKassa)>"; + +await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId); +// обработайте результат подтверждения на следущей строке (после возврата управления) +``` +Завершение процесса `YookassaPaymentsFlutter.confirmation` не несет информацию о том, что пользователь фактически подтвердил платеж (он мог его пропустить). После получения результата рекомендуем запросить статус платежа. + + + +## Переход на новую версию SberPay + +(!) Далее описание настройки новой версии метода `SberPay`, если ранее вы его уже использовали. + +Сценарий оплаты через `Sberpay` теперь происходит не в мобильном приложения, а через встроенное Sber SDK. + +### Список изменений для android: + +Попросите у менеджера по подключению библиотеку формата `.aar`. + Создайте папку libs в модуле где подключаете sdk и добавьте туда файл `B.aar`. В build.gradle того же модуля в dependencies добавьте: +```groovy +dependencies { + implementation fileTree(dir: "libs", include: ["*.aar"]) +} +``` + +Также необходимо в метод `YookassaPaymentsFlutter.confirmation` передать параметр `clientApplicationKey` - ключ для клиентских приложений из личного кабинета ЮKassa ([раздел Настройки — Ключи API](https://yookassa.ru/my/api-keys-settings)); + +```dart +var clientApplicationKey = "<Ключ для клиентских приложений>"; +var shopId = "<Идентификатор магазина в ЮKassa)>"; + +await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId); +``` + +### Список изменений для iOS: + +1. В вашем файле `Info.plist` заменить схему для обращений в сервисам Сбера + +``` +LSApplicationQueriesSchemes + + sberpay + +``` +на обновленную версию +``` +LSApplicationQueriesSchemes + + sbolidexternallogin + sberbankidexternallogin + +``` + +2. Добавить расширенные настройки для http-соединений к сервисам Сбера + +``` +NSAppTransportSecurity + + NSExceptionDomains + + gate1.spaymentsplus.ru + + NSExceptionAllowsInsecureHTTPLoads + + + ift.gate2.spaymentsplus.ru + + NSExceptionAllowsInsecureHTTPLoads + + + cms-res.online.sberbank.ru + + NSExceptionAllowsInsecureHTTPLoads + + + + +``` diff --git a/android/build.gradle b/android/build.gradle index 2d29674..07f65cc 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,14 +1,14 @@ group 'ru.yoomoney.sdk.kassa.payments.flutter' buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.8.22' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' + classpath 'com.android.tools.build:gradle:7.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -52,5 +52,9 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'ru.yoomoney.sdk.kassa.payments:yookassa-android-sdk:6.7.1' + implementation 'ru.yoomoney.sdk.kassa.payments:yookassa-android-sdk:6.9.2' +} + +configurations.implementation { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 7645e29..0e9a610 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/YookassaPaymentsFlutterPlugin.kt b/android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/YookassaPaymentsFlutterPlugin.kt index 98dd7a4..65f963c 100644 --- a/android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/YookassaPaymentsFlutterPlugin.kt +++ b/android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/YookassaPaymentsFlutterPlugin.kt @@ -79,13 +79,15 @@ class YookassaPaymentsFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityA } val url = data["url"] as String - val clientApplicationKey = data["clientApplicationKey"] as String? + val clientApplicationKey = data["clientApplicationKey"] as String + val shopId = data["shopId"] as String val intent: Intent = Checkout.createConfirmationIntent( context = context, confirmationUrl = url, clientApplicationKey = clientApplicationKey, - paymentMethodType = paymentMethod + paymentMethodType = paymentMethod, + shopId = shopId ) activity.startActivityForResult(intent, REQUEST_CODE_CONFIRMATION) @@ -173,7 +175,7 @@ class YookassaPaymentsFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityA private fun PaymentParameters(data: Map): PaymentParameters { val amountMap: HashMap = data["amount"] as HashMap - val amount = Amount(BigDecimal(amountMap["value"] as Double), Currency.getInstance(amountMap["currency"] as String)) + val amount = Amount(BigDecimal(amountMap["value"] as String), Currency.getInstance(amountMap["currency"] as String)) val clientApplicationKey = data["clientApplicationKey"] as String val title = data["title"] as String @@ -242,7 +244,7 @@ private fun GooglePayParameters(data: Map): GooglePayParameters private fun SavedBankCardPaymentParameters(data: Map): SavedBankCardPaymentParameters { val amountMap: HashMap = data["amount"] as HashMap - val amount = Amount(BigDecimal(amountMap["value"] as Double), Currency.getInstance(amountMap["currency"] as String)) + val amount = Amount(BigDecimal(amountMap["value"] as String), Currency.getInstance(amountMap["currency"] as String)) val title = data["title"] as String val subtitle = data["subtitle"] as String val clientApplicationKey = data["clientApplicationKey"] as String diff --git a/example/android/build.gradle b/example/android/build.gradle index 9d58a21..38a0a82 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.5.0' + ext.kotlin_version = '1.8.22' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'com.android.tools.build:gradle:7.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 1ee18c7..e207186 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,11 +1,13 @@ PODS: - Flutter (1.0.0) - - FunctionalSwift (1.8.0) + - FunctionalSwift (2.0.6) - MobileSdk (2.0.0) - - MoneyAuth (6.1.0): - - FunctionalSwift (~> 1.8) - - YooMoneyCoreApi (~> 2.1) - - YooMoneyUI (~> 6.0) + - MoneyAuth (10.2.1): + - FunctionalSwift (~> 2.0) + - YooMoneyCoreApi (~> 3.0) + - YooMoneySessionProfiler (~> 5.0) + - YooMoneyUI (~> 7.0) + - SPaySDK (1.0.9) - YandexMobileMetrica/Dynamic (4.5.2): - YandexMobileMetrica/Dynamic/Core (= 4.5.2) - YandexMobileMetrica/Dynamic/Crashes (= 4.5.2) @@ -14,26 +16,27 @@ PODS: - YandexMobileMetrica/Dynamic/Core - yookassa_payments_flutter (0.0.1): - Flutter - - YooKassaPayments (= 6.12.0) - - YooKassaPayments (6.12.0): - - MoneyAuth (~> 6.1.0) + - YooKassaPayments (= 6.14.0) + - YooKassaPayments (6.14.0): + - MoneyAuth (~> 10.2.1) + - SPaySDK (~> 1.0.8) - YandexMobileMetrica/Dynamic (>= 3.0) - - YooKassaPaymentsApi (~> 2.20.1) + - YooKassaPaymentsApi (~> 2.21.2) - YooKassaWalletApi (~> 2.3.1) - - YooMoneyCoreApi (~> 2.1.0) + - YooMoneyCoreApi (~> 3.0) - YooMoneySessionProfiler (~> 5.0.1) - - YooMoneyUI (~> 6.2.0) - - YooKassaPaymentsApi (2.20.1): + - YooMoneyUI (~> 7.3.1) + - YooKassaPaymentsApi (2.21.3): - FunctionalSwift - - YooMoneyCoreApi (~> 2.1) + - YooMoneyCoreApi (~> 3.0) - YooKassaWalletApi (2.3.2): - FunctionalSwift - YooMoneyCoreApi - - YooMoneyCoreApi (2.1.0): - - FunctionalSwift (~> 1.8.0) + - YooMoneyCoreApi (3.0.7): + - FunctionalSwift (~> 2.0) - YooMoneySessionProfiler (5.0.1): - MobileSdk (~> 2.0) - - YooMoneyUI (6.2.0): + - YooMoneyUI (7.3.2): - FunctionalSwift DEPENDENCIES: @@ -52,6 +55,7 @@ SPEC REPOS: - YooMoneySessionProfiler - YooMoneyUI https://github.com/CocoaPods/Specs.git: + - SPaySDK - YandexMobileMetrica EXTERNAL SOURCES: @@ -62,18 +66,19 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - FunctionalSwift: b65b0a7ddde7f11a11e794f79a1e8009724ed0bd + FunctionalSwift: f812f61d24f78fdac9fb361f26c7f21acc337c91 MobileSdk: 827ec8a9ef58a60f35e920cebaecf74f20a250c4 - MoneyAuth: dedc9545fa857e7b489333e92403fe608585e518 + MoneyAuth: 47daad5ba74241b1a8ebae3b0ea4eb6600867939 + SPaySDK: 1015f868b6e9255457704cd6a3d051829263661a YandexMobileMetrica: f5368ee93f286c793d73b58da00929babfc897c1 - yookassa_payments_flutter: 9c4a1c019f2b042ebbd0b45fe19380054240d70a - YooKassaPayments: 09f7cb2b3562130aed01d75bba653a8f0d96d9f6 - YooKassaPaymentsApi: d198a1da65988af52bd408d5d5d1c8cd93f039a2 + yookassa_payments_flutter: 7c9be9ba6fdae53b98b2e715a3d80d42e2bdd8ff + YooKassaPayments: 854eed87863761c6e9c164ece203f125e1bffb64 + YooKassaPaymentsApi: b6172fa43e58e79ad730c3ccc2692471cee6ea9c YooKassaWalletApi: cbb352525bfe89fd2ad52635062f79f8bbbc23ec - YooMoneyCoreApi: ddf9ea035b9a3f8d0563b4da8e55652fa07040d3 + YooMoneyCoreApi: 0e5c123a9c981ea2384b86986d3ba64a096431f9 YooMoneySessionProfiler: 1a19bed99feca98c04e2a906908f91a7d5db408d - YooMoneyUI: 01f293ed3486e00c5244a5feded457e7cdc18074 + YooMoneyUI: 94078f98dc65bee756c215a14fbf70ad3469f289 PODFILE CHECKSUM: 6abfb72a0d401d5c53824cfe614a85f37a1a3040 -COCOAPODS: 1.11.3 +COCOAPODS: 1.14.2 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 7814c42..1581a6e 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -407,7 +407,7 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -431,7 +431,7 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 90605ac..1d58e96 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -28,6 +28,11 @@ LaunchScreen UIMainStoryboardFile Main + LSApplicationQueriesSchemes + + yoomoneyauth + sberpay + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/example/lib/success_tokenization_screen.dart b/example/lib/success_tokenization_screen.dart index b484837..561c273 100644 --- a/example/lib/success_tokenization_screen.dart +++ b/example/lib/success_tokenization_screen.dart @@ -55,9 +55,14 @@ class _SuccessTokenizationScreenState extends State { ), ElevatedButton( onPressed: () async { + var shopId = "<Идентификатор магазина в ЮKassa>"; var clientApplicationKey = "<Ключ для клиентских приложений>"; await YookassaPaymentsFlutter.confirmation( - controller.text, result.paymentMethodType, clientApplicationKey); + controller.text, + result.paymentMethodType, + clientApplicationKey, + shopId + ); showDialog( context: context, builder: (context) => const AlertDialog( diff --git a/example/lib/tokenization_screen.dart b/example/lib/tokenization_screen.dart index 7bf99ab..d935f44 100644 --- a/example/lib/tokenization_screen.dart +++ b/example/lib/tokenization_screen.dart @@ -45,8 +45,7 @@ class TokenizationScreenState extends State { void startTokenization() async { var clientApplicationKey = "<Ключ для клиентских приложений>"; - var amount = - Amount(value: double.parse(controller.text), currency: Currency.rub); + var amount = Amount(value: controller.text, currency: Currency.rub); var moneyAuthClientId = ""; var shopId = "<Идентификатор магазина в ЮKassa>"; var applicationScheme = "<Схема вашего приложения для deeplink>" "://"; diff --git a/example/pubspec.lock b/example/pubspec.lock index 3ab698c..9291d44 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,58 +5,58 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.3.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.18.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: "1989d917fbe8e6b39806207df5a3fdd3d816cbd090fac2ce26fb45e9a71476e5" + url: "https://pub.dev" source: hosted version: "1.0.4" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -66,7 +66,8 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + url: "https://pub.dev" source: hosted version: "1.0.4" flutter_test: @@ -78,37 +79,42 @@ packages: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.5.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.10.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.8.3" sky_engine: dependency: transitive description: flutter @@ -118,65 +124,73 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.6.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" yookassa_payments_flutter: dependency: "direct main" description: path: ".." relative: true source: path - version: "1.0.5" + version: "1.2.2" sdks: - dart: ">=2.15.0 <3.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=2.10.5" diff --git a/ios/Classes/SwiftYookassaPaymentsFlutterPlugin.swift b/ios/Classes/SwiftYookassaPaymentsFlutterPlugin.swift index fdc5f47..1c2fad0 100644 --- a/ios/Classes/SwiftYookassaPaymentsFlutterPlugin.swift +++ b/ios/Classes/SwiftYookassaPaymentsFlutterPlugin.swift @@ -201,6 +201,7 @@ extension TokenizationModuleInputData: Decodable { enum CodingKeys: String, CodingKey { case clientApplicationKey = "clientApplicationKey" case shopName = "title" + case shopId = "shopId" case purchaseDescription = "subtitle" case amount = "amount" case savePaymentMethod = "savePaymentMethod" @@ -223,6 +224,7 @@ extension TokenizationModuleInputData: Decodable { let clientApplicationKey = try values.decode(String.self, forKey: .clientApplicationKey) let shopName = try values.decode(String.self, forKey: .shopName) + let shopId = try values.decode(String.self, forKey: .shopId) let purchaseDescription = try values.decode(String.self, forKey: .purchaseDescription) let amount = try values.decode(Amount.self, forKey: .amount) let gatewayId = try? values.decode(String.self, forKey: .gatewayId) @@ -258,6 +260,7 @@ extension TokenizationModuleInputData: Decodable { self.init( clientApplicationKey: clientApplicationKey, shopName: shopName, + shopId: shopId, purchaseDescription: purchaseDescription, amount: amount, gatewayId: gatewayId, @@ -343,9 +346,10 @@ extension Amount: Decodable { public init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - let value = try values.decode(Double.self, forKey: .value) + let stringValue = try values.decode(String.self, forKey: .value) + guard let decimalValue = Decimal(string: stringValue) else { throw CommonError.decodingError } let currency = try values.decode(String.self, forKey: .currency) - self.init(value: Decimal(value), currency: .custom(currency)) + self.init(value: decimalValue, currency: .custom(currency)) } } @@ -428,6 +432,10 @@ extension CustomizationSettings: Decodable { } } +public enum CommonError: Error { + case decodingError +} + struct Color: Decodable { let red: CGFloat diff --git a/ios/yookassa_payments_flutter.podspec b/ios/yookassa_payments_flutter.podspec index 783c611..f07f080 100644 --- a/ios/yookassa_payments_flutter.podspec +++ b/ios/yookassa_payments_flutter.podspec @@ -11,7 +11,7 @@ Flutter SDK from yoomoney s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'YooKassaPayments', '6.12.3' + s.dependency 'YooKassaPayments', '6.14.0' s.platform = :ios, '10.0' diff --git a/lib/input_data/saved_card_module_input_data.dart b/lib/input_data/saved_card_module_input_data.dart index 5c89ec6..81e5819 100644 --- a/lib/input_data/saved_card_module_input_data.dart +++ b/lib/input_data/saved_card_module_input_data.dart @@ -20,7 +20,6 @@ class SavedBankCardModuleInputData { String? customerId; bool isSafeDeal; HostParameters? hostParameters; - String? applePayID; SavedBankCardModuleInputData( {required this.clientApplicationKey, @@ -37,8 +36,7 @@ class SavedBankCardModuleInputData { this.isLoggingEnabled = false, this.customizationSettings = const CustomizationSettings(), this.customerId, - this.hostParameters, - this.applePayID}); + this.hostParameters}); Map toJson() => { 'clientApplicationKey': clientApplicationKey, @@ -48,7 +46,6 @@ class SavedBankCardModuleInputData { 'savePaymentMethod': savePaymentMethod.toString(), 'gatewayId': gatewayId, 'testModeSettings': testModeSettings?.toJson(), - 'applePayMerchantIdentifier': applePayID, 'shopId': shopId, 'returnUrl': returnUrl, 'isLoggingEnabled': isLoggingEnabled, diff --git a/lib/input_data/tokenization_module_input_data.dart b/lib/input_data/tokenization_module_input_data.dart index 8668751..95ef1d2 100644 --- a/lib/input_data/tokenization_module_input_data.dart +++ b/lib/input_data/tokenization_module_input_data.dart @@ -26,7 +26,6 @@ class TokenizationModuleInputData { String? customerId; GooglePayParameters googlePayParameters; bool googlePayTestEnvironment; - String? applePayID; TokenizationModuleInputData( {required this.clientApplicationKey, @@ -47,8 +46,7 @@ class TokenizationModuleInputData { this.applicationScheme, this.customerId, this.googlePayParameters = const GooglePayParameters(), - this.googlePayTestEnvironment = false, - this.applePayID}); + this.googlePayTestEnvironment = false}); Map toJson() => { 'clientApplicationKey': clientApplicationKey, @@ -60,7 +58,6 @@ class TokenizationModuleInputData { 'gatewayId': gatewayId, 'tokenizationSettings': tokenizationSettings.toJson(), 'testModeSettings': testModeSettings?.toJson(), - 'applePayMerchantIdentifier': applePayID, 'shopId': shopId, 'returnUrl': returnUrl, 'isLoggingEnabled': isLoggingEnabled, diff --git a/lib/models/amount.dart b/lib/models/amount.dart index 03f6822..4b0dcc1 100644 --- a/lib/models/amount.dart +++ b/lib/models/amount.dart @@ -1,7 +1,7 @@ import 'currency.dart'; class Amount { - double value; + String value; Currency currency; Amount({required this.value, required this.currency}); diff --git a/lib/models/payment_method_types.dart b/lib/models/payment_method_types.dart index c704657..681bbcb 100644 --- a/lib/models/payment_method_types.dart +++ b/lib/models/payment_method_types.dart @@ -12,18 +12,12 @@ class PaymentMethodTypes { PaymentMethodTypes([PaymentMethod.yooMoney]); static const PaymentMethodTypes sberbank = PaymentMethodTypes([PaymentMethod.sberbank]); - static const PaymentMethodTypes applePay = - PaymentMethodTypes([PaymentMethod.applePay]); - static const PaymentMethodTypes googlePay = - PaymentMethodTypes([PaymentMethod.googlePay]); static const PaymentMethodTypes sbp = PaymentMethodTypes([PaymentMethod.sbp]); static const PaymentMethodTypes all = PaymentMethodTypes([ PaymentMethod.bankCard, PaymentMethod.yooMoney, PaymentMethod.sberbank, - PaymentMethod.applePay, - PaymentMethod.googlePay, PaymentMethod.sbp ]); } @@ -39,10 +33,6 @@ extension PaymentMethodExtension on PaymentMethod { return PaymentMethod.yooMoney; case 'sberbank': return PaymentMethod.sberbank; - case 'apple_pay': - return PaymentMethod.applePay; - case 'google_pay': - return PaymentMethod.googlePay; case 'sbp': return PaymentMethod.sbp; } diff --git a/lib/yookassa_payments_flutter.dart b/lib/yookassa_payments_flutter.dart index 74d6f43..35a2738 100644 --- a/lib/yookassa_payments_flutter.dart +++ b/lib/yookassa_payments_flutter.dart @@ -29,9 +29,14 @@ class YookassaPaymentsFlutter { .then((value) => TokenizationResult.fromJson(json.decode(value))); } - static Future confirmation( - String url, PaymentMethod? paymentMethod, String? clientApplicationKey) async { - var inputData = {'url': url, 'paymentMethod': paymentMethod?.name, 'clientApplicationKey': clientApplicationKey}; + static Future confirmation(String url, PaymentMethod? paymentMethod, + String? clientApplicationKey, String? shopId) async { + var inputData = { + 'url': url, + 'paymentMethod': paymentMethod?.name, + 'clientApplicationKey': clientApplicationKey, + 'shopId': shopId + }; return await _channel.invokeMethod('confirmation', inputData); } diff --git a/pubspec.yaml b/pubspec.yaml index fa75d56..1895cc8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: yookassa_payments_flutter description: This Flutter SDK allows processing payments using a payment token. It works as an addition to the YooMoney API. -version: 1.2.2 +version: 1.3.0 homepage: https://git.yoomoney.ru/projects/SDK/repos/yookassa-payments-flutter-sdk/browse repository: https://git.yoomoney.ru/projects/SDK/repos/yookassa-payments-flutter-sdk/browse environment: