diff --git a/example/.gitignore b/example/.gitignore
index 1398e16..704b71a 100644
--- a/example/.gitignore
+++ b/example/.gitignore
@@ -62,6 +62,7 @@
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
+**/ios/Flutter/ephemeral/
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index ac5ef62..b2d77a7 100644
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -30,6 +30,7 @@ plugins {
android {
namespace = "jp.pay.flutter.example"
compileSdk = flutter.compileSdkVersion
+ ndkVersion = "28.2.13676358"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
diff --git a/example/android/settings.gradle b/example/android/settings.gradle
index 0de876d..7467354 100644
--- a/example/android/settings.gradle
+++ b/example/android/settings.gradle
@@ -42,7 +42,7 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version '8.6.0' apply false
- id "org.jetbrains.kotlin.android" version "1.8.22" apply false
+ id "org.jetbrains.kotlin.android" version "2.1.0" apply false
}
include ":app"
diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist
index 8c6e561..d57061d 100644
--- a/example/ios/Flutter/AppFrameworkInfo.plist
+++ b/example/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 12.0
+ 13.0
diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec
index 98e1633..3aed58d 100644
--- a/example/ios/Flutter/Flutter.podspec
+++ b/example/ios/Flutter/Flutter.podspec
@@ -11,7 +11,7 @@ Pod::Spec.new do |s|
s.license = { :type => 'BSD' }
s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }
- s.ios.deployment_target = '12.0'
+ s.ios.deployment_target = '13.0'
# Framework linking is handled by Flutter tooling, not CocoaPods.
# Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs.
s.vendored_frameworks = 'path/to/nothing'
diff --git a/example/ios/Podfile b/example/ios/Podfile
index 2c068c4..10f3c9b 100644
--- a/example/ios/Podfile
+++ b/example/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-platform :ios, '12.0'
+platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index 15efdab..65ccd17 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -23,7 +23,7 @@ PODS:
- GoogleUtilities/Privacy
- integration_test (0.0.1):
- Flutter
- - payjp_flutter (0.7.5):
+ - payjp_flutter (0.7.7):
- Flutter
- GoogleUtilities/AppDelegateSwizzler (~> 8)
- PAYJPFlutterCore (~> 2.2.1)
@@ -56,13 +56,13 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/payjp_flutter/ios"
SPEC CHECKSUMS:
- Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
- integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
- payjp_flutter: 5cf15ae9f966154eb37d036e9960c18f16da02a8
+ integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
+ payjp_flutter: 2787fdc0395d0e7eed14b0d94073e662cc11381c
PAYJPFlutterCore: 23ef3f4e66075b0069b9dbca495b1fa488ee8f5d
PhoneNumberKit: a74155066daa6450475f6a029068eb919fb00d5d
-PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048
+PODFILE CHECKSUM: cc1f88378b4bfcf93a6ce00d2c587857c6008d3b
COCOAPODS: 1.16.2
diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 4f74653..fc5ae03 100644
--- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -26,6 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
@@ -45,6 +46,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift
index 793cbed..5742eac 100644
--- a/example/ios/Runner/AppDelegate.swift
+++ b/example/ios/Runner/AppDelegate.swift
@@ -2,12 +2,15 @@ import UIKit
import Flutter
@main
-@objc class AppDelegate: FlutterAppDelegate {
+@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
+
+ func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {
+ GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
+ }
}
diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist
index cbd7f5f..a2cb74f 100644
--- a/example/ios/Runner/Info.plist
+++ b/example/ios/Runner/Info.plist
@@ -60,5 +60,26 @@
UIApplicationSupportsIndirectInputEvents
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneClassName
+ UIWindowScene
+ UISceneDelegateClassName
+ FlutterSceneDelegate
+ UISceneConfigurationName
+ flutter
+ UISceneStoryboardFile
+ Main
+
+
+
+
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 605862b..f4900ad 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -20,9 +20,7 @@ const String payjpPublicKey = "pk_test_0383a1b8f91e8a6e3ea0e2a9";
const String appleMerchantId =
'merchant.jp.pay.example2'; // TODO: REPLACE WITH YOUR APPLE MERCHANT ID
-void main() => runApp(MaterialApp(
- home: HomeScreen(),
- ));
+void main() => runApp(MaterialApp(home: HomeScreen()));
class HomeScreen extends StatefulWidget {
@override
@@ -43,10 +41,13 @@ class HomeScreenState extends State {
Future _initPayjp() async {
await Payjp.init(
- publicKey: payjpPublicKey,
- debugEnabled: true,
- threeDSecureRedirect: PayjpThreeDSecureRedirect(
- url: 'jp.pay.example://tds/finish', key: 'mobileapp'));
+ publicKey: payjpPublicKey,
+ debugEnabled: true,
+ threeDSecureRedirect: PayjpThreeDSecureRedirect(
+ url: 'jp.pay.example://tds/finish',
+ key: 'mobileapp',
+ ),
+ );
var isApplePayAvailable = false;
if (Platform.isIOS) {
await Payjp.setIOSCardFormStyle(
@@ -65,68 +66,77 @@ class HomeScreenState extends State {
void _showSheetToStartCardForm({required CardFormType formType}) {
showModalBottomSheet(
- context: context,
- builder: (context) => ListView(
- shrinkWrap: true,
- children: [
- ListTile(
- title: Text('Email And Phone'),
- onTap: () {
- Navigator.pop(context);
- _onStartCardForm(formType: formType, extraAttributes: [
- ExtraAttributeEmail(),
- ExtraAttributePhone()
- ]);
- },
- ),
- ListTile(
- title: Text('Email'),
- onTap: () {
- Navigator.pop(context);
- _onStartCardForm(
- formType: formType,
- extraAttributes: [ExtraAttributeEmail()]);
- },
- ),
- ListTile(
- title: Text('Phone'),
- onTap: () {
- Navigator.pop(context);
- _onStartCardForm(
- formType: formType,
- extraAttributes: [ExtraAttributePhone()]);
- },
- ),
- ListTile(
- title: Text('Email And Phone (Preset)'),
- onTap: () {
- Navigator.pop(context);
- _onStartCardForm(formType: formType, extraAttributes: [
- ExtraAttributeEmail("test@example.com"),
- ExtraAttributePhone("JP", "09012345678")
- ]);
- },
- ),
- ListTile(
- title: Text('None'),
- onTap: () {
- Navigator.pop(context);
- _onStartCardForm(formType: formType, extraAttributes: []);
- },
- ),
- ],
- ));
+ context: context,
+ builder: (context) => ListView(
+ shrinkWrap: true,
+ children: [
+ ListTile(
+ title: Text('Email And Phone'),
+ onTap: () {
+ Navigator.pop(context);
+ _onStartCardForm(
+ formType: formType,
+ extraAttributes: [ExtraAttributeEmail(), ExtraAttributePhone()],
+ );
+ },
+ ),
+ ListTile(
+ title: Text('Email'),
+ onTap: () {
+ Navigator.pop(context);
+ _onStartCardForm(
+ formType: formType,
+ extraAttributes: [ExtraAttributeEmail()],
+ );
+ },
+ ),
+ ListTile(
+ title: Text('Phone'),
+ onTap: () {
+ Navigator.pop(context);
+ _onStartCardForm(
+ formType: formType,
+ extraAttributes: [ExtraAttributePhone()],
+ );
+ },
+ ),
+ ListTile(
+ title: Text('Email And Phone (Preset)'),
+ onTap: () {
+ Navigator.pop(context);
+ _onStartCardForm(
+ formType: formType,
+ extraAttributes: [
+ ExtraAttributeEmail("test@example.com"),
+ ExtraAttributePhone("JP", "09012345678"),
+ ],
+ );
+ },
+ ),
+ ListTile(
+ title: Text('None'),
+ onTap: () {
+ Navigator.pop(context);
+ _onStartCardForm(formType: formType, extraAttributes: []);
+ },
+ ),
+ ],
+ ),
+ );
}
- void _onStartCardForm(
- {required CardFormType formType,
- required List extraAttributes}) async {
+ void _onStartCardForm({
+ required CardFormType formType,
+ required List extraAttributes,
+ }) async {
await Payjp.startCardForm(
- onCardFormCanceledCallback: _onCardFormCanceled,
- onCardFormCompletedCallback: _onCardFormCompleted,
- onCardFormProducedTokenCallback: _onCardFormProducedToken,
- cardFormType: formType,
- extraAttributes: extraAttributes);
+ onCardFormCanceledCallback: _onCardFormCanceled,
+ onCardFormCompletedCallback: _onCardFormCompleted,
+ onCardFormProducedTokenCallback: _onCardFormProducedToken,
+ cardFormType: formType,
+ extraAttributes: extraAttributes,
+ useThreeDSecure: true,
+ );
}
void _onStartApplePay() async {
@@ -150,9 +160,10 @@ class HomeScreenState extends State {
void _onCardFormCompleted() {
print('_onCardFormCompleted');
showAlertDialog(
- context: HomeScreen.scaffoldKey.currentContext!,
- title: 'カード登録',
- message: 'カードを登録しました。');
+ context: HomeScreen.scaffoldKey.currentContext!,
+ title: 'カード登録',
+ message: 'カードを登録しました。',
+ );
}
FutureOr _onCardFormProducedToken(Token token) async {
@@ -168,7 +179,8 @@ class HomeScreenState extends State {
FutureOr _onApplePayProducedToken(Token token) async {
print('_onApplePayProducedToken');
if (backendUrl.isEmpty) {
- final message = """
+ final message =
+ """
`backendUrl` is not replaced yet.
You can send token(${token.id}) to your own server to make Customer etc.
""";
@@ -184,7 +196,8 @@ You can send token(${token.id}) to your own server to make Customer etc.
}
FutureOr _onApplePayFailedRequestToken(
- ErrorInfo errorInfo) async {
+ ErrorInfo errorInfo,
+ ) async {
print('_onApplePayFailedRequestToken');
print('errorCode ${errorInfo.errorCode}');
print('errorMessage ${errorInfo.errorMessage}');
@@ -197,44 +210,49 @@ You can send token(${token.id}) to your own server to make Customer etc.
@override
Widget build(BuildContext context) => MaterialApp(
- home: Scaffold(
- key: HomeScreen.scaffoldKey,
- appBar: AppBar(
- title: const Text('PAY.JP Flutter Plugin Sample'),
- ),
- body: _isLoading
- ? Center(child: CircularProgressIndicator())
- : ListView(
- children: [
- material.Card(
- child: ListTile(
- title: Text('CardForm Sample (MultiLine)'),
- subtitle: Text('Tap here to start card form.'),
- onTap: () {
- _showSheetToStartCardForm(
- formType: CardFormType.multiLine);
- },
- )),
- material.Card(
- child: ListTile(
- title: Text('CardForm Sample (CardDisplay)'),
- subtitle: Text('Tap here to start card form.'),
- onTap: () {
- _showSheetToStartCardForm(
- formType: CardFormType.cardDisplay);
- },
- )),
- material.Card(
- child: ListTile(
- title: Text('Start ApplePay Sample (iOS only)'),
- subtitle: Text(_canUseApplePay
+ home: Scaffold(
+ key: HomeScreen.scaffoldKey,
+ appBar: AppBar(title: const Text('PAY.JP Flutter Plugin Sample')),
+ body: _isLoading
+ ? Center(child: CircularProgressIndicator())
+ : ListView(
+ children: [
+ material.Card(
+ child: ListTile(
+ title: Text('CardForm Sample (MultiLine)'),
+ subtitle: Text('Tap here to start card form.'),
+ onTap: () {
+ _showSheetToStartCardForm(
+ formType: CardFormType.multiLine,
+ );
+ },
+ ),
+ ),
+ material.Card(
+ child: ListTile(
+ title: Text('CardForm Sample (CardDisplay)'),
+ subtitle: Text('Tap here to start card form.'),
+ onTap: () {
+ _showSheetToStartCardForm(
+ formType: CardFormType.cardDisplay,
+ );
+ },
+ ),
+ ),
+ material.Card(
+ child: ListTile(
+ title: Text('Start ApplePay Sample (iOS only)'),
+ subtitle: Text(
+ _canUseApplePay
? 'Sample payment with Apple Pay.'
- : 'This device is not supported.'),
- enabled: _canUseApplePay,
- onTap: _onStartApplePay,
- )),
- ],
+ : 'This device is not supported.',
+ ),
+ enabled: _canUseApplePay,
+ onTap: _onStartApplePay,
+ ),
),
- ),
- );
+ ],
+ ),
+ ),
+ );
}
diff --git a/example/lib/sample_backend_service.dart b/example/lib/sample_backend_service.dart
index d223292..f1fb632 100644
--- a/example/lib/sample_backend_service.dart
+++ b/example/lib/sample_backend_service.dart
@@ -29,7 +29,8 @@ class ApiException implements Exception {
Future saveCard(Token token) async {
if (backendUrl.isEmpty) {
- final message = """
+ final message =
+ """
`backendUrl` is not replaced yet.
You can send token(${token.id}) to your own server to make Customer etc.
""";
diff --git a/example/lib/widgets/alert_dialog.dart b/example/lib/widgets/alert_dialog.dart
index 8c8ba40..a07c66e 100644
--- a/example/lib/widgets/alert_dialog.dart
+++ b/example/lib/widgets/alert_dialog.dart
@@ -9,42 +9,43 @@ import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
-Future showAlertDialog(
- {required BuildContext context,
- required String title,
- required String message,
- String button = "OK"}) {
+Future showAlertDialog({
+ required BuildContext context,
+ required String title,
+ required String message,
+ String button = "OK",
+}) {
final titleText = Text(title);
- final content = SingleChildScrollView(
- child: Text(message),
- );
+ final content = SingleChildScrollView(child: Text(message));
final buttonText = Text(button);
if (Platform.isIOS) {
return showCupertinoDialog(
- context: context,
- builder: (context) => CupertinoAlertDialog(
- title: titleText,
- content: content,
- actions: [
- CupertinoDialogAction(
- child: buttonText,
- onPressed: () => Navigator.of(context).pop(),
- )
- ],
- ));
+ context: context,
+ builder: (context) => CupertinoAlertDialog(
+ title: titleText,
+ content: content,
+ actions: [
+ CupertinoDialogAction(
+ child: buttonText,
+ onPressed: () => Navigator.of(context).pop(),
+ ),
+ ],
+ ),
+ );
} else {
return showDialog(
- context: context,
- barrierDismissible: true,
- builder: (context) => AlertDialog(
- title: titleText,
- content: content,
- actions: [
- TextButton(
- child: buttonText,
- onPressed: () => Navigator.of(context).pop(),
- ),
- ],
- ));
+ context: context,
+ barrierDismissible: true,
+ builder: (context) => AlertDialog(
+ title: titleText,
+ content: content,
+ actions: [
+ TextButton(
+ child: buttonText,
+ onPressed: () => Navigator.of(context).pop(),
+ ),
+ ],
+ ),
+ );
}
}
diff --git a/example/pubspec.lock b/example/pubspec.lock
index 2024c3e..167b345 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -69,10 +69,10 @@ packages:
dependency: transitive
description:
name: fake_async
- sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
+ sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
- version: "1.3.2"
+ version: "1.3.3"
file:
dependency: transitive
description:
@@ -134,26 +134,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
+ sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
- version: "10.0.8"
+ version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+ sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
- version: "3.0.9"
+ version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
- sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+ sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
- version: "3.0.1"
+ version: "3.0.2"
matcher:
dependency: transitive
description:
@@ -174,10 +174,10 @@ packages:
dependency: transitive
description:
name: meta
- sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
- version: "1.16.0"
+ version: "1.17.0"
path:
dependency: transitive
description:
@@ -266,10 +266,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
+ sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev"
source: hosted
- version: "0.7.4"
+ version: "0.7.7"
typed_data:
dependency: transitive
description:
@@ -282,10 +282,10 @@ packages:
dependency: transitive
description:
name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
- version: "2.1.4"
+ version: "2.2.0"
vm_service:
dependency: transitive
description:
@@ -311,5 +311,5 @@ packages:
source: hosted
version: "3.0.4"
sdks:
- dart: ">=3.7.0-0 <4.0.0"
- flutter: ">=3.18.0-18.0.pre.54"
+ dart: ">=3.10.0 <4.0.0"
+ flutter: ">=3.38.1"
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index 4590d7e..392d198 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -3,7 +3,7 @@ description: Demonstrates how to use the payjp_flutter plugin.
publish_to: 'none'
environment:
- sdk: '>=2.15.0 <4.0.0'
+ sdk: '>=3.10.0 <4.0.0'
dependencies:
flutter:
diff --git a/ios/Classes/SwiftPayjpFlutterPlugin.swift b/ios/Classes/SwiftPayjpFlutterPlugin.swift
index f03937e..ca574b6 100644
--- a/ios/Classes/SwiftPayjpFlutterPlugin.swift
+++ b/ios/Classes/SwiftPayjpFlutterPlugin.swift
@@ -7,6 +7,7 @@ public class SwiftPayjpFlutterPlugin: NSObject, FlutterPlugin {
let channel = FlutterMethodChannel(name: "payjp", binaryMessenger: registrar.messenger())
let instance = SwiftPayjpFlutterPlugin(channel: channel)
registrar.addMethodCallDelegate(instance, channel: channel)
+ registrar.addSceneDelegate(instance)
}
private let channel: FlutterMethodChannel
private let cardFormModule: CardFormModuleType
@@ -159,3 +160,17 @@ public class SwiftPayjpFlutterPlugin: NSObject, FlutterPlugin {
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
+
+@available(iOS 13.0, *)
+extension SwiftPayjpFlutterPlugin: FlutterSceneLifeCycleDelegate {
+ public func scene(_ scene: UIScene, openURLContexts URLContexts: Set) -> Bool {
+ var handled = false
+ for context in URLContexts {
+ if ThreeDSecureProcessHandler.shared.completeThreeDSecureProcess(url: context.url) {
+ handled = true
+ break
+ }
+ }
+ return handled
+ }
+}
diff --git a/lib/src/card.dart b/lib/src/card.dart
index ae63992..3d69ace 100644
--- a/lib/src/card.dart
+++ b/lib/src/card.dart
@@ -141,145 +141,236 @@ class _$CardSerializer implements StructuredSerializer {
final String wireName = r'Card';
@override
- Iterable