From e804908622a015927d837b06ea18ca8429f22014 Mon Sep 17 00:00:00 2001 From: Jaime Blasco Date: Tue, 9 Mar 2021 09:12:34 +0100 Subject: [PATCH 1/4] Add poc projects --- .gitignore | 7 + .vscode/launch.json | 15 + stripe/.gitignore | 7 + stripe/.idea/libraries/Dart_SDK.xml | 19 + stripe/.idea/modules.xml | 10 + .../example_lib_main_dart.xml | 6 + stripe/.idea/workspace.xml | 45 + stripe/.metadata | 10 + stripe/CHANGELOG.md | 3 + stripe/LICENSE | 1 + stripe/README.md | 18 + stripe/example/.gitignore | 46 + stripe/example/.metadata | 10 + stripe/example/README.md | 16 + stripe/example/android/.gitignore | 11 + stripe/example/android/.project | 28 + .../org.eclipse.buildship.core.prefs | 13 + stripe/example/android/app/.classpath | 6 + stripe/example/android/app/.project | 34 + .../org.eclipse.buildship.core.prefs | 2 + stripe/example/android/app/build.gradle | 59 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/MainActivity.kt | 6 + .../flutter/stripe/example/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + stripe/example/android/build.gradle | 31 + stripe/example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + stripe/example/android/settings.gradle | 11 + stripe/example/ios/.gitignore | 32 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + stripe/example/ios/Flutter/Debug.xcconfig | 2 + stripe/example/ios/Flutter/Release.xcconfig | 2 + stripe/example/ios/Podfile | 43 + stripe/example/ios/Podfile.lock | 42 + .../ios/Runner.xcodeproj/project.pbxproj | 554 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + stripe/example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + stripe/example/ios/Runner/Info.plist | 48 + .../ios/Runner/Runner-Bridging-Header.h | 1 + stripe/example/lib/main.dart | 217 ++++ stripe/example/macos/.gitignore | 6 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + stripe/example/macos/Podfile | 40 + stripe/example/macos/Podfile.lock | 16 + .../macos/Runner.xcodeproj/project.pbxproj | 614 ++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 89 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + stripe/example/macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 +++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + stripe/example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + stripe/example/pubspec.lock | 302 ++++++ stripe/example/pubspec.yaml | 69 ++ stripe/example/test/widget_test.dart | 27 + stripe/example/web/favicon.png | Bin 0 -> 917 bytes stripe/example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes stripe/example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes stripe/example/web/index.html | 46 + stripe/example/web/manifest.json | 23 + stripe/lib/src/apple_pay_button.dart | 160 +++ stripe/lib/src/stripe.dart | 271 +++++ stripe/lib/src/widgets/card_field.dart | 161 +++ stripe/lib/stripe.dart | 4 + stripe/pubspec.lock | 175 ++++ stripe/pubspec.yaml | 25 + stripe/stripe.iml | 19 + stripe/test/stripe_test.dart | 7 + stripe_ios/.flutter-plugins | 2 + stripe_ios/.flutter-plugins-dependencies | 1 + stripe_ios/.gitignore | 7 + stripe_ios/.idea/libraries/Dart_SDK.xml | 19 + stripe_ios/.idea/modules.xml | 10 + .../example_lib_main_dart.xml | 6 + stripe_ios/.idea/workspace.xml | 45 + stripe_ios/.metadata | 10 + stripe_ios/CHANGELOG.md | 3 + stripe_ios/LICENSE | 1 + stripe_ios/README.md | 15 + stripe_ios/ios/.gitignore | 37 + stripe_ios/ios/Assets/.gitkeep | 0 .../ios/Classes/ApplePayButtonView.swift | 174 ++++ stripe_ios/ios/Classes/CardFieldView.swift | 335 +++++++ stripe_ios/ios/Classes/Errors.swift | 36 + stripe_ios/ios/Classes/Mappers.swift | 507 ++++++++++ stripe_ios/ios/Classes/StripeIosPlugin.h | 5 + stripe_ios/ios/Classes/StripeIosPlugin.m | 16 + stripe_ios/ios/Classes/StripeSdk.m | 71 ++ stripe_ios/ios/Classes/StripeSdk.swift | 343 +++++++ .../ios/Classes/SwiftStripeIosPlugin.swift | 369 +++++++ stripe_ios/ios/Classes/UIColorExtension.swift | 32 + stripe_ios/ios/stripe_ios.podspec | 24 + stripe_ios/lib/stripe_ios.dart | 2 + stripe_ios/pubspec.lock | 147 +++ stripe_ios/pubspec.yaml | 23 + stripe_ios/stripe_ios.iml | 19 + stripe_ios/test/stripe_ios_test.dart | 5 + stripe_platform_interface/.gitignore | 27 + .../.idea/libraries/Dart_SDK.xml | 19 + .../.idea/libraries/KotlinJavaRuntime.xml | 15 + stripe_platform_interface/.idea/modules.xml | 8 + .../.idea/runConfigurations/main_dart.xml | 6 + stripe_platform_interface/.idea/workspace.xml | 36 + stripe_platform_interface/.metadata | 10 + stripe_platform_interface/CHANGELOG.md | 3 + stripe_platform_interface/LICENSE | 1 + stripe_platform_interface/README.md | 923 ++++++++++++++++++ stripe_platform_interface/lib/models.dart | 12 + .../lib/src/method_channel_stripe.dart | 142 +++ .../lib/src/models/apple_pay.dart | 74 ++ .../lib/src/models/apple_pay.g.dart | 132 +++ .../lib/src/models/apple_pay_button.dart | 25 + .../lib/src/models/card_field_input.dart | 107 ++ .../lib/src/models/card_field_input.g.dart | 117 +++ .../lib/src/models/errors.dart | 17 + .../lib/src/models/payment_intents.dart | 115 +++ .../lib/src/models/payment_intents.g.dart | 148 +++ .../lib/src/models/payment_methods.dart | 242 +++++ .../lib/src/models/payment_methods.g.dart | 305 ++++++ .../lib/src/models/payment_sheet.dart | 62 ++ .../lib/src/models/payment_sheet.g.dart | 105 ++ .../lib/src/models/setup_intent.dart | 41 + .../lib/src/models/three_d_secure.dart | 86 ++ .../lib/stripe_platform_interface.dart | 63 ++ stripe_platform_interface/pubspec.yaml | 27 + .../stripe_platform_interface.iml | 19 + .../test/widget_test.dart | 14 + stripe_web/.gitignore | 74 ++ stripe_web/.metadata | 10 + stripe_web/CHANGELOG.md | 3 + stripe_web/LICENSE | 1 + stripe_web/README.md | 14 + stripe_web/lib/stripe_web.dart | 27 + stripe_web/pubspec.lock | 147 +++ stripe_web/pubspec.yaml | 20 + stripe_web/test/stripe_web_test.dart | 9 + 193 files changed, 9955 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 stripe/.gitignore create mode 100644 stripe/.idea/libraries/Dart_SDK.xml create mode 100644 stripe/.idea/modules.xml create mode 100644 stripe/.idea/runConfigurations/example_lib_main_dart.xml create mode 100644 stripe/.idea/workspace.xml create mode 100644 stripe/.metadata create mode 100644 stripe/CHANGELOG.md create mode 100644 stripe/LICENSE create mode 100644 stripe/README.md create mode 100644 stripe/example/.gitignore create mode 100644 stripe/example/.metadata create mode 100644 stripe/example/README.md create mode 100644 stripe/example/android/.gitignore create mode 100644 stripe/example/android/.project create mode 100644 stripe/example/android/.settings/org.eclipse.buildship.core.prefs create mode 100644 stripe/example/android/app/.classpath create mode 100644 stripe/example/android/app/.project create mode 100644 stripe/example/android/app/.settings/org.eclipse.buildship.core.prefs create mode 100644 stripe/example/android/app/build.gradle create mode 100644 stripe/example/android/app/src/debug/AndroidManifest.xml create mode 100644 stripe/example/android/app/src/main/AndroidManifest.xml create mode 100644 stripe/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 stripe/example/android/app/src/main/kotlin/flutter/stripe/example/MainActivity.kt create mode 100644 stripe/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 stripe/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 stripe/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 stripe/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 stripe/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 stripe/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 stripe/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 stripe/example/android/app/src/main/res/values-night/styles.xml create mode 100644 stripe/example/android/app/src/main/res/values/styles.xml create mode 100644 stripe/example/android/app/src/profile/AndroidManifest.xml create mode 100644 stripe/example/android/build.gradle create mode 100644 stripe/example/android/gradle.properties create mode 100644 stripe/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 stripe/example/android/settings.gradle create mode 100644 stripe/example/ios/.gitignore create mode 100644 stripe/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 stripe/example/ios/Flutter/Debug.xcconfig create mode 100644 stripe/example/ios/Flutter/Release.xcconfig create mode 100644 stripe/example/ios/Podfile create mode 100644 stripe/example/ios/Podfile.lock create mode 100644 stripe/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 stripe/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 stripe/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 stripe/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 stripe/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 stripe/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 stripe/example/ios/Runner/AppDelegate.swift create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 stripe/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 stripe/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 stripe/example/ios/Runner/Info.plist create mode 100644 stripe/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 stripe/example/lib/main.dart create mode 100644 stripe/example/macos/.gitignore create mode 100644 stripe/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 stripe/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 stripe/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 stripe/example/macos/Podfile create mode 100644 stripe/example/macos/Podfile.lock create mode 100644 stripe/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 stripe/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 stripe/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 stripe/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 stripe/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 stripe/example/macos/Runner/AppDelegate.swift create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 stripe/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 stripe/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 stripe/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 stripe/example/macos/Runner/Configs/Release.xcconfig create mode 100644 stripe/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 stripe/example/macos/Runner/DebugProfile.entitlements create mode 100644 stripe/example/macos/Runner/Info.plist create mode 100644 stripe/example/macos/Runner/MainFlutterWindow.swift create mode 100644 stripe/example/macos/Runner/Release.entitlements create mode 100644 stripe/example/pubspec.lock create mode 100644 stripe/example/pubspec.yaml create mode 100644 stripe/example/test/widget_test.dart create mode 100644 stripe/example/web/favicon.png create mode 100644 stripe/example/web/icons/Icon-192.png create mode 100644 stripe/example/web/icons/Icon-512.png create mode 100644 stripe/example/web/index.html create mode 100644 stripe/example/web/manifest.json create mode 100644 stripe/lib/src/apple_pay_button.dart create mode 100644 stripe/lib/src/stripe.dart create mode 100644 stripe/lib/src/widgets/card_field.dart create mode 100644 stripe/lib/stripe.dart create mode 100644 stripe/pubspec.lock create mode 100644 stripe/pubspec.yaml create mode 100644 stripe/stripe.iml create mode 100644 stripe/test/stripe_test.dart create mode 100644 stripe_ios/.flutter-plugins create mode 100644 stripe_ios/.flutter-plugins-dependencies create mode 100644 stripe_ios/.gitignore create mode 100644 stripe_ios/.idea/libraries/Dart_SDK.xml create mode 100644 stripe_ios/.idea/modules.xml create mode 100644 stripe_ios/.idea/runConfigurations/example_lib_main_dart.xml create mode 100644 stripe_ios/.idea/workspace.xml create mode 100644 stripe_ios/.metadata create mode 100644 stripe_ios/CHANGELOG.md create mode 100644 stripe_ios/LICENSE create mode 100644 stripe_ios/README.md create mode 100644 stripe_ios/ios/.gitignore create mode 100644 stripe_ios/ios/Assets/.gitkeep create mode 100644 stripe_ios/ios/Classes/ApplePayButtonView.swift create mode 100644 stripe_ios/ios/Classes/CardFieldView.swift create mode 100644 stripe_ios/ios/Classes/Errors.swift create mode 100644 stripe_ios/ios/Classes/Mappers.swift create mode 100644 stripe_ios/ios/Classes/StripeIosPlugin.h create mode 100644 stripe_ios/ios/Classes/StripeIosPlugin.m create mode 100644 stripe_ios/ios/Classes/StripeSdk.m create mode 100644 stripe_ios/ios/Classes/StripeSdk.swift create mode 100644 stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift create mode 100644 stripe_ios/ios/Classes/UIColorExtension.swift create mode 100644 stripe_ios/ios/stripe_ios.podspec create mode 100644 stripe_ios/lib/stripe_ios.dart create mode 100644 stripe_ios/pubspec.lock create mode 100644 stripe_ios/pubspec.yaml create mode 100644 stripe_ios/stripe_ios.iml create mode 100644 stripe_ios/test/stripe_ios_test.dart create mode 100644 stripe_platform_interface/.gitignore create mode 100644 stripe_platform_interface/.idea/libraries/Dart_SDK.xml create mode 100644 stripe_platform_interface/.idea/libraries/KotlinJavaRuntime.xml create mode 100644 stripe_platform_interface/.idea/modules.xml create mode 100644 stripe_platform_interface/.idea/runConfigurations/main_dart.xml create mode 100644 stripe_platform_interface/.idea/workspace.xml create mode 100644 stripe_platform_interface/.metadata create mode 100644 stripe_platform_interface/CHANGELOG.md create mode 100644 stripe_platform_interface/LICENSE create mode 100644 stripe_platform_interface/README.md create mode 100644 stripe_platform_interface/lib/models.dart create mode 100644 stripe_platform_interface/lib/src/method_channel_stripe.dart create mode 100644 stripe_platform_interface/lib/src/models/apple_pay.dart create mode 100644 stripe_platform_interface/lib/src/models/apple_pay.g.dart create mode 100644 stripe_platform_interface/lib/src/models/apple_pay_button.dart create mode 100644 stripe_platform_interface/lib/src/models/card_field_input.dart create mode 100644 stripe_platform_interface/lib/src/models/card_field_input.g.dart create mode 100644 stripe_platform_interface/lib/src/models/errors.dart create mode 100644 stripe_platform_interface/lib/src/models/payment_intents.dart create mode 100644 stripe_platform_interface/lib/src/models/payment_intents.g.dart create mode 100644 stripe_platform_interface/lib/src/models/payment_methods.dart create mode 100644 stripe_platform_interface/lib/src/models/payment_methods.g.dart create mode 100644 stripe_platform_interface/lib/src/models/payment_sheet.dart create mode 100644 stripe_platform_interface/lib/src/models/payment_sheet.g.dart create mode 100644 stripe_platform_interface/lib/src/models/setup_intent.dart create mode 100644 stripe_platform_interface/lib/src/models/three_d_secure.dart create mode 100644 stripe_platform_interface/lib/stripe_platform_interface.dart create mode 100644 stripe_platform_interface/pubspec.yaml create mode 100644 stripe_platform_interface/stripe_platform_interface.iml create mode 100644 stripe_platform_interface/test/widget_test.dart create mode 100644 stripe_web/.gitignore create mode 100644 stripe_web/.metadata create mode 100644 stripe_web/CHANGELOG.md create mode 100644 stripe_web/LICENSE create mode 100644 stripe_web/README.md create mode 100644 stripe_web/lib/stripe_web.dart create mode 100644 stripe_web/pubspec.lock create mode 100644 stripe_web/pubspec.yaml create mode 100644 stripe_web/test/stripe_web_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e9dc58d3d --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..5b8c25a1e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "example", + "cwd": "stripe/example", + "request": "launch", + "type": "dart" + }, + + ] +} \ No newline at end of file diff --git a/stripe/.gitignore b/stripe/.gitignore new file mode 100644 index 000000000..e9dc58d3d --- /dev/null +++ b/stripe/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/stripe/.idea/libraries/Dart_SDK.xml b/stripe/.idea/libraries/Dart_SDK.xml new file mode 100644 index 000000000..e4c26f523 --- /dev/null +++ b/stripe/.idea/libraries/Dart_SDK.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stripe/.idea/modules.xml b/stripe/.idea/modules.xml new file mode 100644 index 000000000..d17090744 --- /dev/null +++ b/stripe/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stripe/.idea/runConfigurations/example_lib_main_dart.xml b/stripe/.idea/runConfigurations/example_lib_main_dart.xml new file mode 100644 index 000000000..5fd9159d1 --- /dev/null +++ b/stripe/.idea/runConfigurations/example_lib_main_dart.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/stripe/.idea/workspace.xml b/stripe/.idea/workspace.xml new file mode 100644 index 000000000..26b988352 --- /dev/null +++ b/stripe/.idea/workspace.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe/.metadata b/stripe/.metadata new file mode 100644 index 000000000..17e82922c --- /dev/null +++ b/stripe/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: a706cd211240f27be3b61f06d70f958c7a4156fe + channel: dev + +project_type: plugin diff --git a/stripe/CHANGELOG.md b/stripe/CHANGELOG.md new file mode 100644 index 000000000..41cc7d819 --- /dev/null +++ b/stripe/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/stripe/LICENSE b/stripe/LICENSE new file mode 100644 index 000000000..ba75c69f7 --- /dev/null +++ b/stripe/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/stripe/README.md b/stripe/README.md new file mode 100644 index 000000000..e9e8c2b41 --- /dev/null +++ b/stripe/README.md @@ -0,0 +1,18 @@ +# stripe + +A new flutter plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/developing-packages/), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + +The plugin project was generated without specifying the `--platforms` flag, no platforms are currently supported. +To add platforms, run `flutter create -t plugin --platforms .` under the same +directory. You can also find a detailed instruction on how to add platforms in the `pubspec.yaml` at https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms. diff --git a/stripe/example/.gitignore b/stripe/example/.gitignore new file mode 100644 index 000000000..0fa6b675c --- /dev/null +++ b/stripe/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/stripe/example/.metadata b/stripe/example/.metadata new file mode 100644 index 000000000..13f27cab4 --- /dev/null +++ b/stripe/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: a706cd211240f27be3b61f06d70f958c7a4156fe + channel: dev + +project_type: app diff --git a/stripe/example/README.md b/stripe/example/README.md new file mode 100644 index 000000000..0663d126d --- /dev/null +++ b/stripe/example/README.md @@ -0,0 +1,16 @@ +# stripe_example + +Demonstrates how to use the stripe plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/stripe/example/android/.gitignore b/stripe/example/android/.gitignore new file mode 100644 index 000000000..0a741cb43 --- /dev/null +++ b/stripe/example/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/stripe/example/android/.project b/stripe/example/android/.project new file mode 100644 index 000000000..35ddc9675 --- /dev/null +++ b/stripe/example/android/.project @@ -0,0 +1,28 @@ + + + android + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + + + 1613984185079 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/stripe/example/android/.settings/org.eclipse.buildship.core.prefs b/stripe/example/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 000000000..34fd1b09f --- /dev/null +++ b/stripe/example/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/Library/Java/JavaVirtualMachines/jdk-13.0.1.jdk/Contents/Home +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/stripe/example/android/app/.classpath b/stripe/example/android/app/.classpath new file mode 100644 index 000000000..f38e320f5 --- /dev/null +++ b/stripe/example/android/app/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/stripe/example/android/app/.project b/stripe/example/android/app/.project new file mode 100644 index 000000000..f87fa6828 --- /dev/null +++ b/stripe/example/android/app/.project @@ -0,0 +1,34 @@ + + + app + Project app created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + + 1613984185082 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/stripe/example/android/app/.settings/org.eclipse.buildship.core.prefs b/stripe/example/android/app/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 000000000..b1886adb4 --- /dev/null +++ b/stripe/example/android/app/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=.. +eclipse.preferences.version=1 diff --git a/stripe/example/android/app/build.gradle b/stripe/example/android/app/build.gradle new file mode 100644 index 000000000..6ca23448e --- /dev/null +++ b/stripe/example/android/app/build.gradle @@ -0,0 +1,59 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/stripe/example/android/app/src/debug/AndroidManifest.xml b/stripe/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..c208884f3 --- /dev/null +++ b/stripe/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/stripe/example/android/app/src/main/AndroidManifest.xml b/stripe/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..34dd77efb --- /dev/null +++ b/stripe/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/stripe/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/stripe/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 000000000..e793a000d --- /dev/null +++ b/stripe/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/stripe/example/android/app/src/main/kotlin/flutter/stripe/example/MainActivity.kt b/stripe/example/android/app/src/main/kotlin/flutter/stripe/example/MainActivity.kt new file mode 100644 index 000000000..a6e9a355c --- /dev/null +++ b/stripe/example/android/app/src/main/kotlin/flutter/stripe/example/MainActivity.kt @@ -0,0 +1,6 @@ +package flutter.stripe.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/stripe/example/android/app/src/main/res/drawable-v21/launch_background.xml b/stripe/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/stripe/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/stripe/example/android/app/src/main/res/drawable/launch_background.xml b/stripe/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..304732f88 --- /dev/null +++ b/stripe/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/stripe/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/stripe/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/stripe/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/stripe/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/stripe/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/stripe/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/stripe/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/stripe/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/stripe/example/android/app/src/main/res/values-night/styles.xml b/stripe/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000..449a9f930 --- /dev/null +++ b/stripe/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/stripe/example/android/app/src/main/res/values/styles.xml b/stripe/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..d74aa35c2 --- /dev/null +++ b/stripe/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/stripe/example/android/app/src/profile/AndroidManifest.xml b/stripe/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..c208884f3 --- /dev/null +++ b/stripe/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/stripe/example/android/build.gradle b/stripe/example/android/build.gradle new file mode 100644 index 000000000..c505a8635 --- /dev/null +++ b/stripe/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/stripe/example/android/gradle.properties b/stripe/example/android/gradle.properties new file mode 100644 index 000000000..94adc3a3f --- /dev/null +++ b/stripe/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/stripe/example/android/gradle/wrapper/gradle-wrapper.properties b/stripe/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..bc6a58afd --- /dev/null +++ b/stripe/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/stripe/example/android/settings.gradle b/stripe/example/android/settings.gradle new file mode 100644 index 000000000..44e62bcf0 --- /dev/null +++ b/stripe/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/stripe/example/ios/.gitignore b/stripe/example/ios/.gitignore new file mode 100644 index 000000000..e96ef602b --- /dev/null +++ b/stripe/example/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/stripe/example/ios/Flutter/AppFrameworkInfo.plist b/stripe/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..9367d483e --- /dev/null +++ b/stripe/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/stripe/example/ios/Flutter/Debug.xcconfig b/stripe/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..ec97fc6f3 --- /dev/null +++ b/stripe/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/stripe/example/ios/Flutter/Release.xcconfig b/stripe/example/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..c4855bfe2 --- /dev/null +++ b/stripe/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/stripe/example/ios/Podfile b/stripe/example/ios/Podfile new file mode 100644 index 000000000..413748446 --- /dev/null +++ b/stripe/example/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '11.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + pod 'Stripe', :git => 'https://github.com/stripe/stripe-ios.git', :branch => 'davidme/mc-beta-2-no-asset-catalogs' + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/stripe/example/ios/Podfile.lock b/stripe/example/ios/Podfile.lock new file mode 100644 index 000000000..2109f0001 --- /dev/null +++ b/stripe/example/ios/Podfile.lock @@ -0,0 +1,42 @@ +PODS: + - Flutter (1.0.0) + - integration_test (0.0.1): + - Flutter + - Stripe (21.0.0-mc-beta-1): + - Stripe/Stripe3DS2 (= 21.0.0-mc-beta-1) + - Stripe/Stripe3DS2 (21.0.0-mc-beta-1) + - stripe_ios (0.0.1): + - Flutter + - Stripe (~> 21.0.0-mc-beta-1) + +DEPENDENCIES: + - Flutter (from `Flutter`) + - integration_test (from `.symlinks/plugins/integration_test/ios`) + - Stripe (from `https://github.com/stripe/stripe-ios.git`, branch `davidme/mc-beta-2-no-asset-catalogs`) + - stripe_ios (from `.symlinks/plugins/stripe_ios/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + integration_test: + :path: ".symlinks/plugins/integration_test/ios" + Stripe: + :branch: davidme/mc-beta-2-no-asset-catalogs + :git: https://github.com/stripe/stripe-ios.git + stripe_ios: + :path: ".symlinks/plugins/stripe_ios/ios" + +CHECKOUT OPTIONS: + Stripe: + :commit: d45c0dca933c73b22c259da7adddd24a4abc2157 + :git: https://github.com/stripe/stripe-ios.git + +SPEC CHECKSUMS: + Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c + integration_test: 6eb66a19f7104200dcfdd62bc0077e1b09686e4f + Stripe: 4f9369bb8f036ed106d12355e622d934c2ec60a1 + stripe_ios: 70cc76157f253daef7abacf87edf6c22bb2ea661 + +PODFILE CHECKSUM: 9c31903ef5a54e64ac01b6d9803a084d7a2387f0 + +COCOAPODS: 1.10.1 diff --git a/stripe/example/ios/Runner.xcodeproj/project.pbxproj b/stripe/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..0f2209f65 --- /dev/null +++ b/stripe/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,554 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C1C00DE1D4D140D43FF1F838 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0319CE3D006F4355FEBFB2E6 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0319CE3D006F4355FEBFB2E6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 6833999D0768439428209E4E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 6FC0162B5DA52F2DAC784200 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FEEC4D1EB43F5F7C33B96096 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C1C00DE1D4D140D43FF1F838 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 772CB8D4E939D84172FD9E36 /* Pods */ = { + isa = PBXGroup; + children = ( + 6FC0162B5DA52F2DAC784200 /* Pods-Runner.debug.xcconfig */, + FEEC4D1EB43F5F7C33B96096 /* Pods-Runner.release.xcconfig */, + 6833999D0768439428209E4E /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 77713048360F389377114CE8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0319CE3D006F4355FEBFB2E6 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 772CB8D4E939D84172FD9E36 /* Pods */, + 77713048360F389377114CE8 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 5958AEDD5CB48106E88B4FEF /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 8E53D1C6D90166D1FC2554CE /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 5958AEDD5CB48106E88B4FEF /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 8E53D1C6D90166D1FC2554CE /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 8734Y6QF3F; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = flutter.stripe.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 8734Y6QF3F; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = flutter.stripe.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 8734Y6QF3F; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = flutter.stripe.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/stripe/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/stripe/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/stripe/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..a28140cfd --- /dev/null +++ b/stripe/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/stripe/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/stripe/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/stripe/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/stripe/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/stripe/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/stripe/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/stripe/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/stripe/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/stripe/example/ios/Runner/AppDelegate.swift b/stripe/example/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/stripe/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d36b1fab2 --- /dev/null +++ b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/stripe/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 000000000..89c2725b7 --- /dev/null +++ b/stripe/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/stripe/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/stripe/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f2e259c7c --- /dev/null +++ b/stripe/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe/example/ios/Runner/Base.lproj/Main.storyboard b/stripe/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/stripe/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe/example/ios/Runner/Info.plist b/stripe/example/ios/Runner/Info.plist new file mode 100644 index 000000000..b5a91235a --- /dev/null +++ b/stripe/example/ios/Runner/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + NSCameraUsageDescription + <string>To scan cards</string> + To scan cards + UIViewControllerBasedStatusBarAppearance + + + diff --git a/stripe/example/ios/Runner/Runner-Bridging-Header.h b/stripe/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/stripe/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/stripe/example/lib/main.dart b/stripe/example/lib/main.dart new file mode 100644 index 000000000..307a0c0c9 --- /dev/null +++ b/stripe/example/lib/main.dart @@ -0,0 +1,217 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; +import 'package:http/http.dart' as http; +import 'package:flutter/services.dart'; +import 'package:stripe/stripe.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + Stripe.instance.checkApplePaySupport(); + runApp(App()); +} + +class App extends StatelessWidget { + @override + Widget build(BuildContext context) { + return StripeProvider( + publishableKey: 'pk_test_oDBTDWWrb1kezz6lwq9zmeoW00XmZlpvM6', + merchantIdentifier: 'Hello', + child: DismissFocusOverlay( + child: MaterialApp( + // theme: ThemeData.light(), + theme: ThemeData.dark(), + home: MyApp(), + ), + ), + ); + } +} + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + PaymentIntent paymentIntent; + + bool isGettingConfig = false; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final applePayButtonStyle = + isDark ? ApplePayButtonStyle.white : ApplePayButtonStyle.black; + return Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Padding( + padding: EdgeInsets.symmetric(vertical: 32, horizontal: 24), + child: Center( + child: Column( + children: [ + ValueListenableBuilder( + valueListenable: Stripe.instance.isApplePaySupported, + builder: (context, isSupported, _) { + if (isSupported) { + return ApplePayButton( + width: 240, + type: ApplePayButtonType.book, + style: applePayButtonStyle, + onPressed: () { + presentApplePay(); + print('On Apple pay tapped'); + }, + ); + } else { + return Text('Apple Pay Not Supported'); + } + }, + ), + SizedBox(height: 15), + UiKitCardField( + decoration: CardDecoration( + backgroundColor: Theme.of(context).cardColor, + borderRadius: 0, + borderColor: Colors.green, + textColor: Colors.green, + ), + enablePostalCode: false, + onFocus: (field) { + print('On focus changed $field'); + }, + onChange: (card) { + print('On card changed ${card.toJson()}'); + }, + ), + ValueListenableBuilder( + valueListenable: Stripe.instance.isPaymentSheetDisplayed, + builder: (context, isDisplayed, _) { + final onPressed = + isDisplayed || isGettingConfig ? null : presentPaymentSheet; + return ElevatedButton( + onPressed: onPressed, + child: Text('Open PaymentSheet'), + ); + }, + ), + if (paymentIntent != null) + Expanded( + child: Padding( + padding: EdgeInsets.all(8), + child: Text( + paymentIntentString(paymentIntent), + ), + ), + ), + ], + )), + ), + ); + } + + String paymentIntentString(PaymentIntent intent) { + String result = 'PaymentIntent: {\n'; + for (final entry in intent.toJson().entries) { + if (entry.key == 'description') continue; + result += ' ${entry.key} : ${entry.value}\n'; + } + result += '}'; + return result; + } + + Future presentApplePay() async { + try { + await Stripe.instance.presentApplePay( + ApplePayPresentParams( + cartItems: [ + ApplePayCartSummaryItem(label: 'Item 1', amount: '20.0'), + ], + country: 'ES', + currency: 'EUR', + ), + ); + } catch (e) { + log('Unexpected Error while presenting Apple Pay', error: e); + } + } + + Future presentPaymentSheet() async { + try { + final isDark = Theme.of(context).brightness == Brightness.dark; + + final config = await getPaymentConfig(); + await Stripe.instance.setupPaymentSheet( + SetupPaymentSheetParams( + merchantDisplayName: "Stripe Flutter Example", + customerId: config['customer'], + customerEphemeralKeySecret: config['ephemeralKey'], + paymentIntentClientSecret: config["paymentIntent"], + applePay: true, + customFlow: false, + style: isDark + ? PaymentSheetBrightness.alwaysDark + : PaymentSheetBrightness.alwaysLight, + ), + ); + final paymentIntent = await Stripe.instance.presentPaymentSheet(null); + setState(() { + this.paymentIntent = paymentIntent; + }); + print('Payment Intent $paymentIntent'); + } catch (e) { + log('Unexpected Error while presenting Sheet', error: e); + // rethrow; + } + } + + Future> getPaymentConfig() async { + setState(() { + isGettingConfig = true; + }); + try { + final url = 'https://stripe-flutter.glitch.me/payment-sheet'; + final response = await http.post(Uri.parse(url)); + print('Response status: ${response.statusCode}'); + print('Response body: ${response.body}'); + + return Map.from(jsonDecode(response.body)); + } catch (e) { + log('Unexpected Error while getting customer id', error: e); + //rethrow; + } finally { + setState(() { + isGettingConfig = false; + }); + } + } +} + +class DismissFocusOverlay extends StatelessWidget { + final Widget child; + + const DismissFocusOverlay({Key key, this.child}) : super(key: key); + @override + Widget build(BuildContext context) { + return GestureDetector( + child: child, + onTap: () { + FocusScopeNode currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus && + currentFocus.focusedChild != null) { + FocusManager.instance.primaryFocus.unfocus(); + } + }, + ); + } +} diff --git a/stripe/example/macos/.gitignore b/stripe/example/macos/.gitignore new file mode 100644 index 000000000..d2fd37723 --- /dev/null +++ b/stripe/example/macos/.gitignore @@ -0,0 +1,6 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/xcuserdata/ diff --git a/stripe/example/macos/Flutter/Flutter-Debug.xcconfig b/stripe/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 000000000..4b81f9b2d --- /dev/null +++ b/stripe/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/stripe/example/macos/Flutter/Flutter-Release.xcconfig b/stripe/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 000000000..5caa9d157 --- /dev/null +++ b/stripe/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/stripe/example/macos/Flutter/GeneratedPluginRegistrant.swift b/stripe/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 000000000..cccf817a5 --- /dev/null +++ b/stripe/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/stripe/example/macos/Podfile b/stripe/example/macos/Podfile new file mode 100644 index 000000000..dade8dfad --- /dev/null +++ b/stripe/example/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.11' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/stripe/example/macos/Podfile.lock b/stripe/example/macos/Podfile.lock new file mode 100644 index 000000000..495a30d02 --- /dev/null +++ b/stripe/example/macos/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - FlutterMacOS (1.0.0) + +DEPENDENCIES: + - FlutterMacOS (from `Flutter/ephemeral`) + +EXTERNAL SOURCES: + FlutterMacOS: + :path: Flutter/ephemeral + +SPEC CHECKSUMS: + FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 + +PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c + +COCOAPODS: 1.10.1 diff --git a/stripe/example/macos/Runner.xcodeproj/project.pbxproj b/stripe/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..2b5c2cd62 --- /dev/null +++ b/stripe/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,614 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 02B208E01E6A3972B6C39584 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D54883377F440B5F41985673 /* Pods_Runner.framework */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1C196309446CA714F48714CF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 9F744F6122118BE6E10A63E3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + D54883377F440B5F41985673 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E700BDBCEEA56F2F8199770D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 02B208E01E6A3972B6C39584 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + CCC293CA648C2F29209DC503 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + CCC293CA648C2F29209DC503 /* Pods */ = { + isa = PBXGroup; + children = ( + 1C196309446CA714F48714CF /* Pods-Runner.debug.xcconfig */, + E700BDBCEEA56F2F8199770D /* Pods-Runner.release.xcconfig */, + 9F744F6122118BE6E10A63E3 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D54883377F440B5F41985673 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 99613BA651C72F9F5E3E4752 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 99613BA651C72F9F5E3E4752 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/stripe/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/stripe/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/stripe/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/stripe/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/stripe/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..ae8ff59d9 --- /dev/null +++ b/stripe/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/stripe/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/stripe/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/stripe/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/stripe/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/stripe/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/stripe/example/macos/Runner/AppDelegate.swift b/stripe/example/macos/Runner/AppDelegate.swift new file mode 100644 index 000000000..d53ef6437 --- /dev/null +++ b/stripe/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..a2ec33f19 --- /dev/null +++ b/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/stripe/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe/example/macos/Runner/Configs/AppInfo.xcconfig b/stripe/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 000000000..cf9be60ca --- /dev/null +++ b/stripe/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved. diff --git a/stripe/example/macos/Runner/Configs/Debug.xcconfig b/stripe/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 000000000..36b0fd946 --- /dev/null +++ b/stripe/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/stripe/example/macos/Runner/Configs/Release.xcconfig b/stripe/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 000000000..dff4f4956 --- /dev/null +++ b/stripe/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/stripe/example/macos/Runner/Configs/Warnings.xcconfig b/stripe/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 000000000..42bcbf478 --- /dev/null +++ b/stripe/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/stripe/example/macos/Runner/DebugProfile.entitlements b/stripe/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 000000000..dddb8a30c --- /dev/null +++ b/stripe/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/stripe/example/macos/Runner/Info.plist b/stripe/example/macos/Runner/Info.plist new file mode 100644 index 000000000..4789daa6a --- /dev/null +++ b/stripe/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/stripe/example/macos/Runner/MainFlutterWindow.swift b/stripe/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 000000000..2722837ec --- /dev/null +++ b/stripe/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/stripe/example/macos/Runner/Release.entitlements b/stripe/example/macos/Runner/Release.entitlements new file mode 100644 index 000000000..852fa1a47 --- /dev/null +++ b/stripe/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/stripe/example/pubspec.lock b/stripe/example/pubspec.lock new file mode 100644 index 000000000..020e286fc --- /dev/null +++ b/stripe/example/pubspec.lock @@ -0,0 +1,302 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + equatable: + dependency: transitive + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.0" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.9.2+2" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + stripe: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.0.1" + stripe_ios: + dependency: transitive + description: + path: "../../stripe_ios" + relative: true + source: path + version: "0.0.1" + stripe_platform_interface: + dependency: transitive + description: + path: "../../stripe_platform_interface" + relative: true + source: path + version: "0.0.0+1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.19" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" +sdks: + dart: ">=2.12.0-224.0.dev <3.0.0" + flutter: ">=1.20.0" diff --git a/stripe/example/pubspec.yaml b/stripe/example/pubspec.yaml new file mode 100644 index 000000000..f878d2aef --- /dev/null +++ b/stripe/example/pubspec.yaml @@ -0,0 +1,69 @@ +name: stripe_example +description: Demonstrates how to use the stripe plugin. + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +environment: + sdk: ">=2.7.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + http: + stripe: + path: ../ + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/stripe/example/test/widget_test.dart b/stripe/example/test/widget_test.dart new file mode 100644 index 000000000..15eee8924 --- /dev/null +++ b/stripe/example/test/widget_test.dart @@ -0,0 +1,27 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:stripe_example/main.dart'; + +void main() { + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => widget is Text && + widget.data.startsWith('Running on:'), + ), + findsOneWidget, + ); + }); +} diff --git a/stripe/example/web/favicon.png b/stripe/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/stripe/example/web/icons/Icon-192.png b/stripe/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/stripe/example/web/icons/Icon-512.png b/stripe/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/stripe/example/web/index.html b/stripe/example/web/index.html new file mode 100644 index 000000000..970e3794b --- /dev/null +++ b/stripe/example/web/index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + example + + + + + + + + + diff --git a/stripe/example/web/manifest.json b/stripe/example/web/manifest.json new file mode 100644 index 000000000..8c012917d --- /dev/null +++ b/stripe/example/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/stripe/lib/src/apple_pay_button.dart b/stripe/lib/src/apple_pay_button.dart new file mode 100644 index 000000000..7c7e8bcec --- /dev/null +++ b/stripe/lib/src/apple_pay_button.dart @@ -0,0 +1,160 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:stripe_platform_interface/models.dart'; + +// +const double kApplePayButtonDefaultHeight = 48.0; + +class ApplePayButton extends StatelessWidget { + final ApplePayButtonStyle style; + final ApplePayButtonType type; + final VoidCallback? onPressed; + final BoxConstraints? constraints; + + ApplePayButton({ + Key? key, + this.style = ApplePayButtonStyle.black, + this.type = ApplePayButtonType.plain, + this.onPressed, + double? width, + double? height = kApplePayButtonDefaultHeight, + BoxConstraints? constraints, + }) : assert(constraints == null || constraints.debugAssertIsValid()), + constraints = (width != null || height != null) + ? constraints?.tighten(width: width, height: height) ?? + BoxConstraints.tightFor(width: width, height: height) + : constraints; + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: constraints ?? + BoxConstraints.tightFor(height: kApplePayButtonDefaultHeight), + child: _platform, + ); + } + + Widget get _platform { + switch (defaultTargetPlatform) { + case TargetPlatform.iOS: + return UiKitApplePayButton( + type: type, + style: style, + onPressed: onPressed, + ); + default: + throw UnsupportedError( + 'This platform $defaultTargetPlatform does not support Apple Pay'); + } + } +} + +class UiKitApplePayButton extends StatefulWidget { + final ApplePayButtonStyle style; + final ApplePayButtonType type; + final VoidCallback? onPressed; + + UiKitApplePayButton({ + Key? key, + this.style = ApplePayButtonStyle.black, + this.type = ApplePayButtonType.plain, + this.onPressed, + double? width, + double? height = kApplePayButtonDefaultHeight, + }) : super(key: key); + + @override + _UiKitApplePayButtonState createState() => _UiKitApplePayButtonState(); +} + +class _UiKitApplePayButtonState extends State { + MethodChannel? methodChannel; + + @override + Widget build(BuildContext context) { + final int type = _mapButtonType(widget.type); + final int style = mapButtonStyle(widget.style); + + return UiKitView( + viewType: 'flutter.stripe/apple_pay', + creationParamsCodec: StandardMessageCodec(), + creationParams: {'type': type, 'style': style}, + onPlatformViewCreated: (viewId) { + methodChannel = MethodChannel('flutter.stripe/apple_pay/$viewId'); + methodChannel?.setMethodCallHandler((call) async { + if (call.method == 'onPressed') widget.onPressed?.call(); + return; + }); + }, + ); + } + + @override + void didUpdateWidget(covariant UiKitApplePayButton oldWidget) { + if (widget.style != oldWidget.style || widget.type != oldWidget.type) { + final int type = _mapButtonType(widget.type); + final int style = mapButtonStyle(widget.style); + methodChannel?.invokeMethod('updateStyle', { + 'type': type, + 'style': style, + }); + } + super.didUpdateWidget(oldWidget); + } +} + +int _mapButtonType(ApplePayButtonType type) { + switch (type) { + case ApplePayButtonType.plain: + return 0; + case ApplePayButtonType.buy: + return 1; + case ApplePayButtonType.setUp: + return 2; + case ApplePayButtonType.inStore: + return 3; + case ApplePayButtonType.donate: + return 4; + case ApplePayButtonType.checkout: + return 5; + case ApplePayButtonType.book: + return 6; + case ApplePayButtonType.subscribe: + return 7; + case ApplePayButtonType.reload: + return 8; + case ApplePayButtonType.addMoney: + return 9; + case ApplePayButtonType.topUp: + return 10; + case ApplePayButtonType.order: + return 11; + case ApplePayButtonType.rent: + return 12; + case ApplePayButtonType.support: + return 13; + case ApplePayButtonType.contribute: + return 14; + case ApplePayButtonType.tip: + return 15; + default: + return 0; + } +} + +int mapButtonStyle(ApplePayButtonStyle style) { + switch (style) { + case ApplePayButtonStyle.white: + return 0; + case ApplePayButtonStyle.whiteOutline: + return 1; + case ApplePayButtonStyle.black: + return 2; + case ApplePayButtonStyle.automatic: + return 3; + default: + return 2; + } +} diff --git a/stripe/lib/src/stripe.dart b/stripe/lib/src/stripe.dart new file mode 100644 index 000000000..cbdf04668 --- /dev/null +++ b/stripe/lib/src/stripe.dart @@ -0,0 +1,271 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:stripe_platform_interface/src/method_channel_stripe.dart'; +import 'package:stripe_platform_interface/src/models/apple_pay.dart'; +import 'package:stripe_platform_interface/src/models/errors.dart'; +import 'package:stripe_platform_interface/src/models/payment_intents.dart'; +import 'package:stripe_platform_interface/src/models/payment_methods.dart'; +import 'package:stripe_platform_interface/src/models/setup_intent.dart'; +import 'package:stripe_platform_interface/src/models/three_d_secure.dart'; +import 'package:stripe_platform_interface/stripe_platform_interface.dart'; + +class Stripe { + /// Disables the platform override in order to use a manually registered + /// [SharePlatform] for testing purposes. + /// See https://github.com/flutter/flutter/issues/52267 for more details. + @visibleForTesting + static set disableSharePlatformOverride(bool override) { + _disablePlatformOverride = override; + } + + static bool _disablePlatformOverride = false; + static StripePlatform? __platform; + + // This is to manually endorse the Linux plugin until automatic registration + // of dart plugins is implemented. + // See https://github.com/flutter/flutter/issues/52267 for more details. + static StripePlatform get _platform { + if (__platform == null) { + __platform ??= StripePlatform.instance; + } + return __platform!; + } + + static late final Stripe instance = Stripe._(); + Stripe._(); + + late ValueListenable ready = _isApplePaySupported; + final ValueNotifier _ready = ValueNotifier(false); + + late ValueListenable isApplePaySupported = _isApplePaySupported; + final ValueNotifier _isApplePaySupported = ValueNotifier(false); + + late ValueListenable isPaymentSheetDisplayed = _isPaymentSheetDisplayed; + final ValueNotifier _isPaymentSheetDisplayed = ValueNotifier(false); + + Future initialise({ + required String publishableKey, + // AppInfo? appInfo, + String? stripeAccountId, + ThreeDSecureConfigurationParams? threeDSecureParams, + String? merchantIdentifier, + }) async { + if (_ready.value != false) { + _ready.value = false; + } + await _platform.initialise( + publishableKey: publishableKey, + stripeAccountId: stripeAccountId, + threeDSecureParams: threeDSecureParams, + merchantIdentifier: merchantIdentifier); + _ready.value = true; + } + + Future checkApplePaySupport() async { + final isSupported = await _platform.isApplePaySupported(); + _isApplePaySupported.value = isSupported; + } + + Future createPaymentMethod( + PaymentMethodParams data, [ + Map options = const {}, + ]) async { + try { + final paymentMethod = await _platform.createPaymentMethod(data, options); + return paymentMethod; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future retrievePaymentIntent(String clientSecret) async { + try { + final paymentMethod = await _platform.retrievePaymentIntent(clientSecret); + return paymentMethod; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future confirmPaymentMethod( + String paymentIntentClientSecret, + PaymentMethodParams data, [ + Map options = const {}, + ]) async { + try { + final paymentMethod = await _platform.confirmPaymentMethod( + paymentIntentClientSecret, data, options); + return paymentMethod; + } on StripeError catch (error) { + rethrow; + } + } + + Future presentApplePay( + ApplePayPresentParams params, + ) async { + if (!isApplePaySupported.value) { + throw StripeError( + ApplePayError.canceled, 'APPLE_PAY_NOT_SUPPORTED_MESSAGE'); + } + try { + await _platform.presentApplePay(params); + } on StripeError catch (error) { + rethrow; + } + } + + Future confirmApplePayPayment( + String clientSecret, + ) async { + if (!isApplePaySupported.value) { + throw StripeError( + ApplePayError.canceled, 'APPLE_PAY_NOT_SUPPORTED_MESSAGE'); + } + try { + await _platform.confirmApplePayPayment(clientSecret); + } on StripeError catch (error) { + rethrow; + } + } + + Future handleCardAction( + String paymentIntentClientSecret, + ) async { + try { + final paymentIntent = + await _platform.handleCardAction(paymentIntentClientSecret); + return paymentIntent; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future confirmSetupIntent( + String paymentIntentClientSecret, + PaymentMethodParams data, [ + Map options = const {}, + ]) async { + try { + final setupIntent = await _platform.confirmSetupIntent( + paymentIntentClientSecret, data, options); + return setupIntent; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future createTokenForCVCUpdate( + String cvc, + ) async { + try { + final tokenId = await _platform.createTokenForCVCUpdate( + cvc, + ); + return tokenId; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future setupPaymentSheet( + SetupPaymentSheetParams params) async { + try { + final option = await _platform.setupPaymentSheet( + params, + ); + return option; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future presentPaymentSheet(String? clientSecret) async { + _isPaymentSheetDisplayed.value = true; + try { + final option = await _platform.presentPaymentSheet(clientSecret); + return option; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } finally { + _isPaymentSheetDisplayed.value = false; + } + } + + Future paymentSheetConfirmPayment() async { + try { + final option = await _platform.paymentSheetConfirmPayment(); + return option; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } + + Future presentPaymentOptions() async { + try { + final option = await _platform.presentPaymentOptions(); + return option; + } on StripeError catch (error) { + throw StripeError(error.code, error.message); + } + } +} + +class StripeProvider extends StatefulWidget { + const StripeProvider({ + Key? key, + required this.publishableKey, + required this.child, + this.merchantIdentifier, + this.threeDSecureParams, + this.stripeAccountId, + }) : super(key: key); + + final Widget child; + final String publishableKey; + final String? merchantIdentifier; + final ThreeDSecureConfigurationParams? threeDSecureParams; + final String? stripeAccountId; + + @override + _StripeProviderState createState() => _StripeProviderState(); +} + +class _StripeProviderState extends State { + bool ready = false; + + @override + void initState() { + initialise(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return widget.child; + } + + @override + void didUpdateWidget(covariant StripeProvider oldWidget) { + if (widget.publishableKey != oldWidget.publishableKey || + widget.merchantIdentifier != oldWidget.merchantIdentifier || + // widget.threeDSecureParams != oldWidget.threeDSecureParams || Make equatable first + widget.stripeAccountId != oldWidget.stripeAccountId) { + initialise(); + } + super.didUpdateWidget(oldWidget); + } + + Future initialise() async { + Stripe.instance.initialise( + publishableKey: widget.publishableKey, + stripeAccountId: widget.stripeAccountId, + threeDSecureParams: widget.threeDSecureParams, + merchantIdentifier: widget.merchantIdentifier, + ); + if (mounted) { + setState(() => ready = true); + } + } +} diff --git a/stripe/lib/src/widgets/card_field.dart b/stripe/lib/src/widgets/card_field.dart new file mode 100644 index 000000000..bc7fbf000 --- /dev/null +++ b/stripe/lib/src/widgets/card_field.dart @@ -0,0 +1,161 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:stripe/stripe.dart'; +import 'package:stripe_platform_interface/src/models/card_field_input.dart'; + +typedef CardChangedCallback = void Function(CardFieldInputDetails? details); +typedef CardFocusCallback = void Function(CardFieldName? focusedField); + +class UiKitCardField extends StatefulWidget { + final CardChangedCallback? onChange; + final CardFocusCallback? onFocus; + final CardDecoration? decoration; + final bool enablePostalCode; + + final BoxConstraints? constraints; + + UiKitCardField({ + Key? key, + this.onChange, + this.onFocus, + this.enablePostalCode = true, + this.decoration, + double? width, + double? height = kApplePayButtonDefaultHeight, + BoxConstraints? constraints, + }) : assert(constraints == null || constraints.debugAssertIsValid()), + constraints = (width != null || height != null) + ? constraints?.tighten(width: width, height: height) ?? + BoxConstraints.tightFor(width: width, height: height) + : constraints, + super(key: key); + + @override + _UiKitCardFieldState createState() => _UiKitCardFieldState(); +} + +class _UiKitCardFieldState extends State { + MethodChannel? methodChannel; + + FocusNode _focusNode = FocusNode(debugLabel: 'UiKitCardField'); + int? _viewId; + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: widget.constraints ?? + BoxConstraints.tightFor(height: kApplePayButtonDefaultHeight), + child: Focus( + focusNode: _focusNode, + onFocusChange: _onFocusChange, + child: UiKitView( + viewType: 'flutter.stripe/card_field', + creationParamsCodec: StandardMessageCodec(), + creationParams: { + if (widget.decoration != null) + 'decoration': widget.decoration!.toJson(), + 'enablePostalCode': widget.enablePostalCode, + }, + onPlatformViewCreated: (viewId) { + methodChannel = MethodChannel('flutter.stripe/card_field/$viewId'); + methodChannel?.setMethodCallHandler((call) async { + if (call.method == 'onFocusChange') { + try { + final arguments = Map.from(call.arguments); + onFocusChanged(arguments); + } catch (e) { + // todo: how to handle this errors? + log('Error', error: e); + } + } else if (call.method == 'onCardChange') { + onCardChanged(Map.from(call.arguments)); + } + return; + }); + _viewId = viewId; + _focusNode.debugLabel = 'UiKitCardField(id: $viewId)'; + }, + ), + ), + ); + } + + void onFocusChanged(Map arguments) { + try { + final CardFieldFocusName field = CardFieldFocusName.fromJson(arguments); + if (field.focusedField != null) { + _focusNode.requestFocus(); + } + widget.onFocus?.call(field.focusedField); + } catch (e) { + // todo: how to handle this errors? + log('Error', error: e); + } + } + + void _onFocusChange(bool isFocused) { + final MethodChannel? methodChannel = this.methodChannel; + if (methodChannel == null) { + return; + } + if (!isFocused) { + methodChannel.invokeMethod('clearFocus'); + return; + } + methodChannel.invokeMethod('focus'); + } + + void onCardChanged(Map arguments) { + try { + final CardFieldInputDetails details = + CardFieldInputDetails.fromJson(arguments); + widget.onChange?.call(details); + } catch (e) { + // todo: how to handle this errors? + log('Error', error: e); + } + } + + @override + void didUpdateWidget(covariant UiKitCardField oldWidget) { + if (widget.enablePostalCode != oldWidget.enablePostalCode) { + methodChannel?.invokeMethod('onPostalCodeEnabledChanged', { + 'enablePostalCode': widget.enablePostalCode, + }); + } + if (widget.decoration != oldWidget.decoration) { + methodChannel?.invokeMethod('onDecorationChanged', { + 'decoration': widget.decoration?.toJson(), + }); + } + /* if (widget.style != oldWidget.style || widget.type != oldWidget.type) { + final int type = _mapButtonType(widget.type); + final int style = mapButtonStyle(widget.style); + methodChannel?.invokeMethod('updateStyle', { + 'type': type, + 'style': style, + }); + } */ + super.didUpdateWidget(oldWidget); + } +} + +class NativeCardDetails extends CardFieldInputDetails { + NativeCardDetails({ + required String last4, + required int expiryMonth, + required int expiryYear, + String? postalCode, + required CardBrand brand, + required bool complete, + }) : super( + last4: last4, + expiryMonth: expiryMonth, + expiryYear: expiryYear, + postalCode: postalCode, + brand: brand, + complete: complete, + ); +} diff --git a/stripe/lib/stripe.dart b/stripe/lib/stripe.dart new file mode 100644 index 000000000..f3a6a1cc0 --- /dev/null +++ b/stripe/lib/stripe.dart @@ -0,0 +1,4 @@ +export 'src/stripe.dart'; +export 'src/apple_pay_button.dart'; +export 'src/widgets/card_field.dart'; +export 'package:stripe_platform_interface/models.dart'; \ No newline at end of file diff --git a/stripe/pubspec.lock b/stripe/pubspec.lock new file mode 100644 index 000000000..e8ce07638 --- /dev/null +++ b/stripe/pubspec.lock @@ -0,0 +1,175 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + stripe_ios: + dependency: "direct main" + description: + path: "../stripe_ios" + relative: true + source: path + version: "0.0.1" + stripe_platform_interface: + dependency: "direct main" + description: + path: "../stripe_platform_interface" + relative: true + source: path + version: "0.0.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.19" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" +sdks: + dart: ">=2.12.0-224.0.dev <3.0.0" + flutter: ">=1.20.0" diff --git a/stripe/pubspec.yaml b/stripe/pubspec.yaml new file mode 100644 index 000000000..21bd3735e --- /dev/null +++ b/stripe/pubspec.yaml @@ -0,0 +1,25 @@ +name: stripe +description: A new flutter plugin project. +version: 0.0.1 +author: +homepage: + +environment: + sdk: ">=2.12.0-224.0.dev <3.0.0" + flutter: ">=1.20.0" + +dependencies: + flutter: + sdk: flutter + stripe_platform_interface: + path: ../stripe_platform_interface/ + stripe_ios: + path: ../stripe_ios/ + +dev_dependencies: + flutter_test: + sdk: flutter + + + + diff --git a/stripe/stripe.iml b/stripe/stripe.iml new file mode 100644 index 000000000..429df7daf --- /dev/null +++ b/stripe/stripe.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stripe/test/stripe_test.dart b/stripe/test/stripe_test.dart new file mode 100644 index 000000000..ab459d7f7 --- /dev/null +++ b/stripe/test/stripe_test.dart @@ -0,0 +1,7 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stripe/stripe.dart'; + +void main() { + +} diff --git a/stripe_ios/.flutter-plugins b/stripe_ios/.flutter-plugins new file mode 100644 index 000000000..c5372b891 --- /dev/null +++ b/stripe_ios/.flutter-plugins @@ -0,0 +1,2 @@ +# This is a generated file; do not edit or check into version control. +stripe_ios=/Users/jaimeblasco/Documents/GitHub/stripe/stripe_ios/ diff --git a/stripe_ios/.flutter-plugins-dependencies b/stripe_ios/.flutter-plugins-dependencies new file mode 100644 index 000000000..3da264b69 --- /dev/null +++ b/stripe_ios/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"stripe_ios","path":"/Users/jaimeblasco/Documents/GitHub/stripe/stripe_ios/","dependencies":[]}],"android":[],"macos":[],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"stripe_ios","dependencies":[]}],"date_created":"2021-03-06 16:08:28.825306","version":"1.27.0-1.0.pre"} \ No newline at end of file diff --git a/stripe_ios/.gitignore b/stripe_ios/.gitignore new file mode 100644 index 000000000..e9dc58d3d --- /dev/null +++ b/stripe_ios/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/stripe_ios/.idea/libraries/Dart_SDK.xml b/stripe_ios/.idea/libraries/Dart_SDK.xml new file mode 100644 index 000000000..e4c26f523 --- /dev/null +++ b/stripe_ios/.idea/libraries/Dart_SDK.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stripe_ios/.idea/modules.xml b/stripe_ios/.idea/modules.xml new file mode 100644 index 000000000..0a2fe5092 --- /dev/null +++ b/stripe_ios/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stripe_ios/.idea/runConfigurations/example_lib_main_dart.xml b/stripe_ios/.idea/runConfigurations/example_lib_main_dart.xml new file mode 100644 index 000000000..5fd9159d1 --- /dev/null +++ b/stripe_ios/.idea/runConfigurations/example_lib_main_dart.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/stripe_ios/.idea/workspace.xml b/stripe_ios/.idea/workspace.xml new file mode 100644 index 000000000..1d7234627 --- /dev/null +++ b/stripe_ios/.idea/workspace.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe_ios/.metadata b/stripe_ios/.metadata new file mode 100644 index 000000000..a7d657644 --- /dev/null +++ b/stripe_ios/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 68c96f100e42ab3dbf43e61e9e2fc875a2d50cb8 + channel: dev + +project_type: plugin diff --git a/stripe_ios/CHANGELOG.md b/stripe_ios/CHANGELOG.md new file mode 100644 index 000000000..41cc7d819 --- /dev/null +++ b/stripe_ios/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/stripe_ios/LICENSE b/stripe_ios/LICENSE new file mode 100644 index 000000000..ba75c69f7 --- /dev/null +++ b/stripe_ios/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/stripe_ios/README.md b/stripe_ios/README.md new file mode 100644 index 000000000..2895d831b --- /dev/null +++ b/stripe_ios/README.md @@ -0,0 +1,15 @@ +# stripe_ios + +A new flutter plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/developing-packages/), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/stripe_ios/ios/.gitignore b/stripe_ios/ios/.gitignore new file mode 100644 index 000000000..aa479fd3c --- /dev/null +++ b/stripe_ios/ios/.gitignore @@ -0,0 +1,37 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig +/Flutter/flutter_export_environment.sh \ No newline at end of file diff --git a/stripe_ios/ios/Assets/.gitkeep b/stripe_ios/ios/Assets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/stripe_ios/ios/Classes/ApplePayButtonView.swift b/stripe_ios/ios/Classes/ApplePayButtonView.swift new file mode 100644 index 000000000..290526e69 --- /dev/null +++ b/stripe_ios/ios/Classes/ApplePayButtonView.swift @@ -0,0 +1,174 @@ +// +// ApplePayButtonView.swift +// stripe_ios +// +// Created by Jaime Blasco on 6/3/21. +// + +import Flutter +import UIKit + +class ApplePayButtonViewFactory: NSObject, FlutterPlatformViewFactory { + private var messenger: FlutterBinaryMessenger + + init(messenger: FlutterBinaryMessenger) { + self.messenger = messenger + super.init() + } + + func create( + withFrame frame: CGRect, + viewIdentifier viewId: Int64, + arguments args: Any? + ) -> FlutterPlatformView { + return ApplePayButtonView( + frame: frame, + viewIdentifier: viewId, + arguments: args, + binaryMessenger: messenger) + } + + func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { + return FlutterStandardMessageCodec.sharedInstance() + } +} + +class ApplePayButtonView: NSObject, FlutterPlatformView { + private var _view: UIView + var type: NSNumber? + var style: NSNumber? + + + private var applePayButton: PKPaymentButton? + + private let channel: FlutterMethodChannel + + @objc func handleApplePayButtonTapped() { + channel.invokeMethod("onPressed", arguments: nil) + } + + init( + frame: CGRect, + viewIdentifier viewId: Int64, + arguments args: Any?, + binaryMessenger messenger: FlutterBinaryMessenger + ) { + channel = FlutterMethodChannel(name: "flutter.stripe/apple_pay/\(viewId)", + binaryMessenger: messenger) + _view = FLEmbedView() + super.init() + if let arguments = args as? Dictionary { + type = arguments["type"] as? NSNumber + style = arguments["style"] as? NSNumber + } + // iOS views can be created here + createApplePayView() + channel.setMethodCallHandler(handle) + } + + + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "updateStyle": + if let arguments = call.arguments as? Dictionary { + self.type = arguments["type"] as? NSNumber + self.style = arguments["style"] as? NSNumber + } + + self.createApplePayView() + + result(nil) + default: + result(FlutterMethodNotImplemented) + } + } + + func view() -> UIView { + return _view + } + + func createApplePayView(){ + + if let applePayButton = self.applePayButton { + applePayButton.removeFromSuperview() + } + let paymentButtonType = PKPaymentButtonType(rawValue: self.type as? Int ?? 0) ?? .plain + let paymentButtonStyle = PKPaymentButtonStyle(rawValue: self.style as? Int ?? 2) ?? .black + self.applePayButton = PKPaymentButton(paymentButtonType: paymentButtonType, paymentButtonStyle: paymentButtonStyle) + + if let applePayButton = self.applePayButton { + applePayButton.frame = _view.frame + applePayButton.addTarget(self, action: #selector(handleApplePayButtonTapped), for: .touchUpInside) + _view.addSubview(applePayButton) + } + } + + + +} + + +class FLEmbedView : UIView { + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func layoutSubviews() { + for view in subviews { + view.frame = self.frame + } + super.layoutSubviews() + } +} + +// +// +//@objc(ApplePayButtonView) +//class ApplePayButtonView: UIView { +// var applePayButton: PKPaymentButton? +// +// @objc var onPressAction: RCTDirectEventBlock? +// @objc var type: NSNumber? +// @objc var buttonStyle: NSNumber? +// +// @objc func handleApplePayButtonTapped() { +// if onPressAction != nil { +// onPressAction!(["true": true]) +// } +// } +// +// override func didSetProps(_ changedProps: [String]!) { +// if let applePayButton = self.applePayButton { +// applePayButton.removeFromSuperview() +// } +// let paymentButtonType = PKPaymentButtonType(rawValue: self.type as? Int ?? 0) ?? .plain +// let paymentButtonStyle = PKPaymentButtonStyle(rawValue: self.buttonStyle as? Int ?? 2) ?? .black +// self.applePayButton = PKPaymentButton(paymentButtonType: paymentButtonType, paymentButtonStyle: paymentButtonStyle) +// +// if let applePayButton = self.applePayButton { +// applePayButton.addTarget(self, action: #selector(handleApplePayButtonTapped), for: .touchUpInside) +// self.addSubview(applePayButton) +// } +// } +// +// override init(frame: CGRect) { +// super.init(frame: frame) +// } +// +// override func layoutSubviews() { +// if let applePayButton = self.applePayButton { +// applePayButton.frame = self.bounds +// } +// } +// +// required init?(coder: NSCoder) { +// fatalError("init(coder:) has not been implemented") +// } +//} +// diff --git a/stripe_ios/ios/Classes/CardFieldView.swift b/stripe_ios/ios/Classes/CardFieldView.swift new file mode 100644 index 000000000..7e02e660d --- /dev/null +++ b/stripe_ios/ios/Classes/CardFieldView.swift @@ -0,0 +1,335 @@ +// +// CardFieldView.swift +// stripe_ios +// +// Created by Jaime Blasco on 7/3/21. +// + +import Foundation +import UIKit +import Stripe + + +class CardFieldViewFactory: NSObject, FlutterPlatformViewFactory { + private var messenger: FlutterBinaryMessenger + + init(messenger: FlutterBinaryMessenger) { + self.messenger = messenger + super.init() + } + + func create( + withFrame frame: CGRect, + viewIdentifier viewId: Int64, + arguments args: Any? + ) -> FlutterPlatformView { + return FlutterCardFieldView( + frame: frame, + viewIdentifier: viewId, + arguments: args, + binaryMessenger: messenger) + } + + func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { + return FlutterStandardMessageCodec.sharedInstance() + } +} + + + +class FlutterCardFieldView: NSObject, FlutterPlatformView { + private var _view: UIView + + + + private var cardFieldView: CardFieldView? + + private let channel: FlutterMethodChannel + + init( + frame: CGRect, + viewIdentifier viewId: Int64, + arguments args: Any?, + binaryMessenger messenger: FlutterBinaryMessenger + ) { + channel = FlutterMethodChannel(name: "flutter.stripe/card_field/\(viewId)", + binaryMessenger: messenger) + _view = FLEmbedView() + super.init() + + + // iOS views can be created here + createNativeView() + channel.setMethodCallHandler(handle) + if let arguments = args as? [String: Any] { + onPostalCodeChange(arguments) + onDecorationChange(arguments) + } + } + + + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "onPostalCodeEnabledChanged": + if let arguments = call.arguments as? [String : Any] { + onPostalCodeChange(arguments) + } + result(nil) + case "onDecorationChanged": + if let arguments = call.arguments as? [String : Any] { + onDecorationChange(arguments) + } + result(nil) + case "focus": + cardFieldView?.focus() + result(nil) + case "clearFocus": + cardFieldView?.clearFocus() + result(nil) + default: + result(FlutterMethodNotImplemented) + } + } + + func view() -> UIView { + return _view + } + + func createNativeView(){ + + if let cardFieldView = self.cardFieldView { + cardFieldView.removeFromSuperview() + } + + self.cardFieldView = CardFieldView(frame: CGRect.zero, delegate: self) + + if let cardFieldView = self.cardFieldView { + _view.addSubview(cardFieldView) + } + } + + func onFocusChange(_ arguments: [String: Any]) { + channel.invokeMethod("onFocusChange", arguments: arguments) + } + + func onCardChange(_ arguments: [String: Any]) { + channel.invokeMethod("onCardChange", arguments: arguments) + } + + func onPostalCodeChange(_ arguments: [String: Any]) { + if let postalCodeEnabled = arguments["enablePostalCode"] as? Bool { + cardFieldView?.postalCodeEnabled = postalCodeEnabled + } + } + + func onDecorationChange(_ arguments: [String: Any]) { + var backgroundColor: UIColor? + var textColor: UIColor? + var placeholderColor: UIColor? + var borderColor: UIColor? + var borderWidth: CGFloat? + var borderRadius: CGFloat? + var textErrorColor: UIColor? + if let decoration = arguments["decoration"] as? [String : Any] { + + if let argb = decoration["backgroundColor"] as? UInt { + backgroundColor = UIColor.init(argb: argb) + } + if let argb = decoration["textColor"] as? UInt { + textColor = UIColor.init(argb: argb) + } + if let argb = decoration["placeholderColor"] as? UInt { + placeholderColor = UIColor.init(argb: argb) + } + if let argb = decoration["borderColor"] as? UInt { + borderColor = UIColor.init(argb: argb) + } + if let argb = decoration["textErrorColor"] as? UInt { + textErrorColor = UIColor.init(argb: argb) + } + borderWidth = decoration["borderWidth"] as? CGFloat + borderRadius = decoration["borderRadius"] as? CGFloat + } + cardFieldView?.cardBackgroundColor = backgroundColor + cardFieldView?.textColor = textColor + cardFieldView?.placeholderColor = placeholderColor + cardFieldView?.borderColor = borderColor + cardFieldView?.borderWidth = borderWidth + cardFieldView?.textErrorColor = textErrorColor + cardFieldView?.borderRadius = borderRadius + } + + +} + +extension FlutterCardFieldView : STPPaymentCardTextFieldDelegate { + func paymentCardTextFieldDidBeginEditingNumber(_ textField: STPPaymentCardTextField) { + onFocusChange(["focusedField": "cardNumber"]) + } + + func paymentCardTextFieldDidBeginEditingCVC(_ textField: STPPaymentCardTextField) { + onFocusChange(["focusedField": "cvc"]) + } + + func paymentCardTextFieldDidBeginEditingExpiration(_ textField: STPPaymentCardTextField) { + onFocusChange(["focusedField": "expiryDate"]) + } + + func paymentCardTextFieldDidBeginEditingPostalCode(_ textField: STPPaymentCardTextField) { + onFocusChange(["focusedField": "postalCode"]) + } + + func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) { + if let cardFieldView = cardFieldView { + let brand = STPCardValidator.brand(forNumber: textField.cardParams.number ?? "") + var cardData: [String: Any] = [ + "number": textField.cardParams.number ?? "", + "cvc": textField.cardParams.cvc ?? "", + "expiryMonth": textField.cardParams.expMonth ?? 0, + "expiryYear": textField.cardParams.expYear ?? 0, + "complete": textField.isValid, + "brand": Mappers.mapCardBrand(brand), + "last4": textField.cardParams.last4 ?? "" + ] + if (cardFieldView.postalCodeEnabled) { + cardData["postalCode"] = textField.postalCode ?? "" + } + onCardChange(cardData) + } + } + +} + + +class CardFieldView: UIView { + + private var cardField = STPPaymentCardTextField() + + @objc var postalCodeEnabled: Bool = true { + didSet { + cardField.postalCodeEntryEnabled = postalCodeEnabled + } + } + + init(frame: CGRect, delegate: STPPaymentCardTextFieldDelegate) { + super.init(frame: frame) + cardField.delegate = delegate + self.addSubview(cardField) + } + + + override func layoutSubviews() { + cardField.frame = self.bounds + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public var cardBackgroundColor: UIColor? { + get { + return cardField.backgroundColor + } + set { + cardField.backgroundColor = newValue + } + } + + @objc public var textColor: UIColor? { + get { + return cardField.textColor + } + set { + var defaultColor: UIColor = .black + if #available(iOS 13.0, *) { + defaultColor = .label + } + + cardField.textColor = newValue ?? defaultColor + } + } + + @objc public var placeholderColor: UIColor? { + get { + return cardField.placeholderColor + } + set { + cardField.placeholderColor = newValue ?? CardFieldView.placeholderGrayColor + } + } + + @objc public var borderColor: UIColor? { + get { + return cardField.borderColor + } + set { + cardField.borderColor = newValue ?? CardFieldView.placeholderGrayColor + } + } + + @objc public var textErrorColor: UIColor? { + get { + return cardField.textErrorColor + } + set { + var defaultColor: UIColor = .red + if #available(iOS 13.0, *) { + defaultColor = .systemRed + } + + cardField.textErrorColor = newValue ?? defaultColor + } + } + + public var borderWidth: CGFloat? { + get { + return cardField.borderWidth + } + set { + cardField.borderWidth = newValue ?? 1.0 + } + } + + public var borderRadius: CGFloat? { + get { + return cardField.cornerRadius + } + set { + cardField.cornerRadius = newValue ?? 5.0 + } + } + + + static let placeholderGrayColor: UIColor = { + if #available(iOS 13.0, *) { + return .systemGray2 + } + return .lightGray + }() + + func paymentContext(_ paymentContext: STPPaymentContext, didFailToLoadWithError error: Error) { + // + } + + func paymentContextDidChange(_ paymentContext: STPPaymentContext) { + // + } + + func paymentContext(_ paymentContext: STPPaymentContext, didCreatePaymentResult paymentResult: STPPaymentResult, completion: @escaping STPPaymentStatusBlock) { + // + } + + func paymentContext(_ paymentContext: STPPaymentContext, didFinishWith status: STPPaymentStatus, error: Error?) { + // + } + + + func focus() { + cardField.becomeFirstResponder() + } + + func clearFocus() { + cardField.resignFirstResponder() + } +} diff --git a/stripe_ios/ios/Classes/Errors.swift b/stripe_ios/ios/Classes/Errors.swift new file mode 100644 index 000000000..38c9bd787 --- /dev/null +++ b/stripe_ios/ios/Classes/Errors.swift @@ -0,0 +1,36 @@ +enum ConfirmPaymentErrorType: String { + case Failed, Canceled, Unknown +} + +enum ApplePayErrorType: String { + case Failed, Canceled, Unknown +} + +enum NextPaymentActionErrorType: String { + case Failed, Canceled, Unknown +} + +enum ConfirmSetupIntentErrorType: String { + case Failed, Canceled, Unknown +} + +enum RetrievePaymentIntentErrorType: String { + case Unknown +} + +enum PaymentSheetErrorType: String { + case Failed, Canceled +} + + +class Errors { + class func createError (code: String, message: String) -> NSDictionary { + let error: NSDictionary = [ + "code": code, + "message": message, + ] + + return error + } + +} diff --git a/stripe_ios/ios/Classes/Mappers.swift b/stripe_ios/ios/Classes/Mappers.swift new file mode 100644 index 000000000..6a5081820 --- /dev/null +++ b/stripe_ios/ios/Classes/Mappers.swift @@ -0,0 +1,507 @@ +import Stripe + +class Mappers { + class func mapToPKContactField(field: String) -> PKContactField { + switch field { + case "emailAddress": return PKContactField.emailAddress + case "name": return PKContactField.name + case "phoneNumber": return PKContactField.phoneNumber + case "phoneticName": return PKContactField.phoneticName + case "postalAddress": return PKContactField.postalAddress + default: return PKContactField.name + } + } + + class func mapToShippingMethodType(type: String?) -> PKPaymentSummaryItemType { + if let type = type { + switch type { + case "pending": return PKPaymentSummaryItemType.pending + case "final": return PKPaymentSummaryItemType.final + default: return PKPaymentSummaryItemType.final + } + } + return PKPaymentSummaryItemType.final + } + + class func mapToShippingMethods(shippingMethods: NSArray?) -> [PKShippingMethod] { + var shippingMethodsList: [PKShippingMethod] = [] + + if let methods = shippingMethods as? [[String : Any]] { + for method in methods { + let label = method["label"] as? String ?? "" + let amount = NSDecimalNumber(string: method["amount"] as? String ?? "") + let identifier = method["identifier"] as! String + let detail = method["detail"] as? String ?? "" + let type = Mappers.mapToShippingMethodType(type: method["type"] as? String) + let pm = PKShippingMethod.init(label: label, amount: amount, type: type) + pm.identifier = identifier + pm.detail = detail + shippingMethodsList.append(pm) + } + } + + return shippingMethodsList + } + + + class func mapIntentStatus(status: STPPaymentIntentStatus?) -> String { + if let status = status { + switch status { + case STPPaymentIntentStatus.succeeded: return "Succeeded" + case STPPaymentIntentStatus.requiresPaymentMethod: return "RequiresPaymentMethod" + case STPPaymentIntentStatus.requiresConfirmation: return "RequiresConfirmation" + case STPPaymentIntentStatus.canceled: return "Canceled" + case STPPaymentIntentStatus.processing: return "Processing" + case STPPaymentIntentStatus.requiresAction: return "RequiresAction" + case STPPaymentIntentStatus.requiresCapture: return "RequiresCapture" + default: return "Unknown" + } + } + return "Unknown" + } + + class func mapPaymentMethodType(type: STPPaymentMethodType) -> String { + switch type { + case STPPaymentMethodType.card: return "Card" + case STPPaymentMethodType.alipay: return "Alipay" + case STPPaymentMethodType.grabPay: return "GrabPay" + case STPPaymentMethodType.iDEAL: return "Ideal" + case STPPaymentMethodType.FPX: return "Fpx" + case STPPaymentMethodType.cardPresent: return "CardPresent" + case STPPaymentMethodType.SEPADebit: return "SepaDebit" + case STPPaymentMethodType.AUBECSDebit: return "AuBecsDebit" + case STPPaymentMethodType.bacsDebit: return "BacsDebit" + case STPPaymentMethodType.giropay: return "Giropay" + case STPPaymentMethodType.przelewy24: return "P24" + case STPPaymentMethodType.EPS: return "Eps" + case STPPaymentMethodType.bancontact: return "Bancontact" + case STPPaymentMethodType.OXXO: return "Oxxo" + case STPPaymentMethodType.sofort: return "Sofort" + case STPPaymentMethodType.UPI: return "Upi" + case STPPaymentMethodType.unknown: return "Unknown" + default: return "Unknown" + } + } + + class func mapCardParamsToPaymentMethodParams(params: NSDictionary, billingDetails: STPPaymentMethodBillingDetails?) -> STPPaymentMethodParams { + let cardSourceParams = STPCardParams() + cardSourceParams.number = params["number"] as? String + cardSourceParams.cvc = params["cvc"] as? String + cardSourceParams.expMonth = params["expiryMonth"] as! UInt + cardSourceParams.expYear = params["expiryYear"] as! UInt + + let cardParams = STPPaymentMethodCardParams(cardSourceParams: cardSourceParams) + return STPPaymentMethodParams(card: cardParams, billingDetails: billingDetails, metadata: nil) + } + + + class func mapCaptureMethod(_ captureMethod: STPPaymentIntentCaptureMethod?) -> String { + if let captureMethod = captureMethod { + switch captureMethod { + case STPPaymentIntentCaptureMethod.automatic: return "Automatic" + case STPPaymentIntentCaptureMethod.manual: return "Manual" + default: return "Unknown" + } + } + return "Unknown" + } + + class func mapConfirmationMethod(_ confirmationMethod: STPPaymentIntentConfirmationMethod?) -> String { + if let confirmationMethod = confirmationMethod { + switch confirmationMethod { + case STPPaymentIntentConfirmationMethod.automatic: return "Automatic" + case STPPaymentIntentConfirmationMethod.manual: return "Manual" + default: return "Unknown" + } + } + return "Unknown" + } + + class func mapIntentShipping(_ shipping: STPPaymentIntentShippingDetails) -> NSDictionary { + var addressDetails = NSDictionary() + if let address = shipping.address { + addressDetails = [ + "city": address.city ?? NSNull(), + "country": address.country ?? NSNull(), + "line1": address.line1 ?? NSNull(), + "line2":address.line2 ?? NSNull(), + "postalCode": address.postalCode ?? NSNull(), + ] + } + let shippingDetails: NSDictionary = [ + "address": addressDetails, + "name": shipping.name ?? NSNull(), + "phone": shipping.phone ?? NSNull(), + "trackingNumber": shipping.trackingNumber ?? NSNull(), + "carrier": shipping.carrier ?? NSNull(), + ] + return shippingDetails + } + + class func mapFromPaymentIntent (paymentIntent: STPPaymentIntent) -> NSDictionary { + let intent: NSMutableDictionary = [ + "id": paymentIntent.stripeId, + "currency": paymentIntent.currency, + "status": Mappers.mapIntentStatus(status: paymentIntent.status), + "description": paymentIntent.description, + "clientSecret": paymentIntent.clientSecret, + "receiptEmail": paymentIntent.receiptEmail ?? NSNull(), + "livemode": paymentIntent.livemode, + "paymentMethodId": paymentIntent.paymentMethodId ?? NSNull(), + "captureMethod": mapCaptureMethod(paymentIntent.captureMethod), + "confirmationMethod": mapConfirmationMethod(paymentIntent.confirmationMethod), + "created": convertDateToUnixTimestamp(date: paymentIntent.created), + "amount": paymentIntent.amount, + "lastPaymentError": NSNull(), + "shipping": NSNull(), + "canceledAt": NSNull() + ] + + if let lastPaymentError = paymentIntent.lastPaymentError { + let paymentError: NSMutableDictionary = [ + "code": lastPaymentError.code ?? NSNull(), + "message": lastPaymentError.message ?? NSNull(), + "type": mapFromPaymentIntentLastPaymentErrorType(lastPaymentError.type) + ] + + if let paymentMethod = paymentIntent.lastPaymentError?.paymentMethod { + paymentError.setValue(mapFromPaymentMethod(paymentMethod), forKey: "paymentMethod") + } + intent.setValue(paymentError, forKey: "lastPaymentError") + } + + if let shipping = paymentIntent.shipping { + intent.setValue(mapIntentShipping(shipping), forKey: "shipping") + } + + if let canceledAt = paymentIntent.canceledAt { + intent.setValue(convertDateToUnixTimestamp(date: canceledAt), forKey: "canceledAt") + } + + return intent; + } + + class func mapFromPaymentIntentLastPaymentErrorType(_ errorType: STPPaymentIntentLastPaymentErrorType?) -> String { + if let errorType = errorType { + switch errorType { + case STPPaymentIntentLastPaymentErrorType.apiConnection: return "ApiConnection" + case STPPaymentIntentLastPaymentErrorType.api: return "Api" + case STPPaymentIntentLastPaymentErrorType.authentication: return "Authentication" + case STPPaymentIntentLastPaymentErrorType.card: return "Card" + case STPPaymentIntentLastPaymentErrorType.idempotency: return "Idempotency" + case STPPaymentIntentLastPaymentErrorType.invalidRequest: return "InvalidRequest" + case STPPaymentIntentLastPaymentErrorType.rateLimit: return "RateLimit" + case STPPaymentIntentLastPaymentErrorType.unknown: return "Unknown" + default: return "Unknown" + } + } + return "Unknown" + } + + class func mapToBillingDetails(billingDetails: NSDictionary) -> STPPaymentMethodBillingDetails { + let billing = STPPaymentMethodBillingDetails() + billing.email = billingDetails["email"] as? String + billing.phone = billingDetails["phone"] as? String + billing.name = billingDetails["name"] as? String + + let billingAddres = STPPaymentMethodAddress() + + billingAddres.city = billingDetails["addressCity"] as? String + billingAddres.postalCode = billingDetails["addressPostalCode"] as? String + billingAddres.country = billingDetails["addressCountry"] as? String + billingAddres.line1 = billingDetails["addressLine1"] as? String + billingAddres.line2 = billingDetails["addressLine2"] as? String + billingAddres.state = billingDetails["addressState"] as? String + + billing.address = billingAddres + + return billing + } + + class func mapFromBillingDetails(billingDetails: STPPaymentMethodBillingDetails?) -> NSDictionary { + let billing: NSDictionary = [ + "email": billingDetails?.email ?? NSNull(), + "phone": billingDetails?.phone ?? NSNull(), + "name": billingDetails?.name ?? NSNull(), + "address": [ + "city": billingDetails?.address?.city, + "postalCode": billingDetails?.address?.postalCode, + "country": billingDetails?.address?.country, + "line1": billingDetails?.address?.line1, + "line2": billingDetails?.address?.line2, + "state": billingDetails?.address?.state, + ], + ] + + return billing + } + + class func mapCardBrand(_ brand: STPCardBrand?) -> String { + if let brand = brand { + switch brand { + case STPCardBrand.visa: return "visa" + case STPCardBrand.amex: return "americanExpress" + case STPCardBrand.mastercard: return "masterCard" + case STPCardBrand.discover: return "discover" + case STPCardBrand.JCB: return "jCB" + case STPCardBrand.dinersClub: return "dinersClub" + case STPCardBrand.unionPay: return "unionPay" + case STPCardBrand.unknown: return "unknown" + default: return "unknown" + } + } + return "unknown" + } + + class func mapFromPaymentMethod(_ paymentMethod: STPPaymentMethod) -> NSDictionary { + let card: NSDictionary = [ + "brand": Mappers.mapCardBrand(paymentMethod.card?.brand), + "country": paymentMethod.card?.country ?? NSNull(), + "expYear": paymentMethod.card?.expYear ?? NSNull(), + "expMonth": paymentMethod.card?.expMonth ?? NSNull(), + "fingerprint": paymentMethod.card?.fingerprint ?? NSNull(), + "funding": paymentMethod.card?.funding ?? NSNull(), + "last4": paymentMethod.card?.last4 ?? NSNull() + ] + let sepaDebit: NSDictionary = [ + "bankCode": paymentMethod.sepaDebit?.bankCode ?? NSNull(), + "country": paymentMethod.sepaDebit?.country ?? NSNull(), + "fingerprint": paymentMethod.sepaDebit?.fingerprint ?? NSNull(), + "last4": paymentMethod.sepaDebit?.last4 ?? NSNull(), + ] + let bacsDebit: NSDictionary = [ + "fingerprint": paymentMethod.bacsDebit?.fingerprint ?? NSNull(), + "last4": paymentMethod.bacsDebit?.last4 ?? NSNull(), + "sortCode": paymentMethod.bacsDebit?.sortCode ?? NSNull() + ] + let auBECSDebit: NSDictionary = [ + "bsbNumber": paymentMethod.auBECSDebit?.bsbNumber ?? NSNull(), + "fingerprint": paymentMethod.auBECSDebit?.fingerprint ?? NSNull(), + "last4": paymentMethod.auBECSDebit?.last4 ?? NSNull() + ] + let method: NSDictionary = [ + "id": paymentMethod.stripeId, + "type": Mappers.mapPaymentMethodType(type: paymentMethod.type), + "livemode": paymentMethod.liveMode, + "customerId": paymentMethod.customerId ?? NSNull(), + "billingDetails": Mappers.mapFromBillingDetails(billingDetails: paymentMethod.billingDetails), + "Card": card, + "Ideal": [ + "bankIdentifierCode": paymentMethod.iDEAL?.bankIdentifierCode ?? "", + "bankName": paymentMethod.iDEAL?.bankName ?? "" + ], + "Fpx": [ + "bank": paymentMethod.fpx?.bankIdentifierCode ?? "", + ], + "SepaDebit": sepaDebit, + "BacsDebit": bacsDebit, + "AuBecsDebit": auBECSDebit, + "Sofort": [ + "country": paymentMethod.sofort?.country + ], + "Upi": [ + "vpa": paymentMethod.upi?.vpa + ], + ] + return method + } + + class func mapCardParams(params: NSDictionary) -> STPPaymentMethodCardParams { + let cardSourceParams = STPCardParams() + cardSourceParams.number = params["number"] as? String + cardSourceParams.cvc = params["cvc"] as? String + cardSourceParams.expMonth = params["expiryMonth"] as! UInt + cardSourceParams.expYear = params["expiryYear"] as! UInt + return STPPaymentMethodCardParams(cardSourceParams: cardSourceParams) + } + + class func mapIntentStatus(status: STPSetupIntentStatus?) -> String { + if let status = status { + switch status { + case STPSetupIntentStatus.succeeded: return "Succeeded" + case STPSetupIntentStatus.requiresPaymentMethod: return "RequiresPaymentMethod" + case STPSetupIntentStatus.requiresConfirmation: return "RequiresConfirmation" + case STPSetupIntentStatus.canceled: return "Canceled" + case STPSetupIntentStatus.processing: return "Processing" + case STPSetupIntentStatus.requiresAction: return "RequiresAction" + case STPSetupIntentStatus.unknown: return "Unknown" + default: return "Unknown" + } + } + return "Unknown" + } + + class func mapFromSetupIntentUsage(usage: STPSetupIntentUsage?) -> String { + if let usage = usage { + switch usage { + case STPSetupIntentUsage.none: return "None" + case STPSetupIntentUsage.offSession: return "OffSession" + case STPSetupIntentUsage.onSession: return "OnSession" + case STPSetupIntentUsage.unknown: return "Unknown" + default: return "Unknown" + } + } + return "Unknown" + } + + class func mapToPaymentIntentFutureUsage(usage: String?) -> STPPaymentIntentSetupFutureUsage { + if let usage = usage { + switch usage { + case "None": return STPPaymentIntentSetupFutureUsage.none + case "OffSession": return STPPaymentIntentSetupFutureUsage.offSession + case "OnSession": return STPPaymentIntentSetupFutureUsage.onSession + case "Unknown": return STPPaymentIntentSetupFutureUsage.unknown + default: return STPPaymentIntentSetupFutureUsage.unknown + } + } + return STPPaymentIntentSetupFutureUsage.unknown + } + + class func mapFromSetupIntent(setupIntent: STPSetupIntent) -> NSDictionary { + let intent: NSMutableDictionary = [ + "id": setupIntent.stripeID, + "clientSecret": setupIntent.clientSecret, + "status": mapIntentStatus(status: setupIntent.status), + "description": setupIntent.stripeDescription ?? NSNull(), + "livemode": setupIntent.livemode, + "paymentMethodTypes": NSArray(), + "usage": mapFromSetupIntentUsage(usage: setupIntent.usage), + "paymentMethodId": setupIntent.paymentMethodID ?? NSNull(), + "created": NSNull(), + "lastSetupError": NSNull() + ] + + if let paymentMethodTypes = setupIntent.paymentMethodTypes { + let types = paymentMethodTypes.map { + mapPaymentMethodType(type: STPPaymentMethodType.init(rawValue: Int(truncating: $0))!) + } + intent.setValue(types, forKey: "paymentMethodTypes") + } + + if let created = setupIntent.created { + intent.setValue(convertDateToUnixTimestamp(date: created), forKey: "created") + } + + if let lastSetupError = setupIntent.lastSetupError { + let setupError = [ + "code": lastSetupError.code, + "message": lastSetupError.description + ] + intent.setValue(setupError, forKey: "lastSetupError") + } + + + return intent + } + + @available(iOS 13.0, *) + class func mapToUserInterfaceStyle(_ style: String) -> PaymentSheet.UserInterfaceStyle { + switch style { + case "alwaysDark": return PaymentSheet.UserInterfaceStyle.alwaysDark + case "alwaysLight": return PaymentSheet.UserInterfaceStyle.alwaysLight + default: return PaymentSheet.UserInterfaceStyle.automatic + } + } + + class func mapUICustomization(_ params: NSDictionary) -> STPThreeDSUICustomization { + let uiCustomization = STPThreeDSUICustomization() + if let labelSettings = params["label"] as? Dictionary { + if let headingTextColor = labelSettings["headingTextColor"] as? String { + uiCustomization.labelCustomization.headingTextColor = UIColor(hexString: headingTextColor) + } + if let textColor = labelSettings["textColor"] as? String { + uiCustomization.labelCustomization.textColor = UIColor(hexString: textColor) + } + if let headingFontSize = labelSettings["headingFontSize"] as? Int { + uiCustomization.labelCustomization.headingFont = UIFont.systemFont(ofSize: CGFloat(headingFontSize)) + } + if let textFontSize = labelSettings["textFontSize"] as? Int { + uiCustomization.labelCustomization.font = UIFont.systemFont(ofSize: CGFloat(textFontSize)) + } + } + + if let navigationBarSettings = params["navigationBar"] as? Dictionary { + if let barTintColor = navigationBarSettings["barTintColor"] as? String { + uiCustomization.navigationBarCustomization.barTintColor = UIColor(hexString: barTintColor) + } + if let barStyle = navigationBarSettings["barStyle"] as? Int { + uiCustomization.navigationBarCustomization.barStyle = UIBarStyle(rawValue: barStyle) ?? .default + } + if let headerText = navigationBarSettings["headerText"] as? String { + uiCustomization.navigationBarCustomization.headerText = headerText + } + if let buttonText = navigationBarSettings["buttonText"] as? String { + uiCustomization.navigationBarCustomization.buttonText = buttonText + } + if let textFontSize = navigationBarSettings["textFontSize"] as? Int { + uiCustomization.navigationBarCustomization.font = UIFont.systemFont(ofSize: CGFloat(textFontSize)) + } + if let textColor = navigationBarSettings["textColor"] as? String { + uiCustomization.navigationBarCustomization.textColor = UIColor(hexString: textColor) + } + if let translucent = navigationBarSettings["translucent"] as? Bool { + uiCustomization.navigationBarCustomization.translucent = translucent + } + } + + if let textFieldSettings = params["textField"] as? Dictionary { + if let borderColor = textFieldSettings["borderColor"] as? String { + uiCustomization.textFieldCustomization.borderColor = UIColor(hexString: borderColor) + } + if let borderWidth = textFieldSettings["borderWidth"] as? Int { + uiCustomization.textFieldCustomization.borderWidth = CGFloat(borderWidth) + } + if let cornerRadius = textFieldSettings["cornerRadius"] as? Int { + uiCustomization.textFieldCustomization.cornerRadius = CGFloat(cornerRadius) + } + if let textColor = textFieldSettings["textColor"] as? String { + uiCustomization.textFieldCustomization.textColor = UIColor(hexString: textColor) + } + if let textFontSize = textFieldSettings["textFontSize"] as? Int { + uiCustomization.textFieldCustomization.font = UIFont.systemFont(ofSize: CGFloat(textFontSize)) + } + } + + if let footerSettings = params["footer"] as? Dictionary { + if let backgroundColor = footerSettings["backgroundColor"] as? String { + uiCustomization.footerCustomization.backgroundColor = UIColor(hexString: backgroundColor) + } + if let chevronColor = footerSettings["chevronColor"] as? String { + uiCustomization.footerCustomization.chevronColor = UIColor(hexString: chevronColor) + } + if let headingTextColor = footerSettings["headingTextColor"] as? String { + uiCustomization.footerCustomization.headingTextColor = UIColor(hexString: headingTextColor) + } + if let textColor = footerSettings["textColor"] as? String { + uiCustomization.footerCustomization.textColor = UIColor(hexString: textColor) + } + } + + if let submitButtonSettings = params["submitButton"] as? Dictionary { + let buttonCustomization = uiCustomization.buttonCustomization(for: STPThreeDSCustomizationButtonType.submit) + + if let backgroundColor = submitButtonSettings["backgroundColor"] as? String { + buttonCustomization.backgroundColor = UIColor(hexString: backgroundColor) + } + if let cornerRadius = submitButtonSettings["cornerRadius"] as? Int { + buttonCustomization.cornerRadius = CGFloat(cornerRadius) + } + if let textFontSize = submitButtonSettings["textFontSize"] as? Int { + buttonCustomization.font = UIFont.systemFont(ofSize: CGFloat(textFontSize)) + } + if let textColor = submitButtonSettings["textColor"] as? String { + buttonCustomization.textColor = UIColor(hexString: textColor) + } + } + + if let backgroundColor = params["backgroundColor"] as? String { + uiCustomization.backgroundColor = UIColor(hexString: backgroundColor) + } + + return uiCustomization + } + + class func convertDateToUnixTimestamp(date: Date) -> UInt64 { + return UInt64(date.timeIntervalSince1970 * 1000.0) + } +} diff --git a/stripe_ios/ios/Classes/StripeIosPlugin.h b/stripe_ios/ios/Classes/StripeIosPlugin.h new file mode 100644 index 000000000..a713c02d0 --- /dev/null +++ b/stripe_ios/ios/Classes/StripeIosPlugin.h @@ -0,0 +1,5 @@ +#import +#import + +@interface StripeIosPlugin : NSObject +@end diff --git a/stripe_ios/ios/Classes/StripeIosPlugin.m b/stripe_ios/ios/Classes/StripeIosPlugin.m new file mode 100644 index 000000000..26b425169 --- /dev/null +++ b/stripe_ios/ios/Classes/StripeIosPlugin.m @@ -0,0 +1,16 @@ +#import "StripeIosPlugin.h" +#if __has_include() +#import +#else +// Support project import fallback if the generated compatibility header +// is not copied when this plugin is created as a library. +// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 +#import "stripe_ios-Swift.h" +#endif + +@implementation StripeIosPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftStripeIosPlugin registerWithRegistrar:registrar]; + +} +@end diff --git a/stripe_ios/ios/Classes/StripeSdk.m b/stripe_ios/ios/Classes/StripeSdk.m new file mode 100644 index 000000000..d965f0e2c --- /dev/null +++ b/stripe_ios/ios/Classes/StripeSdk.m @@ -0,0 +1,71 @@ +//#import +// +//@interface RCT_EXTERN_MODULE(StripeSdk, NSObject) +// +//RCT_EXTERN_METHOD( +// initialise:(NSString *)publishableKey +// appInfo: (NSDictionary *)appInfo +// stripeAccountId: (NSString *)stripeAccountId +// params: (NSDictionary *)params +// merchantIdentifier: (NSString *)merchantIdentifier +// ) +// +//RCT_EXTERN_METHOD( +// isApplePaySupported: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject) +// +//RCT_EXTERN_METHOD( +// presentApplePay:(NSDictionary *)params +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject) +// +//RCT_EXTERN_METHOD( +// createTokenForCVCUpdate:(NSString *)cvc +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject) +// +//RCT_EXTERN_METHOD( +// confirmApplePayPayment:(NSString *)clientSecret +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject +// ) +// +//RCT_EXTERN_METHOD( +// createPaymentMethod:(NSDictionary *)data +// options:(NSDictionary *)options +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject +// ) +// +//RCT_EXTERN_METHOD( +// retrievePaymentIntent:(NSString *)clientSecret +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject +// ) +// +//RCT_EXTERN_METHOD( +// handleCardAction:(NSString *)paymentIntentClientSecret +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject +// ) +// +//RCT_EXTERN_METHOD( +// confirmPaymentMethod:(NSString *)paymentIntentClientSecret +// data:(NSDictionary *)data +// options:(NSDictionary *)options +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject +// ) +//RCT_EXTERN_METHOD(configure3dSecure:(NSDictionary *)params) +// +// +//RCT_EXTERN_METHOD( +// confirmSetupIntent:(NSString *)setupIntentClientSecret +// data:(NSDictionary *)data +// options:(NSDictionary *)options +// resolver: (RCTPromiseResolveBlock)resolve +// rejecter: (RCTPromiseRejectBlock)reject +// ) +// +// +//@end diff --git a/stripe_ios/ios/Classes/StripeSdk.swift b/stripe_ios/ios/Classes/StripeSdk.swift new file mode 100644 index 000000000..99c0386d5 --- /dev/null +++ b/stripe_ios/ios/Classes/StripeSdk.swift @@ -0,0 +1,343 @@ +//import PassKit +//import Stripe +// +//@objc(StripeSdk) +//class StripeSdk: NSObject, STPApplePayContextDelegate { +// var merchantIdentifier: String? = nil +// +// var applePayCompletionCallback: STPIntentClientSecretCompletionBlock? = nil +// var applePayRequestResolver: RCTPromiseResolveBlock? = nil +// var applePayRequestRejecter: RCTPromiseRejectBlock? = nil +// var applePayCompletionRejecter: RCTPromiseRejectBlock? = nil +// var confirmSetupIntentPromise: RCTResponseSenderBlock? = nil +// var confirmApplePayPaymentResolver: RCTPromiseResolveBlock? = nil +// +// @objc static func requiresMainQueueSetup() -> Bool { +// return false +// } +// +// @objc(initialise:appInfo:stripeAccountId:params:merchantIdentifier:) +// func initialise(publishableKey: String, appInfo: NSDictionary, stripeAccountId: String?, params: NSDictionary?, merchantIdentifier: String?) -> Void { +// if let params = params { +// configure3dSecure(params) +// } +// STPAPIClient.shared.publishableKey = publishableKey +// STPAPIClient.shared.stripeAccount = stripeAccountId +// +// let name = RCTConvert.nsString(appInfo["name"]) ?? "" +// let partnerId = RCTConvert.nsString(appInfo["partnerId"]) ?? "" +// let version = RCTConvert.nsString(appInfo["version"]) ?? "" +// let url = RCTConvert.nsString(appInfo["url"]) ?? "" +// +// STPAPIClient.shared.appInfo = STPAppInfo(name: name, partnerId: partnerId, version: version, url: url) +// self.merchantIdentifier = merchantIdentifier +// } +// +// @objc(createTokenForCVCUpdate:resolver:rejecter:) +// func createTokenForCVCUpdate(cvc: String?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { +// guard let cvc = cvc else { +// reject("Failed", "You must provide CVC", nil) +// return; +// } +// +// STPAPIClient.shared.createToken(forCVCUpdate: cvc) { (token, error) in +// if error != nil || token == nil { +// reject("Failed", error?.localizedDescription, nil) +// } else { +// let tokenId = token?.tokenId +// resolve(tokenId) +// } +// } +// } +// +// @objc(confirmSetupIntent:data:options:resolver:rejecter:) +// func confirmSetupIntent (setupIntentClientSecret: String, data: NSDictionary, +// options: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock) { +// var billing: STPPaymentMethodBillingDetails? = nil +// if let billingDetails = data["billingDetails"] as? NSDictionary { +// billing = Mappers.mapToBillingDetails(billingDetails: billingDetails) +// } +// let cardParams = Mappers.mapCardParams(params: data["cardDetails"] as! NSDictionary) +// +// let paymentMethodParams = STPPaymentMethodParams(card: cardParams, billingDetails: billing, metadata: nil) +// let setupIntentParams = STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret) +// setupIntentParams.paymentMethodParams = paymentMethodParams +// +// let paymentHandler = STPPaymentHandler.shared() +// paymentHandler.confirmSetupIntent(setupIntentParams, with: self) { status, setupIntent, error in +// switch (status) { +// case .failed: +// reject(ConfirmSetupIntentErrorType.Failed.rawValue, error?.localizedDescription ?? "", nil) +// break +// case .canceled: +// reject(ConfirmSetupIntentErrorType.Canceled.rawValue, error?.localizedDescription ?? "", nil) +// break +// case .succeeded: +// let intent = Mappers.mapFromSetupIntent(setupIntent: setupIntent!) +// resolve(intent) +// @unknown default: +// reject(ConfirmSetupIntentErrorType.Unknown.rawValue, error?.localizedDescription ?? "", nil) +// break +// } +// } +// } +// +// func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: STPPaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) { +// self.applePayCompletionCallback = completion +// self.applePayRequestResolver?([NSNull()]) +// } +// +// @objc(confirmApplePayPayment:resolver:rejecter:) +// func confirmApplePayPayment(clientSecret: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { +// self.applePayCompletionRejecter = reject +// self.applePayCompletionCallback?(clientSecret, nil) +// self.confirmApplePayPaymentResolver = resolve +// } +// +// func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPPaymentStatus, error: Error?) { +// switch status { +// case .success: +// applePayCompletionRejecter = nil +// applePayRequestRejecter = nil +// confirmApplePayPaymentResolver?([NSNull()]) +// break +// case .error: +// let message = "Apple pay completion failed" +// applePayCompletionRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) +// applePayRequestRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) +// applePayCompletionRejecter = nil +// applePayRequestRejecter = nil +// break +// case .userCancellation: +// let message = "Apple pay payment has been cancelled" +// applePayCompletionRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) +// applePayRequestRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) +// applePayCompletionRejecter = nil +// applePayRequestRejecter = nil +// break +// @unknown default: +// let message = "Cannot complete payment" +// applePayCompletionRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) +// applePayRequestRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) +// applePayCompletionRejecter = nil +// applePayRequestRejecter = nil +// } +// } +// +// @objc(isApplePaySupported:rejecter:) +// func isApplePaySupported(resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock) { +// let isSupported = StripeAPI.deviceSupportsApplePay() +// resolve([isSupported]) +// } +// +// @objc(presentApplePay:resolver:rejecter:) +// func presentApplePay(params: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock) { +// if (merchantIdentifier == nil) { +// reject(ApplePayErrorType.Failed.rawValue, "You must provide merchantIdentifier", nil) +// return +// } +// +// guard let summaryItems = params["cartItems"] as? NSArray else { +// reject(ApplePayErrorType.Failed.rawValue, "You must provide the items for purchase", nil) +// return +// } +// guard let country = params["country"] as? String else { +// reject(ApplePayErrorType.Failed.rawValue, "You must provide the country", nil) +// return +// } +// guard let currency = params["currency"] as? String else { +// reject(ApplePayErrorType.Failed.rawValue, "You must provide the payment currency", nil) +// return +// } +// +// self.applePayRequestResolver = resolve +// self.applePayRequestRejecter = reject +// +// let merchantIdentifier = self.merchantIdentifier ?? "" +// let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: country, currency: currency) +// +// let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray() +// let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray() +// let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray() +// +// paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map { +// Mappers.mapToPKContactField(field: $0 as! String) +// }) +// +// paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map { +// Mappers.mapToPKContactField(field: $0 as! String) +// }) +// +// paymentRequest.shippingMethods = Mappers.mapToShippingMethods(shippingMethods: shippingMethods) +// +// var paymentSummaryItems: [PKPaymentSummaryItem] = [] +// +// if let items = summaryItems as? [[String : Any]] { +// for item in items { +// let label = item["label"] as? String ?? "" +// let amount = NSDecimalNumber(string: item["amount"] as? String ?? "") +// paymentSummaryItems.append(PKPaymentSummaryItem(label: label, amount: amount)) +// } +// } +// +// paymentRequest.paymentSummaryItems = paymentSummaryItems +// if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) { +// DispatchQueue.main.async { +// applePayContext.presentApplePay(on: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController()) +// } +// } else { +// reject(ApplePayErrorType.Failed.rawValue, "Apple pay request failed", nil) +// } +// } +// +// func configure3dSecure(_ params: NSDictionary) { +// let threeDSCustomizationSettings = STPPaymentHandler.shared().threeDSCustomizationSettings +// let uiCustomization = Mappers.mapUICustomization(params) +// +// threeDSCustomizationSettings.uiCustomization = uiCustomization +// } +// +// @objc(createPaymentMethod:options:resolver:rejecter:) +// func createPaymentMethod( +// data: NSDictionary, +// options: NSDictionary, +// resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock +// ) -> Void { +// var billing: STPPaymentMethodBillingDetails? = nil +// if let billingDetails = data["billingDetails"] as! NSDictionary? { +// billing = Mappers.mapToBillingDetails(billingDetails: billingDetails) +// } +// let paymentMethodParams = Mappers.mapCardParamsToPaymentMethodParams(params: data["cardDetails"] as! NSDictionary, billingDetails: billing) +// STPAPIClient.shared.createPaymentMethod(with: paymentMethodParams) { paymentMethod, error in +// if let createError = error { +// reject(NextPaymentActionErrorType.Failed.rawValue, createError.localizedDescription, nil) +// } +// +// if let paymentMethod = paymentMethod { +// let method = Mappers.mapFromPaymentMethod(paymentMethod) +// resolve(method) +// } +// } +// } +// +// @objc(handleCardAction:resolver:rejecter:) +// func handleCardAction( +// paymentIntentClientSecret: String, +// resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock +// ){ +// let paymentHandler = STPPaymentHandler.shared() +// paymentHandler.handleNextAction(forPayment: paymentIntentClientSecret, with: self, returnURL: nil) { status, paymentIntent, handleActionError in +// switch (status) { +// case .failed: +// reject(NextPaymentActionErrorType.Failed.rawValue, handleActionError?.localizedDescription ?? "", nil) +// break +// case .canceled: +// reject(NextPaymentActionErrorType.Canceled.rawValue, handleActionError?.localizedDescription ?? "", nil) +// break +// case .succeeded: +// if let paymentIntent = paymentIntent { +// resolve(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) +// } +// break +// @unknown default: +// reject(NextPaymentActionErrorType.Unknown.rawValue, "Cannot complete payment", nil) +// break +// } +// } +// } +// +// @objc(confirmPaymentMethod:data:options:resolver:rejecter:) +// func confirmPaymentMethod( +// paymentIntentClientSecret: String, +// data: NSDictionary, +// options: NSDictionary, +// resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock +// ) -> Void { +// let paymentMethodId = data["paymentMethodId"] as? String +// let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret) +// if let setupFutureUsage = data["setupFutureUsage"] as? String { +// paymentIntentParams.setupFutureUsage = Mappers.mapToPaymentIntentFutureUsage(usage: setupFutureUsage) +// } +// +// var billingDetails: STPPaymentMethodBillingDetails? = nil +// if let billing = data["billingDetails"] as? NSDictionary { +// billingDetails = Mappers.mapToBillingDetails(billingDetails: billing) +// } +// +// if let cvc = data["cvc"] as? String { +// let cardOptions = STPConfirmCardOptions() +// cardOptions.cvc = cvc; +// let paymentMethodOptions = STPConfirmPaymentMethodOptions() +// paymentMethodOptions.cardOptions = cardOptions +// paymentIntentParams.paymentMethodOptions = paymentMethodOptions +// } else if paymentMethodId != nil { +// paymentIntentParams.paymentMethodId = paymentMethodId +// } else { +// guard let cardDetails = data["cardDetails"] as? NSDictionary else { +// let message = "To confirm the payment you must provide card details or paymentMethodId" +// reject(ConfirmPaymentErrorType.Failed.rawValue, message, nil) +// return +// } +// let paymentMethodParams = Mappers.mapCardParamsToPaymentMethodParams(params: cardDetails, billingDetails: billingDetails) +// paymentIntentParams.paymentMethodParams = paymentMethodParams +// } +// +// let paymentHandler = STPPaymentHandler.shared() +// paymentHandler.confirmPayment(paymentIntentParams, with: self) { (status, paymentIntent, error) in +// switch (status) { +// case .failed: +// reject(ConfirmPaymentErrorType.Failed.rawValue, error?.localizedDescription ?? "", nil) +// break +// case .canceled: +// reject(ConfirmPaymentErrorType.Canceled.rawValue, error?.localizedDescription ?? "", nil) +// break +// case .succeeded: +// if let paymentIntent = paymentIntent { +// let intent = Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent) +// resolve(intent) +// } +// break +// @unknown default: +// reject(ConfirmPaymentErrorType.Unknown.rawValue, "Cannot complete payment", nil) +// break +// } +// } +// +// } +// +// @objc(retrievePaymentIntent:resolver:rejecter:) +// func retrievePaymentIntent( +// clientSecret: String, +// resolver resolve: @escaping RCTPromiseResolveBlock, +// rejecter reject: @escaping RCTPromiseRejectBlock +// ) -> Void { +// STPAPIClient.shared.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, error) in +// guard error == nil else { +// reject(RetrievePaymentIntentErrorType.Unknown.rawValue, error?.localizedDescription, nil) +// return +// } +// +// if let paymentIntent = paymentIntent { +// resolve(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) +// } else { +// reject(RetrievePaymentIntentErrorType.Unknown.rawValue, "Cannot retrieve PaymentIntent", nil) +// } +// } +// } +// +//} +// +//extension StripeSdk: STPAuthenticationContext { +// func authenticationPresentingViewController() -> UIViewController { +// if let topViewController = UIApplication.shared.delegate?.window??.rootViewController { +// return topViewController +// } +// return UIViewController() +// } +//} diff --git a/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift b/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift new file mode 100644 index 000000000..3059dc016 --- /dev/null +++ b/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift @@ -0,0 +1,369 @@ +import Flutter +import UIKit +import Stripe +import PassKit + + +public class SwiftStripeIosPlugin: NSObject, FlutterPlugin { + var merchantIdentifier: String? = nil + + var applePayCompletionCallback: STPIntentClientSecretCompletionBlock? = nil + var applePayRequestResult: FlutterResult? = nil + + private var paymentSheet: PaymentSheet? + private var paymentSheetFlowController: PaymentSheet.FlowController? +// var applePayRequestRejecter: RCTPromiseRejectBlock? = nil +// var applePayCompletionRejecter: RCTPromiseRejectBlock? = nil +// var confirmSetupIntentPromise: RCTResponseSenderBlock? = nil +// var confirmApplePayPaymentResolver: RCTPromiseResolveBlock? = nil + + public static func register(with registrar: FlutterPluginRegistrar) { + + let channel = FlutterMethodChannel(name: "flutter.stripe/payments", binaryMessenger: registrar.messenger()) + let instance = SwiftStripeIosPlugin() + registrar.addMethodCallDelegate(instance, channel: channel) + + let applePayFactory = ApplePayButtonViewFactory(messenger: registrar.messenger()) + registrar.register(applePayFactory, withId: "flutter.stripe/apple_pay") + + let cardFieldFactory = CardFieldViewFactory(messenger: registrar.messenger()) + registrar.register(cardFieldFactory, withId: "flutter.stripe/card_field") + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "initialise": + handleInitialise(call, result: result) + break; + case "configure3dSecure": + handleConfigure3dSecure(call, result: result) + break; + case "isApplePaySupported": + print("checking") + handleIsApplePaySupported(call, result:result) + break; + case "presentApplePay": + handlePresentApplePay(call, result: result) + break; + case "setupPaymentSheet": + setupPaymentSheet(call, result: result) + break; + case "presentPaymentOptions": + presentPaymentOptions(call, result: result) + break; + case "paymentSheetConfirmPayment": + paymentSheetConfirmPayment(call, result: result) + break; + case "presentPaymentSheet": + presentPaymentSheet(call, result: result) + break; + default: + result(FlutterMethodNotImplemented) + } + } +} + +extension SwiftStripeIosPlugin { + + public func handleInitialise(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let publishableKey = arguments["publishableKey"] as? String else { + result("Not a valid fields") + return + } + let stripeAccountId : String? = arguments["stripeAccountId"] as? String + let params : NSDictionary? = arguments["params"] as? NSDictionary + let merchantIdentifier: String? = arguments["merchantIdentifier"] as? String + StripeAPI.defaultPublishableKey = publishableKey + initialise( + publishableKey: publishableKey, + appInfo: nil, + stripeAccountId: stripeAccountId, + params: params, + merchantIdentifier: merchantIdentifier + ) + result(nil) + } + + public func handleConfigure3dSecure(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let params = arguments["params"] as? NSDictionary else { + result("Not a valid fields") + return + } + configure3dSecure(params) + result(nil) + } + + public func handleIsApplePaySupported(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + let isSupported = isApplePaySupported() + print(isSupported) + result(isSupported) + } + + public func handlePresentApplePay(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let params = call.arguments as? Dictionary else { + result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "Invalid parametes", details: nil)) + return + } + if (merchantIdentifier == nil) { + result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide merchantIdentifier", details: nil)) + return + } + + guard let summaryItems = params["cartItems"] as? NSArray else { + result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide the items for purchase", details: nil)) + return + } + guard let country = params["country"] as? String else { + result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide the country", details: nil)) + return + } + guard let currency = params["currency"] as? String else { + result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide the payment currency", details: nil)) + return + } + + self.applePayRequestResult = result + + let merchantIdentifier = self.merchantIdentifier ?? "" + let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: country, currency: currency) + + let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray() + let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray() + let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray() + + paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map { + Mappers.mapToPKContactField(field: $0 as! String) + }) + + paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map { + Mappers.mapToPKContactField(field: $0 as! String) + }) + + paymentRequest.shippingMethods = Mappers.mapToShippingMethods(shippingMethods: shippingMethods) + + var paymentSummaryItems: [PKPaymentSummaryItem] = [] + + if let items = summaryItems as? [[String : Any]] { + for item in items { + let label = item["label"] as? String ?? "" + let amount = NSDecimalNumber(string: item["amount"] as? String ?? "") + paymentSummaryItems.append(PKPaymentSummaryItem(label: label, amount: amount)) + } + } + + paymentRequest.paymentSummaryItems = paymentSummaryItems + if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) { + DispatchQueue.main.async { + applePayContext.presentApplePay(on: UIApplication.shared.keyWindow?.rootViewController ?? UIViewController()) + } + } else { + result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "Apple pay request failed", details: nil)) + return + } + } + + + + func setupPaymentSheet(_ call: FlutterMethodCall, result: @escaping FlutterResult) -> Void { + guard let params = call.arguments as? Dictionary else { + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: "Invalid parametes", details: nil)) + return + } + guard let customerId = params["customerId"] as? String else { + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: "You must provide the customer ID", details: nil)) + return + } + guard let customerEphemeralKeySecret = params["customerEphemeralKeySecret"] as? String else { + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: "You must provide the customerEphemeralKeySecret", details: nil)) + return + } + guard let paymentIntentClientSecret = params["paymentIntentClientSecret"] as? String else { + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: "You must provide the paymentIntentClientSecret", details: nil)) + return + } + + + var configuration = PaymentSheet.Configuration() + + if params["applePay"] as? Bool == true { + if let merchantIdentifier = self.merchantIdentifier, let merchantCountryCode = params["merchantCountryCode"] as? String { + configuration.applePay = .init(merchantId: merchantIdentifier, + merchantCountryCode: merchantCountryCode) + } else { + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: "merchantIdentifier or merchantCountryCode is not provided", details: nil)) + } + } + + if let merchantDisplayName = params["merchantDisplayName"] as? String { + configuration.merchantDisplayName = merchantDisplayName + } + + configuration.customer = .init(id: customerId, ephemeralKeySecret: customerEphemeralKeySecret) + + if #available(iOS 13.0, *) { + if let style = params["style"] as? String { + configuration.style = Mappers.mapToUserInterfaceStyle(style) + } + } + + if params["customFlow"] as? Bool == true { + PaymentSheet.FlowController.create(paymentIntentClientSecret: paymentIntentClientSecret, + configuration: configuration) { [weak self] paymentResult in + switch paymentResult { + case .failure(let error): + result(FlutterError.init(code: "Failed", message: error.localizedDescription, details: nil)) + case .success(let paymentSheetFlowController): + self?.paymentSheetFlowController = paymentSheetFlowController + if let paymentOption = self?.paymentSheetFlowController?.paymentOption { + let option: NSDictionary = [ + "label": paymentOption.label, + "image": paymentOption.image.pngData()?.base64EncodedString() ?? "" + ] + result(option) + } else { + result(nil) + } + } + } + } else { + self.paymentSheet = PaymentSheet(paymentIntentClientSecret: paymentIntentClientSecret, configuration: configuration) + result(nil) + } + } + + func presentPaymentOptions(_ call: FlutterMethodCall, result: @escaping FlutterResult) -> Void { + DispatchQueue.main.async { + self.paymentSheetFlowController?.presentPaymentOptions(from: UIApplication.shared.keyWindow?.rootViewController ?? UIViewController()) { + if let paymentOption = self.paymentSheetFlowController?.paymentOption { + let option: NSDictionary = [ + "label": paymentOption.label, + "image": paymentOption.image.pngData()?.base64EncodedString() ?? "" + ] + result(option) + } else { + result(nil) + } + } + } + } + + + func paymentSheetConfirmPayment(_ call: FlutterMethodCall, result: @escaping FlutterResult) -> Void { + DispatchQueue.main.async { + self.paymentSheetFlowController?.confirmPayment(from: UIApplication.shared.keyWindow?.rootViewController ?? UIViewController()) { paymentResult in + switch paymentResult { + case .completed(let paymentIntent): + result(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) + case .canceled: + result(FlutterError.init(code: PaymentSheetErrorType.Canceled.rawValue, message: "The payment has been canceled", details: nil)) + + case .failed(let error, _): + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: error.localizedDescription, details: nil)) + } + } + } + } + + func presentPaymentSheet(_ call: FlutterMethodCall, result: @escaping FlutterResult) -> Void { + DispatchQueue.main.async { + self.paymentSheet?.present(from: UIApplication.shared.keyWindow?.rootViewController ?? UIViewController()) { paymentResult in + switch paymentResult { + case .completed(let paymentIntent): + result(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) + case .canceled: + result(FlutterError.init(code: PaymentSheetErrorType.Canceled.rawValue, message: "The payment has been canceled", details: nil)) + case .failed(let error, _): + result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: error.localizedDescription, details: nil)) + } + } + } + } + +} + +extension SwiftStripeIosPlugin { + + func initialise(publishableKey: String, appInfo: NSDictionary?, stripeAccountId: String?, params: NSDictionary?, merchantIdentifier: String?) -> Void { + if let params = params { + configure3dSecure(params) + } + STPAPIClient.shared.publishableKey = publishableKey + STPAPIClient.shared.stripeAccount = stripeAccountId + + let name = appInfo?["name"] as? String ?? "" + let partnerId = appInfo?["partnerId"] as? String ?? "" + let version = appInfo?["version"] as? String ?? "" + let url = appInfo?["url"] as? String ?? "" + + STPAPIClient.shared.appInfo = STPAppInfo(name: name, partnerId: partnerId, version: version, url: url) + self.merchantIdentifier = merchantIdentifier + } + + func configure3dSecure(_ params: NSDictionary) { + let threeDSCustomizationSettings = STPPaymentHandler.shared().threeDSCustomizationSettings + let uiCustomization = Mappers.mapUICustomization(params) + + threeDSCustomizationSettings.uiCustomization = uiCustomization + } + + func isApplePaySupported() -> Bool { + return StripeAPI.deviceSupportsApplePay() + } + +} + +extension SwiftStripeIosPlugin: STPApplePayContextDelegate { + + public func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: STPPaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) { + self.applePayCompletionCallback = completion + self.applePayRequestResult?(nil) + + } + + + public func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPPaymentStatus, error: Error?) { + switch status { + case .success: +// applePayCompletionRejecter = nil + applePayRequestResult = nil +// confirmApplePayPaymentResolver?([NSNull()]) + break + case .error: + let message = "Apple pay completion failed" +// applePayCompletionRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) + applePayRequestResult?(FlutterError(code: ApplePayErrorType.Failed.rawValue, message: message, details: nil)) + applePayRequestResult = nil +// applePayCompletionRejecter = nil + + break + case .userCancellation: + let message = "Apple pay payment has been cancelled" +// applePayCompletionRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) + applePayRequestResult?(FlutterError(code: ApplePayErrorType.Canceled.rawValue, message: message, details: nil)) + applePayRequestResult = nil +// applePayCompletionRejecter = nil + + break + @unknown default: + let message = "Cannot complete payment" +// applePayCompletionRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) + applePayRequestResult?(FlutterError(code: ApplePayErrorType.Unknown.rawValue, message: message, details: nil)) + applePayRequestResult = nil +// applePayCompletionRejecter = nil + } + } +} + + +extension SwiftStripeIosPlugin: STPAuthenticationContext { + public func authenticationPresentingViewController() -> UIViewController { + if let topViewController = UIApplication.shared.keyWindow?.rootViewController { + return topViewController + } + return UIViewController() + } + + +} diff --git a/stripe_ios/ios/Classes/UIColorExtension.swift b/stripe_ios/ios/Classes/UIColorExtension.swift new file mode 100644 index 000000000..825bde74d --- /dev/null +++ b/stripe_ios/ios/Classes/UIColorExtension.swift @@ -0,0 +1,32 @@ +// +// UIColorExtension.swift +// CocoaAsyncSocket +// +// Created by Arkadiusz Kubaczkowski on 24/11/2020. +// + +extension UIColor { + public convenience init(hexString: String) { + let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + var int = UInt64() + Scanner(string: hex).scanHexInt64(&int) + let a, r, g, b: UInt64 + switch hex.count { + case 3: // RGB (12-bit) + (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) + case 6: // RGB (24-bit) + (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) + case 8: // ARGB (32-bit) + (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) + default: + (a, r, g, b) = (255, 0, 0, 0) + } + self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) + } + + + public convenience init(argb: UInt) { + let (a, r, g, b) = (argb >> 24, argb >> 16 & 0xFF, argb >> 8 & 0xFF, argb & 0xFF) + self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) + } +} diff --git a/stripe_ios/ios/stripe_ios.podspec b/stripe_ios/ios/stripe_ios.podspec new file mode 100644 index 000000000..f2be5520b --- /dev/null +++ b/stripe_ios/ios/stripe_ios.podspec @@ -0,0 +1,24 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint stripe_ios.podspec' to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'stripe_ios' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.dependency 'Flutter' + s.dependency 'Stripe', '~> 21.0.0-mc-beta-1' + s.platform = :ios, '11.0' + + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.0' +end diff --git a/stripe_ios/lib/stripe_ios.dart b/stripe_ios/lib/stripe_ios.dart new file mode 100644 index 000000000..04fb1c744 --- /dev/null +++ b/stripe_ios/lib/stripe_ios.dart @@ -0,0 +1,2 @@ +// No implement + diff --git a/stripe_ios/pubspec.lock b/stripe_ios/pubspec.lock new file mode 100644 index 000000000..ef01c9f9a --- /dev/null +++ b/stripe_ios/pubspec.lock @@ -0,0 +1,147 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.19" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" +sdks: + dart: ">=2.12.0-0.0 <3.0.0" + flutter: ">=1.20.0" diff --git a/stripe_ios/pubspec.yaml b/stripe_ios/pubspec.yaml new file mode 100644 index 000000000..6a5f9e2d1 --- /dev/null +++ b/stripe_ios/pubspec.yaml @@ -0,0 +1,23 @@ +name: stripe_ios +description: A new flutter plugin project. +version: 0.0.1 +author: +homepage: + +environment: + sdk: ">=2.7.0 <3.0.0" + flutter: ">=1.20.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + plugin: + platforms: + ios: + pluginClass: StripeIosPlugin diff --git a/stripe_ios/stripe_ios.iml b/stripe_ios/stripe_ios.iml new file mode 100644 index 000000000..429df7daf --- /dev/null +++ b/stripe_ios/stripe_ios.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stripe_ios/test/stripe_ios_test.dart b/stripe_ios/test/stripe_ios_test.dart new file mode 100644 index 000000000..534cb37f2 --- /dev/null +++ b/stripe_ios/test/stripe_ios_test.dart @@ -0,0 +1,5 @@ + + +void main() { + +} diff --git a/stripe_platform_interface/.gitignore b/stripe_platform_interface/.gitignore new file mode 100644 index 000000000..7c2804416 --- /dev/null +++ b/stripe_platform_interface/.gitignore @@ -0,0 +1,27 @@ +# See https://www.dartlang.org/tools/private-files.html + +# Files and directories created by pub +.buildlog +.packages +.project +.pub/ +build/ +**/packages/ + +# Files created by dart2js +# (Most Dart developers will use pub build to compile Dart, use/modify these +# rules if you intend to use dart2js directly +# Convention is to use extension '.dart.js' for Dart compiled to Javascript to +# differentiate from explicit Javascript files) +*.dart.js +*.part.js +*.js.deps +*.js.map +*.info.json + +# Directory created by dartdoc +doc/api/ + +# Don't commit pubspec lock file +# (Library packages only! Remove pattern if developing an application package) +pubspec.lock diff --git a/stripe_platform_interface/.idea/libraries/Dart_SDK.xml b/stripe_platform_interface/.idea/libraries/Dart_SDK.xml new file mode 100644 index 000000000..e4c26f523 --- /dev/null +++ b/stripe_platform_interface/.idea/libraries/Dart_SDK.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stripe_platform_interface/.idea/libraries/KotlinJavaRuntime.xml b/stripe_platform_interface/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 000000000..2b96ac4b7 --- /dev/null +++ b/stripe_platform_interface/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/stripe_platform_interface/.idea/modules.xml b/stripe_platform_interface/.idea/modules.xml new file mode 100644 index 000000000..15a68bfca --- /dev/null +++ b/stripe_platform_interface/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stripe_platform_interface/.idea/runConfigurations/main_dart.xml b/stripe_platform_interface/.idea/runConfigurations/main_dart.xml new file mode 100644 index 000000000..aab7b5cd8 --- /dev/null +++ b/stripe_platform_interface/.idea/runConfigurations/main_dart.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/stripe_platform_interface/.idea/workspace.xml b/stripe_platform_interface/.idea/workspace.xml new file mode 100644 index 000000000..5b3388cc1 --- /dev/null +++ b/stripe_platform_interface/.idea/workspace.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stripe_platform_interface/.metadata b/stripe_platform_interface/.metadata new file mode 100644 index 000000000..327f3a2c1 --- /dev/null +++ b/stripe_platform_interface/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 68c96f100e42ab3dbf43e61e9e2fc875a2d50cb8 + channel: dev + +project_type: app diff --git a/stripe_platform_interface/CHANGELOG.md b/stripe_platform_interface/CHANGELOG.md new file mode 100644 index 000000000..ac071598e --- /dev/null +++ b/stripe_platform_interface/CHANGELOG.md @@ -0,0 +1,3 @@ +## [0.0.1] - TODO: Add release date. + +* TODO: Describe initial release. diff --git a/stripe_platform_interface/LICENSE b/stripe_platform_interface/LICENSE new file mode 100644 index 000000000..ba75c69f7 --- /dev/null +++ b/stripe_platform_interface/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/stripe_platform_interface/README.md b/stripe_platform_interface/README.md new file mode 100644 index 000000000..5e0b4a0d6 --- /dev/null +++ b/stripe_platform_interface/README.md @@ -0,0 +1,923 @@ +# openapi +The Stripe REST API. Please see https://stripe.com/docs/api for more details. + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 2020-08-27 +- Build package: org.openapitools.codegen.languages.DartClientCodegen +For more information, please visit [https://stripe.com](https://stripe.com) + +## Requirements + +Dart 2.0 or later + +## Installation & Usage + +### Github +If this Dart package is published to Github, add the following dependency to your pubspec.yaml +``` +dependencies: + openapi: + git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git +``` + +### Local +To use the package in your local drive, add the following dependency to your pubspec.yaml +``` +dependencies: + openapi: + path: /path/to/openapi +``` + +## Tests + +TODO + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:openapi/api.dart'; + +// TODO Configure HTTP basic authorization: basicAuth +//defaultApiClient.getAuthentication('basicAuth').username = 'YOUR_USERNAME' +//defaultApiClient.getAuthentication('basicAuth').password = 'YOUR_PASSWORD'; +// TODO Configure HTTP Bearer authorization: bearerAuth +// Case 1. Use String Token +//defaultApiClient.getAuthentication('bearerAuth').setAccessToken('YOUR_ACCESS_TOKEN'); +// Case 2. Use Function which generate token. +// String yourTokenGeneratorFunction() { ... } +//defaultApiClient.getAuthentication('bearerAuth').setAccessToken(yourTokenGeneratorFunction); + +final api_instance = DefaultApi(); +final account = account_example; // String | + +try { + final result = api_instance.deleteAccount(account); + print(result); +} catch (e) { + print('Exception when calling DefaultApi->deleteAccount: $e\n'); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *https://api.stripe.com* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*DefaultApi* | [**deleteAccount**](doc//DefaultApi.md#deleteaccount) | **DELETE** /v1/account | +*DefaultApi* | [**deleteAccountBankAccountsId**](doc//DefaultApi.md#deleteaccountbankaccountsid) | **DELETE** /v1/account/bank_accounts/{id} | +*DefaultApi* | [**deleteAccountExternalAccountsId**](doc//DefaultApi.md#deleteaccountexternalaccountsid) | **DELETE** /v1/account/external_accounts/{id} | +*DefaultApi* | [**deleteAccountPeoplePerson**](doc//DefaultApi.md#deleteaccountpeopleperson) | **DELETE** /v1/account/people/{person} | +*DefaultApi* | [**deleteAccountPersonsPerson**](doc//DefaultApi.md#deleteaccountpersonsperson) | **DELETE** /v1/account/persons/{person} | +*DefaultApi* | [**deleteAccountsAccount**](doc//DefaultApi.md#deleteaccountsaccount) | **DELETE** /v1/accounts/{account} | +*DefaultApi* | [**deleteAccountsAccountBankAccountsId**](doc//DefaultApi.md#deleteaccountsaccountbankaccountsid) | **DELETE** /v1/accounts/{account}/bank_accounts/{id} | +*DefaultApi* | [**deleteAccountsAccountExternalAccountsId**](doc//DefaultApi.md#deleteaccountsaccountexternalaccountsid) | **DELETE** /v1/accounts/{account}/external_accounts/{id} | +*DefaultApi* | [**deleteAccountsAccountPeoplePerson**](doc//DefaultApi.md#deleteaccountsaccountpeopleperson) | **DELETE** /v1/accounts/{account}/people/{person} | +*DefaultApi* | [**deleteAccountsAccountPersonsPerson**](doc//DefaultApi.md#deleteaccountsaccountpersonsperson) | **DELETE** /v1/accounts/{account}/persons/{person} | +*DefaultApi* | [**deleteApplePayDomainsDomain**](doc//DefaultApi.md#deleteapplepaydomainsdomain) | **DELETE** /v1/apple_pay/domains/{domain} | +*DefaultApi* | [**deleteCouponsCoupon**](doc//DefaultApi.md#deletecouponscoupon) | **DELETE** /v1/coupons/{coupon} | +*DefaultApi* | [**deleteCustomersCustomer**](doc//DefaultApi.md#deletecustomerscustomer) | **DELETE** /v1/customers/{customer} | +*DefaultApi* | [**deleteCustomersCustomerBankAccountsId**](doc//DefaultApi.md#deletecustomerscustomerbankaccountsid) | **DELETE** /v1/customers/{customer}/bank_accounts/{id} | +*DefaultApi* | [**deleteCustomersCustomerCardsId**](doc//DefaultApi.md#deletecustomerscustomercardsid) | **DELETE** /v1/customers/{customer}/cards/{id} | +*DefaultApi* | [**deleteCustomersCustomerDiscount**](doc//DefaultApi.md#deletecustomerscustomerdiscount) | **DELETE** /v1/customers/{customer}/discount | +*DefaultApi* | [**deleteCustomersCustomerSourcesId**](doc//DefaultApi.md#deletecustomerscustomersourcesid) | **DELETE** /v1/customers/{customer}/sources/{id} | +*DefaultApi* | [**deleteCustomersCustomerSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#deletecustomerscustomersubscriptionssubscriptionexposedid) | **DELETE** /v1/customers/{customer}/subscriptions/{subscription_exposed_id} | +*DefaultApi* | [**deleteCustomersCustomerSubscriptionsSubscriptionExposedIdDiscount**](doc//DefaultApi.md#deletecustomerscustomersubscriptionssubscriptionexposediddiscount) | **DELETE** /v1/customers/{customer}/subscriptions/{subscription_exposed_id}/discount | +*DefaultApi* | [**deleteCustomersCustomerTaxIdsId**](doc//DefaultApi.md#deletecustomerscustomertaxidsid) | **DELETE** /v1/customers/{customer}/tax_ids/{id} | +*DefaultApi* | [**deleteEphemeralKeysKey**](doc//DefaultApi.md#deleteephemeralkeyskey) | **DELETE** /v1/ephemeral_keys/{key} | +*DefaultApi* | [**deleteInvoiceitemsInvoiceitem**](doc//DefaultApi.md#deleteinvoiceitemsinvoiceitem) | **DELETE** /v1/invoiceitems/{invoiceitem} | +*DefaultApi* | [**deleteInvoicesInvoice**](doc//DefaultApi.md#deleteinvoicesinvoice) | **DELETE** /v1/invoices/{invoice} | +*DefaultApi* | [**deletePlansPlan**](doc//DefaultApi.md#deleteplansplan) | **DELETE** /v1/plans/{plan} | +*DefaultApi* | [**deleteProductsId**](doc//DefaultApi.md#deleteproductsid) | **DELETE** /v1/products/{id} | +*DefaultApi* | [**deleteRadarValueListItemsItem**](doc//DefaultApi.md#deleteradarvaluelistitemsitem) | **DELETE** /v1/radar/value_list_items/{item} | +*DefaultApi* | [**deleteRadarValueListsValueList**](doc//DefaultApi.md#deleteradarvaluelistsvaluelist) | **DELETE** /v1/radar/value_lists/{value_list} | +*DefaultApi* | [**deleteRecipientsId**](doc//DefaultApi.md#deleterecipientsid) | **DELETE** /v1/recipients/{id} | +*DefaultApi* | [**deleteSkusId**](doc//DefaultApi.md#deleteskusid) | **DELETE** /v1/skus/{id} | +*DefaultApi* | [**deleteSubscriptionItemsItem**](doc//DefaultApi.md#deletesubscriptionitemsitem) | **DELETE** /v1/subscription_items/{item} | +*DefaultApi* | [**deleteSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#deletesubscriptionssubscriptionexposedid) | **DELETE** /v1/subscriptions/{subscription_exposed_id} | +*DefaultApi* | [**deleteSubscriptionsSubscriptionExposedIdDiscount**](doc//DefaultApi.md#deletesubscriptionssubscriptionexposediddiscount) | **DELETE** /v1/subscriptions/{subscription_exposed_id}/discount | +*DefaultApi* | [**deleteTerminalLocationsLocation**](doc//DefaultApi.md#deleteterminallocationslocation) | **DELETE** /v1/terminal/locations/{location} | +*DefaultApi* | [**deleteTerminalReadersReader**](doc//DefaultApi.md#deleteterminalreadersreader) | **DELETE** /v1/terminal/readers/{reader} | +*DefaultApi* | [**deleteWebhookEndpointsWebhookEndpoint**](doc//DefaultApi.md#deletewebhookendpointswebhookendpoint) | **DELETE** /v1/webhook_endpoints/{webhook_endpoint} | +*DefaultApi* | [**get3dSecureThreeDSecure**](doc//DefaultApi.md#get3dsecurethreedsecure) | **GET** /v1/3d_secure/{three_d_secure} | +*DefaultApi* | [**getAccount**](doc//DefaultApi.md#getaccount) | **GET** /v1/account | +*DefaultApi* | [**getAccountBankAccountsId**](doc//DefaultApi.md#getaccountbankaccountsid) | **GET** /v1/account/bank_accounts/{id} | +*DefaultApi* | [**getAccountCapabilities**](doc//DefaultApi.md#getaccountcapabilities) | **GET** /v1/account/capabilities | +*DefaultApi* | [**getAccountCapabilitiesCapability**](doc//DefaultApi.md#getaccountcapabilitiescapability) | **GET** /v1/account/capabilities/{capability} | +*DefaultApi* | [**getAccountExternalAccounts**](doc//DefaultApi.md#getaccountexternalaccounts) | **GET** /v1/account/external_accounts | +*DefaultApi* | [**getAccountExternalAccountsId**](doc//DefaultApi.md#getaccountexternalaccountsid) | **GET** /v1/account/external_accounts/{id} | +*DefaultApi* | [**getAccountPeople**](doc//DefaultApi.md#getaccountpeople) | **GET** /v1/account/people | +*DefaultApi* | [**getAccountPeoplePerson**](doc//DefaultApi.md#getaccountpeopleperson) | **GET** /v1/account/people/{person} | +*DefaultApi* | [**getAccountPersons**](doc//DefaultApi.md#getaccountpersons) | **GET** /v1/account/persons | +*DefaultApi* | [**getAccountPersonsPerson**](doc//DefaultApi.md#getaccountpersonsperson) | **GET** /v1/account/persons/{person} | +*DefaultApi* | [**getAccounts**](doc//DefaultApi.md#getaccounts) | **GET** /v1/accounts | +*DefaultApi* | [**getAccountsAccount**](doc//DefaultApi.md#getaccountsaccount) | **GET** /v1/accounts/{account} | +*DefaultApi* | [**getAccountsAccountBankAccountsId**](doc//DefaultApi.md#getaccountsaccountbankaccountsid) | **GET** /v1/accounts/{account}/bank_accounts/{id} | +*DefaultApi* | [**getAccountsAccountCapabilities**](doc//DefaultApi.md#getaccountsaccountcapabilities) | **GET** /v1/accounts/{account}/capabilities | +*DefaultApi* | [**getAccountsAccountCapabilitiesCapability**](doc//DefaultApi.md#getaccountsaccountcapabilitiescapability) | **GET** /v1/accounts/{account}/capabilities/{capability} | +*DefaultApi* | [**getAccountsAccountExternalAccounts**](doc//DefaultApi.md#getaccountsaccountexternalaccounts) | **GET** /v1/accounts/{account}/external_accounts | +*DefaultApi* | [**getAccountsAccountExternalAccountsId**](doc//DefaultApi.md#getaccountsaccountexternalaccountsid) | **GET** /v1/accounts/{account}/external_accounts/{id} | +*DefaultApi* | [**getAccountsAccountPeople**](doc//DefaultApi.md#getaccountsaccountpeople) | **GET** /v1/accounts/{account}/people | +*DefaultApi* | [**getAccountsAccountPeoplePerson**](doc//DefaultApi.md#getaccountsaccountpeopleperson) | **GET** /v1/accounts/{account}/people/{person} | +*DefaultApi* | [**getAccountsAccountPersons**](doc//DefaultApi.md#getaccountsaccountpersons) | **GET** /v1/accounts/{account}/persons | +*DefaultApi* | [**getAccountsAccountPersonsPerson**](doc//DefaultApi.md#getaccountsaccountpersonsperson) | **GET** /v1/accounts/{account}/persons/{person} | +*DefaultApi* | [**getApplePayDomains**](doc//DefaultApi.md#getapplepaydomains) | **GET** /v1/apple_pay/domains | +*DefaultApi* | [**getApplePayDomainsDomain**](doc//DefaultApi.md#getapplepaydomainsdomain) | **GET** /v1/apple_pay/domains/{domain} | +*DefaultApi* | [**getApplicationFees**](doc//DefaultApi.md#getapplicationfees) | **GET** /v1/application_fees | +*DefaultApi* | [**getApplicationFeesFeeRefundsId**](doc//DefaultApi.md#getapplicationfeesfeerefundsid) | **GET** /v1/application_fees/{fee}/refunds/{id} | +*DefaultApi* | [**getApplicationFeesId**](doc//DefaultApi.md#getapplicationfeesid) | **GET** /v1/application_fees/{id} | +*DefaultApi* | [**getApplicationFeesIdRefunds**](doc//DefaultApi.md#getapplicationfeesidrefunds) | **GET** /v1/application_fees/{id}/refunds | +*DefaultApi* | [**getBalance**](doc//DefaultApi.md#getbalance) | **GET** /v1/balance | +*DefaultApi* | [**getBalanceHistory**](doc//DefaultApi.md#getbalancehistory) | **GET** /v1/balance/history | +*DefaultApi* | [**getBalanceHistoryId**](doc//DefaultApi.md#getbalancehistoryid) | **GET** /v1/balance/history/{id} | +*DefaultApi* | [**getBalanceTransactions**](doc//DefaultApi.md#getbalancetransactions) | **GET** /v1/balance_transactions | +*DefaultApi* | [**getBalanceTransactionsId**](doc//DefaultApi.md#getbalancetransactionsid) | **GET** /v1/balance_transactions/{id} | +*DefaultApi* | [**getBillingPortalConfigurations**](doc//DefaultApi.md#getbillingportalconfigurations) | **GET** /v1/billing_portal/configurations | +*DefaultApi* | [**getBillingPortalConfigurationsConfiguration**](doc//DefaultApi.md#getbillingportalconfigurationsconfiguration) | **GET** /v1/billing_portal/configurations/{configuration} | +*DefaultApi* | [**getBitcoinReceivers**](doc//DefaultApi.md#getbitcoinreceivers) | **GET** /v1/bitcoin/receivers | +*DefaultApi* | [**getBitcoinReceiversId**](doc//DefaultApi.md#getbitcoinreceiversid) | **GET** /v1/bitcoin/receivers/{id} | +*DefaultApi* | [**getBitcoinReceiversReceiverTransactions**](doc//DefaultApi.md#getbitcoinreceiversreceivertransactions) | **GET** /v1/bitcoin/receivers/{receiver}/transactions | +*DefaultApi* | [**getBitcoinTransactions**](doc//DefaultApi.md#getbitcointransactions) | **GET** /v1/bitcoin/transactions | +*DefaultApi* | [**getCharges**](doc//DefaultApi.md#getcharges) | **GET** /v1/charges | +*DefaultApi* | [**getChargesCharge**](doc//DefaultApi.md#getchargescharge) | **GET** /v1/charges/{charge} | +*DefaultApi* | [**getChargesChargeDispute**](doc//DefaultApi.md#getchargeschargedispute) | **GET** /v1/charges/{charge}/dispute | +*DefaultApi* | [**getChargesChargeRefunds**](doc//DefaultApi.md#getchargeschargerefunds) | **GET** /v1/charges/{charge}/refunds | +*DefaultApi* | [**getChargesChargeRefundsRefund**](doc//DefaultApi.md#getchargeschargerefundsrefund) | **GET** /v1/charges/{charge}/refunds/{refund} | +*DefaultApi* | [**getCheckoutSessions**](doc//DefaultApi.md#getcheckoutsessions) | **GET** /v1/checkout/sessions | +*DefaultApi* | [**getCheckoutSessionsSession**](doc//DefaultApi.md#getcheckoutsessionssession) | **GET** /v1/checkout/sessions/{session} | +*DefaultApi* | [**getCheckoutSessionsSessionLineItems**](doc//DefaultApi.md#getcheckoutsessionssessionlineitems) | **GET** /v1/checkout/sessions/{session}/line_items | +*DefaultApi* | [**getCountrySpecs**](doc//DefaultApi.md#getcountryspecs) | **GET** /v1/country_specs | +*DefaultApi* | [**getCountrySpecsCountry**](doc//DefaultApi.md#getcountryspecscountry) | **GET** /v1/country_specs/{country} | +*DefaultApi* | [**getCoupons**](doc//DefaultApi.md#getcoupons) | **GET** /v1/coupons | +*DefaultApi* | [**getCouponsCoupon**](doc//DefaultApi.md#getcouponscoupon) | **GET** /v1/coupons/{coupon} | +*DefaultApi* | [**getCreditNotes**](doc//DefaultApi.md#getcreditnotes) | **GET** /v1/credit_notes | +*DefaultApi* | [**getCreditNotesCreditNoteLines**](doc//DefaultApi.md#getcreditnotescreditnotelines) | **GET** /v1/credit_notes/{credit_note}/lines | +*DefaultApi* | [**getCreditNotesId**](doc//DefaultApi.md#getcreditnotesid) | **GET** /v1/credit_notes/{id} | +*DefaultApi* | [**getCreditNotesPreview**](doc//DefaultApi.md#getcreditnotespreview) | **GET** /v1/credit_notes/preview | +*DefaultApi* | [**getCreditNotesPreviewLines**](doc//DefaultApi.md#getcreditnotespreviewlines) | **GET** /v1/credit_notes/preview/lines | +*DefaultApi* | [**getCustomers**](doc//DefaultApi.md#getcustomers) | **GET** /v1/customers | +*DefaultApi* | [**getCustomersCustomer**](doc//DefaultApi.md#getcustomerscustomer) | **GET** /v1/customers/{customer} | +*DefaultApi* | [**getCustomersCustomerBalanceTransactions**](doc//DefaultApi.md#getcustomerscustomerbalancetransactions) | **GET** /v1/customers/{customer}/balance_transactions | +*DefaultApi* | [**getCustomersCustomerBalanceTransactionsTransaction**](doc//DefaultApi.md#getcustomerscustomerbalancetransactionstransaction) | **GET** /v1/customers/{customer}/balance_transactions/{transaction} | +*DefaultApi* | [**getCustomersCustomerBankAccounts**](doc//DefaultApi.md#getcustomerscustomerbankaccounts) | **GET** /v1/customers/{customer}/bank_accounts | +*DefaultApi* | [**getCustomersCustomerBankAccountsId**](doc//DefaultApi.md#getcustomerscustomerbankaccountsid) | **GET** /v1/customers/{customer}/bank_accounts/{id} | +*DefaultApi* | [**getCustomersCustomerCards**](doc//DefaultApi.md#getcustomerscustomercards) | **GET** /v1/customers/{customer}/cards | +*DefaultApi* | [**getCustomersCustomerCardsId**](doc//DefaultApi.md#getcustomerscustomercardsid) | **GET** /v1/customers/{customer}/cards/{id} | +*DefaultApi* | [**getCustomersCustomerDiscount**](doc//DefaultApi.md#getcustomerscustomerdiscount) | **GET** /v1/customers/{customer}/discount | +*DefaultApi* | [**getCustomersCustomerSources**](doc//DefaultApi.md#getcustomerscustomersources) | **GET** /v1/customers/{customer}/sources | +*DefaultApi* | [**getCustomersCustomerSourcesId**](doc//DefaultApi.md#getcustomerscustomersourcesid) | **GET** /v1/customers/{customer}/sources/{id} | +*DefaultApi* | [**getCustomersCustomerSubscriptions**](doc//DefaultApi.md#getcustomerscustomersubscriptions) | **GET** /v1/customers/{customer}/subscriptions | +*DefaultApi* | [**getCustomersCustomerSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#getcustomerscustomersubscriptionssubscriptionexposedid) | **GET** /v1/customers/{customer}/subscriptions/{subscription_exposed_id} | +*DefaultApi* | [**getCustomersCustomerSubscriptionsSubscriptionExposedIdDiscount**](doc//DefaultApi.md#getcustomerscustomersubscriptionssubscriptionexposediddiscount) | **GET** /v1/customers/{customer}/subscriptions/{subscription_exposed_id}/discount | +*DefaultApi* | [**getCustomersCustomerTaxIds**](doc//DefaultApi.md#getcustomerscustomertaxids) | **GET** /v1/customers/{customer}/tax_ids | +*DefaultApi* | [**getCustomersCustomerTaxIdsId**](doc//DefaultApi.md#getcustomerscustomertaxidsid) | **GET** /v1/customers/{customer}/tax_ids/{id} | +*DefaultApi* | [**getDisputes**](doc//DefaultApi.md#getdisputes) | **GET** /v1/disputes | +*DefaultApi* | [**getDisputesDispute**](doc//DefaultApi.md#getdisputesdispute) | **GET** /v1/disputes/{dispute} | +*DefaultApi* | [**getEvents**](doc//DefaultApi.md#getevents) | **GET** /v1/events | +*DefaultApi* | [**getEventsId**](doc//DefaultApi.md#geteventsid) | **GET** /v1/events/{id} | +*DefaultApi* | [**getExchangeRates**](doc//DefaultApi.md#getexchangerates) | **GET** /v1/exchange_rates | +*DefaultApi* | [**getExchangeRatesRateId**](doc//DefaultApi.md#getexchangeratesrateid) | **GET** /v1/exchange_rates/{rate_id} | +*DefaultApi* | [**getFileLinks**](doc//DefaultApi.md#getfilelinks) | **GET** /v1/file_links | +*DefaultApi* | [**getFileLinksLink**](doc//DefaultApi.md#getfilelinkslink) | **GET** /v1/file_links/{link} | +*DefaultApi* | [**getFiles**](doc//DefaultApi.md#getfiles) | **GET** /v1/files | +*DefaultApi* | [**getFilesFile**](doc//DefaultApi.md#getfilesfile) | **GET** /v1/files/{file} | +*DefaultApi* | [**getInvoiceitems**](doc//DefaultApi.md#getinvoiceitems) | **GET** /v1/invoiceitems | +*DefaultApi* | [**getInvoiceitemsInvoiceitem**](doc//DefaultApi.md#getinvoiceitemsinvoiceitem) | **GET** /v1/invoiceitems/{invoiceitem} | +*DefaultApi* | [**getInvoices**](doc//DefaultApi.md#getinvoices) | **GET** /v1/invoices | +*DefaultApi* | [**getInvoicesInvoice**](doc//DefaultApi.md#getinvoicesinvoice) | **GET** /v1/invoices/{invoice} | +*DefaultApi* | [**getInvoicesInvoiceLines**](doc//DefaultApi.md#getinvoicesinvoicelines) | **GET** /v1/invoices/{invoice}/lines | +*DefaultApi* | [**getInvoicesUpcoming**](doc//DefaultApi.md#getinvoicesupcoming) | **GET** /v1/invoices/upcoming | +*DefaultApi* | [**getInvoicesUpcomingLines**](doc//DefaultApi.md#getinvoicesupcominglines) | **GET** /v1/invoices/upcoming/lines | +*DefaultApi* | [**getIssuerFraudRecords**](doc//DefaultApi.md#getissuerfraudrecords) | **GET** /v1/issuer_fraud_records | +*DefaultApi* | [**getIssuerFraudRecordsIssuerFraudRecord**](doc//DefaultApi.md#getissuerfraudrecordsissuerfraudrecord) | **GET** /v1/issuer_fraud_records/{issuer_fraud_record} | +*DefaultApi* | [**getIssuingAuthorizations**](doc//DefaultApi.md#getissuingauthorizations) | **GET** /v1/issuing/authorizations | +*DefaultApi* | [**getIssuingAuthorizationsAuthorization**](doc//DefaultApi.md#getissuingauthorizationsauthorization) | **GET** /v1/issuing/authorizations/{authorization} | +*DefaultApi* | [**getIssuingCardholders**](doc//DefaultApi.md#getissuingcardholders) | **GET** /v1/issuing/cardholders | +*DefaultApi* | [**getIssuingCardholdersCardholder**](doc//DefaultApi.md#getissuingcardholderscardholder) | **GET** /v1/issuing/cardholders/{cardholder} | +*DefaultApi* | [**getIssuingCards**](doc//DefaultApi.md#getissuingcards) | **GET** /v1/issuing/cards | +*DefaultApi* | [**getIssuingCardsCard**](doc//DefaultApi.md#getissuingcardscard) | **GET** /v1/issuing/cards/{card} | +*DefaultApi* | [**getIssuingDisputes**](doc//DefaultApi.md#getissuingdisputes) | **GET** /v1/issuing/disputes | +*DefaultApi* | [**getIssuingDisputesDispute**](doc//DefaultApi.md#getissuingdisputesdispute) | **GET** /v1/issuing/disputes/{dispute} | +*DefaultApi* | [**getIssuingSettlements**](doc//DefaultApi.md#getissuingsettlements) | **GET** /v1/issuing/settlements | +*DefaultApi* | [**getIssuingSettlementsSettlement**](doc//DefaultApi.md#getissuingsettlementssettlement) | **GET** /v1/issuing/settlements/{settlement} | +*DefaultApi* | [**getIssuingTransactions**](doc//DefaultApi.md#getissuingtransactions) | **GET** /v1/issuing/transactions | +*DefaultApi* | [**getIssuingTransactionsTransaction**](doc//DefaultApi.md#getissuingtransactionstransaction) | **GET** /v1/issuing/transactions/{transaction} | +*DefaultApi* | [**getMandatesMandate**](doc//DefaultApi.md#getmandatesmandate) | **GET** /v1/mandates/{mandate} | +*DefaultApi* | [**getOrderReturns**](doc//DefaultApi.md#getorderreturns) | **GET** /v1/order_returns | +*DefaultApi* | [**getOrderReturnsId**](doc//DefaultApi.md#getorderreturnsid) | **GET** /v1/order_returns/{id} | +*DefaultApi* | [**getOrders**](doc//DefaultApi.md#getorders) | **GET** /v1/orders | +*DefaultApi* | [**getOrdersId**](doc//DefaultApi.md#getordersid) | **GET** /v1/orders/{id} | +*DefaultApi* | [**getPaymentIntents**](doc//DefaultApi.md#getpaymentintents) | **GET** /v1/payment_intents | +*DefaultApi* | [**getPaymentIntentsIntent**](doc//DefaultApi.md#getpaymentintentsintent) | **GET** /v1/payment_intents/{intent} | +*DefaultApi* | [**getPaymentMethods**](doc//DefaultApi.md#getpaymentmethods) | **GET** /v1/payment_methods | +*DefaultApi* | [**getPaymentMethodsPaymentMethod**](doc//DefaultApi.md#getpaymentmethodspaymentmethod) | **GET** /v1/payment_methods/{payment_method} | +*DefaultApi* | [**getPayouts**](doc//DefaultApi.md#getpayouts) | **GET** /v1/payouts | +*DefaultApi* | [**getPayoutsPayout**](doc//DefaultApi.md#getpayoutspayout) | **GET** /v1/payouts/{payout} | +*DefaultApi* | [**getPlans**](doc//DefaultApi.md#getplans) | **GET** /v1/plans | +*DefaultApi* | [**getPlansPlan**](doc//DefaultApi.md#getplansplan) | **GET** /v1/plans/{plan} | +*DefaultApi* | [**getPrices**](doc//DefaultApi.md#getprices) | **GET** /v1/prices | +*DefaultApi* | [**getPricesPrice**](doc//DefaultApi.md#getpricesprice) | **GET** /v1/prices/{price} | +*DefaultApi* | [**getProducts**](doc//DefaultApi.md#getproducts) | **GET** /v1/products | +*DefaultApi* | [**getProductsId**](doc//DefaultApi.md#getproductsid) | **GET** /v1/products/{id} | +*DefaultApi* | [**getPromotionCodes**](doc//DefaultApi.md#getpromotioncodes) | **GET** /v1/promotion_codes | +*DefaultApi* | [**getPromotionCodesPromotionCode**](doc//DefaultApi.md#getpromotioncodespromotioncode) | **GET** /v1/promotion_codes/{promotion_code} | +*DefaultApi* | [**getRadarEarlyFraudWarnings**](doc//DefaultApi.md#getradarearlyfraudwarnings) | **GET** /v1/radar/early_fraud_warnings | +*DefaultApi* | [**getRadarEarlyFraudWarningsEarlyFraudWarning**](doc//DefaultApi.md#getradarearlyfraudwarningsearlyfraudwarning) | **GET** /v1/radar/early_fraud_warnings/{early_fraud_warning} | +*DefaultApi* | [**getRadarValueListItems**](doc//DefaultApi.md#getradarvaluelistitems) | **GET** /v1/radar/value_list_items | +*DefaultApi* | [**getRadarValueListItemsItem**](doc//DefaultApi.md#getradarvaluelistitemsitem) | **GET** /v1/radar/value_list_items/{item} | +*DefaultApi* | [**getRadarValueLists**](doc//DefaultApi.md#getradarvaluelists) | **GET** /v1/radar/value_lists | +*DefaultApi* | [**getRadarValueListsValueList**](doc//DefaultApi.md#getradarvaluelistsvaluelist) | **GET** /v1/radar/value_lists/{value_list} | +*DefaultApi* | [**getRecipients**](doc//DefaultApi.md#getrecipients) | **GET** /v1/recipients | +*DefaultApi* | [**getRecipientsId**](doc//DefaultApi.md#getrecipientsid) | **GET** /v1/recipients/{id} | +*DefaultApi* | [**getRefunds**](doc//DefaultApi.md#getrefunds) | **GET** /v1/refunds | +*DefaultApi* | [**getRefundsRefund**](doc//DefaultApi.md#getrefundsrefund) | **GET** /v1/refunds/{refund} | +*DefaultApi* | [**getReportingReportRuns**](doc//DefaultApi.md#getreportingreportruns) | **GET** /v1/reporting/report_runs | +*DefaultApi* | [**getReportingReportRunsReportRun**](doc//DefaultApi.md#getreportingreportrunsreportrun) | **GET** /v1/reporting/report_runs/{report_run} | +*DefaultApi* | [**getReportingReportTypes**](doc//DefaultApi.md#getreportingreporttypes) | **GET** /v1/reporting/report_types | +*DefaultApi* | [**getReportingReportTypesReportType**](doc//DefaultApi.md#getreportingreporttypesreporttype) | **GET** /v1/reporting/report_types/{report_type} | +*DefaultApi* | [**getReviews**](doc//DefaultApi.md#getreviews) | **GET** /v1/reviews | +*DefaultApi* | [**getReviewsReview**](doc//DefaultApi.md#getreviewsreview) | **GET** /v1/reviews/{review} | +*DefaultApi* | [**getSetupAttempts**](doc//DefaultApi.md#getsetupattempts) | **GET** /v1/setup_attempts | +*DefaultApi* | [**getSetupIntents**](doc//DefaultApi.md#getsetupintents) | **GET** /v1/setup_intents | +*DefaultApi* | [**getSetupIntentsIntent**](doc//DefaultApi.md#getsetupintentsintent) | **GET** /v1/setup_intents/{intent} | +*DefaultApi* | [**getSigmaScheduledQueryRuns**](doc//DefaultApi.md#getsigmascheduledqueryruns) | **GET** /v1/sigma/scheduled_query_runs | +*DefaultApi* | [**getSigmaScheduledQueryRunsScheduledQueryRun**](doc//DefaultApi.md#getsigmascheduledqueryrunsscheduledqueryrun) | **GET** /v1/sigma/scheduled_query_runs/{scheduled_query_run} | +*DefaultApi* | [**getSkus**](doc//DefaultApi.md#getskus) | **GET** /v1/skus | +*DefaultApi* | [**getSkusId**](doc//DefaultApi.md#getskusid) | **GET** /v1/skus/{id} | +*DefaultApi* | [**getSourcesSource**](doc//DefaultApi.md#getsourcessource) | **GET** /v1/sources/{source} | +*DefaultApi* | [**getSourcesSourceMandateNotificationsMandateNotification**](doc//DefaultApi.md#getsourcessourcemandatenotificationsmandatenotification) | **GET** /v1/sources/{source}/mandate_notifications/{mandate_notification} | +*DefaultApi* | [**getSourcesSourceSourceTransactions**](doc//DefaultApi.md#getsourcessourcesourcetransactions) | **GET** /v1/sources/{source}/source_transactions | +*DefaultApi* | [**getSourcesSourceSourceTransactionsSourceTransaction**](doc//DefaultApi.md#getsourcessourcesourcetransactionssourcetransaction) | **GET** /v1/sources/{source}/source_transactions/{source_transaction} | +*DefaultApi* | [**getSubscriptionItems**](doc//DefaultApi.md#getsubscriptionitems) | **GET** /v1/subscription_items | +*DefaultApi* | [**getSubscriptionItemsItem**](doc//DefaultApi.md#getsubscriptionitemsitem) | **GET** /v1/subscription_items/{item} | +*DefaultApi* | [**getSubscriptionItemsSubscriptionItemUsageRecordSummaries**](doc//DefaultApi.md#getsubscriptionitemssubscriptionitemusagerecordsummaries) | **GET** /v1/subscription_items/{subscription_item}/usage_record_summaries | +*DefaultApi* | [**getSubscriptionSchedules**](doc//DefaultApi.md#getsubscriptionschedules) | **GET** /v1/subscription_schedules | +*DefaultApi* | [**getSubscriptionSchedulesSchedule**](doc//DefaultApi.md#getsubscriptionschedulesschedule) | **GET** /v1/subscription_schedules/{schedule} | +*DefaultApi* | [**getSubscriptions**](doc//DefaultApi.md#getsubscriptions) | **GET** /v1/subscriptions | +*DefaultApi* | [**getSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#getsubscriptionssubscriptionexposedid) | **GET** /v1/subscriptions/{subscription_exposed_id} | +*DefaultApi* | [**getTaxRates**](doc//DefaultApi.md#gettaxrates) | **GET** /v1/tax_rates | +*DefaultApi* | [**getTaxRatesTaxRate**](doc//DefaultApi.md#gettaxratestaxrate) | **GET** /v1/tax_rates/{tax_rate} | +*DefaultApi* | [**getTerminalLocations**](doc//DefaultApi.md#getterminallocations) | **GET** /v1/terminal/locations | +*DefaultApi* | [**getTerminalLocationsLocation**](doc//DefaultApi.md#getterminallocationslocation) | **GET** /v1/terminal/locations/{location} | +*DefaultApi* | [**getTerminalReaders**](doc//DefaultApi.md#getterminalreaders) | **GET** /v1/terminal/readers | +*DefaultApi* | [**getTerminalReadersReader**](doc//DefaultApi.md#getterminalreadersreader) | **GET** /v1/terminal/readers/{reader} | +*DefaultApi* | [**getTokensToken**](doc//DefaultApi.md#gettokenstoken) | **GET** /v1/tokens/{token} | +*DefaultApi* | [**getTopups**](doc//DefaultApi.md#gettopups) | **GET** /v1/topups | +*DefaultApi* | [**getTopupsTopup**](doc//DefaultApi.md#gettopupstopup) | **GET** /v1/topups/{topup} | +*DefaultApi* | [**getTransfers**](doc//DefaultApi.md#gettransfers) | **GET** /v1/transfers | +*DefaultApi* | [**getTransfersIdReversals**](doc//DefaultApi.md#gettransfersidreversals) | **GET** /v1/transfers/{id}/reversals | +*DefaultApi* | [**getTransfersTransfer**](doc//DefaultApi.md#gettransferstransfer) | **GET** /v1/transfers/{transfer} | +*DefaultApi* | [**getTransfersTransferReversalsId**](doc//DefaultApi.md#gettransferstransferreversalsid) | **GET** /v1/transfers/{transfer}/reversals/{id} | +*DefaultApi* | [**getWebhookEndpoints**](doc//DefaultApi.md#getwebhookendpoints) | **GET** /v1/webhook_endpoints | +*DefaultApi* | [**getWebhookEndpointsWebhookEndpoint**](doc//DefaultApi.md#getwebhookendpointswebhookendpoint) | **GET** /v1/webhook_endpoints/{webhook_endpoint} | +*DefaultApi* | [**post3dSecure**](doc//DefaultApi.md#post3dsecure) | **POST** /v1/3d_secure | +*DefaultApi* | [**postAccount**](doc//DefaultApi.md#postaccount) | **POST** /v1/account | +*DefaultApi* | [**postAccountBankAccounts**](doc//DefaultApi.md#postaccountbankaccounts) | **POST** /v1/account/bank_accounts | +*DefaultApi* | [**postAccountBankAccountsId**](doc//DefaultApi.md#postaccountbankaccountsid) | **POST** /v1/account/bank_accounts/{id} | +*DefaultApi* | [**postAccountCapabilitiesCapability**](doc//DefaultApi.md#postaccountcapabilitiescapability) | **POST** /v1/account/capabilities/{capability} | +*DefaultApi* | [**postAccountExternalAccounts**](doc//DefaultApi.md#postaccountexternalaccounts) | **POST** /v1/account/external_accounts | +*DefaultApi* | [**postAccountExternalAccountsId**](doc//DefaultApi.md#postaccountexternalaccountsid) | **POST** /v1/account/external_accounts/{id} | +*DefaultApi* | [**postAccountLinks**](doc//DefaultApi.md#postaccountlinks) | **POST** /v1/account_links | +*DefaultApi* | [**postAccountLoginLinks**](doc//DefaultApi.md#postaccountloginlinks) | **POST** /v1/account/login_links | +*DefaultApi* | [**postAccountPeople**](doc//DefaultApi.md#postaccountpeople) | **POST** /v1/account/people | +*DefaultApi* | [**postAccountPeoplePerson**](doc//DefaultApi.md#postaccountpeopleperson) | **POST** /v1/account/people/{person} | +*DefaultApi* | [**postAccountPersons**](doc//DefaultApi.md#postaccountpersons) | **POST** /v1/account/persons | +*DefaultApi* | [**postAccountPersonsPerson**](doc//DefaultApi.md#postaccountpersonsperson) | **POST** /v1/account/persons/{person} | +*DefaultApi* | [**postAccounts**](doc//DefaultApi.md#postaccounts) | **POST** /v1/accounts | +*DefaultApi* | [**postAccountsAccount**](doc//DefaultApi.md#postaccountsaccount) | **POST** /v1/accounts/{account} | +*DefaultApi* | [**postAccountsAccountBankAccounts**](doc//DefaultApi.md#postaccountsaccountbankaccounts) | **POST** /v1/accounts/{account}/bank_accounts | +*DefaultApi* | [**postAccountsAccountBankAccountsId**](doc//DefaultApi.md#postaccountsaccountbankaccountsid) | **POST** /v1/accounts/{account}/bank_accounts/{id} | +*DefaultApi* | [**postAccountsAccountCapabilitiesCapability**](doc//DefaultApi.md#postaccountsaccountcapabilitiescapability) | **POST** /v1/accounts/{account}/capabilities/{capability} | +*DefaultApi* | [**postAccountsAccountExternalAccounts**](doc//DefaultApi.md#postaccountsaccountexternalaccounts) | **POST** /v1/accounts/{account}/external_accounts | +*DefaultApi* | [**postAccountsAccountExternalAccountsId**](doc//DefaultApi.md#postaccountsaccountexternalaccountsid) | **POST** /v1/accounts/{account}/external_accounts/{id} | +*DefaultApi* | [**postAccountsAccountLoginLinks**](doc//DefaultApi.md#postaccountsaccountloginlinks) | **POST** /v1/accounts/{account}/login_links | +*DefaultApi* | [**postAccountsAccountPeople**](doc//DefaultApi.md#postaccountsaccountpeople) | **POST** /v1/accounts/{account}/people | +*DefaultApi* | [**postAccountsAccountPeoplePerson**](doc//DefaultApi.md#postaccountsaccountpeopleperson) | **POST** /v1/accounts/{account}/people/{person} | +*DefaultApi* | [**postAccountsAccountPersons**](doc//DefaultApi.md#postaccountsaccountpersons) | **POST** /v1/accounts/{account}/persons | +*DefaultApi* | [**postAccountsAccountPersonsPerson**](doc//DefaultApi.md#postaccountsaccountpersonsperson) | **POST** /v1/accounts/{account}/persons/{person} | +*DefaultApi* | [**postAccountsAccountReject**](doc//DefaultApi.md#postaccountsaccountreject) | **POST** /v1/accounts/{account}/reject | +*DefaultApi* | [**postApplePayDomains**](doc//DefaultApi.md#postapplepaydomains) | **POST** /v1/apple_pay/domains | +*DefaultApi* | [**postApplicationFeesFeeRefundsId**](doc//DefaultApi.md#postapplicationfeesfeerefundsid) | **POST** /v1/application_fees/{fee}/refunds/{id} | +*DefaultApi* | [**postApplicationFeesIdRefund**](doc//DefaultApi.md#postapplicationfeesidrefund) | **POST** /v1/application_fees/{id}/refund | +*DefaultApi* | [**postApplicationFeesIdRefunds**](doc//DefaultApi.md#postapplicationfeesidrefunds) | **POST** /v1/application_fees/{id}/refunds | +*DefaultApi* | [**postBillingPortalConfigurations**](doc//DefaultApi.md#postbillingportalconfigurations) | **POST** /v1/billing_portal/configurations | +*DefaultApi* | [**postBillingPortalConfigurationsConfiguration**](doc//DefaultApi.md#postbillingportalconfigurationsconfiguration) | **POST** /v1/billing_portal/configurations/{configuration} | +*DefaultApi* | [**postBillingPortalSessions**](doc//DefaultApi.md#postbillingportalsessions) | **POST** /v1/billing_portal/sessions | +*DefaultApi* | [**postCharges**](doc//DefaultApi.md#postcharges) | **POST** /v1/charges | +*DefaultApi* | [**postChargesCharge**](doc//DefaultApi.md#postchargescharge) | **POST** /v1/charges/{charge} | +*DefaultApi* | [**postChargesChargeCapture**](doc//DefaultApi.md#postchargeschargecapture) | **POST** /v1/charges/{charge}/capture | +*DefaultApi* | [**postChargesChargeDispute**](doc//DefaultApi.md#postchargeschargedispute) | **POST** /v1/charges/{charge}/dispute | +*DefaultApi* | [**postChargesChargeDisputeClose**](doc//DefaultApi.md#postchargeschargedisputeclose) | **POST** /v1/charges/{charge}/dispute/close | +*DefaultApi* | [**postChargesChargeRefund**](doc//DefaultApi.md#postchargeschargerefund) | **POST** /v1/charges/{charge}/refund | +*DefaultApi* | [**postChargesChargeRefunds**](doc//DefaultApi.md#postchargeschargerefunds) | **POST** /v1/charges/{charge}/refunds | +*DefaultApi* | [**postChargesChargeRefundsRefund**](doc//DefaultApi.md#postchargeschargerefundsrefund) | **POST** /v1/charges/{charge}/refunds/{refund} | +*DefaultApi* | [**postCheckoutSessions**](doc//DefaultApi.md#postcheckoutsessions) | **POST** /v1/checkout/sessions | +*DefaultApi* | [**postCoupons**](doc//DefaultApi.md#postcoupons) | **POST** /v1/coupons | +*DefaultApi* | [**postCouponsCoupon**](doc//DefaultApi.md#postcouponscoupon) | **POST** /v1/coupons/{coupon} | +*DefaultApi* | [**postCreditNotes**](doc//DefaultApi.md#postcreditnotes) | **POST** /v1/credit_notes | +*DefaultApi* | [**postCreditNotesId**](doc//DefaultApi.md#postcreditnotesid) | **POST** /v1/credit_notes/{id} | +*DefaultApi* | [**postCreditNotesIdVoid**](doc//DefaultApi.md#postcreditnotesidvoid) | **POST** /v1/credit_notes/{id}/void | +*DefaultApi* | [**postCustomers**](doc//DefaultApi.md#postcustomers) | **POST** /v1/customers | +*DefaultApi* | [**postCustomersCustomer**](doc//DefaultApi.md#postcustomerscustomer) | **POST** /v1/customers/{customer} | +*DefaultApi* | [**postCustomersCustomerBalanceTransactions**](doc//DefaultApi.md#postcustomerscustomerbalancetransactions) | **POST** /v1/customers/{customer}/balance_transactions | +*DefaultApi* | [**postCustomersCustomerBalanceTransactionsTransaction**](doc//DefaultApi.md#postcustomerscustomerbalancetransactionstransaction) | **POST** /v1/customers/{customer}/balance_transactions/{transaction} | +*DefaultApi* | [**postCustomersCustomerBankAccounts**](doc//DefaultApi.md#postcustomerscustomerbankaccounts) | **POST** /v1/customers/{customer}/bank_accounts | +*DefaultApi* | [**postCustomersCustomerBankAccountsId**](doc//DefaultApi.md#postcustomerscustomerbankaccountsid) | **POST** /v1/customers/{customer}/bank_accounts/{id} | +*DefaultApi* | [**postCustomersCustomerBankAccountsIdVerify**](doc//DefaultApi.md#postcustomerscustomerbankaccountsidverify) | **POST** /v1/customers/{customer}/bank_accounts/{id}/verify | +*DefaultApi* | [**postCustomersCustomerCards**](doc//DefaultApi.md#postcustomerscustomercards) | **POST** /v1/customers/{customer}/cards | +*DefaultApi* | [**postCustomersCustomerCardsId**](doc//DefaultApi.md#postcustomerscustomercardsid) | **POST** /v1/customers/{customer}/cards/{id} | +*DefaultApi* | [**postCustomersCustomerSources**](doc//DefaultApi.md#postcustomerscustomersources) | **POST** /v1/customers/{customer}/sources | +*DefaultApi* | [**postCustomersCustomerSourcesId**](doc//DefaultApi.md#postcustomerscustomersourcesid) | **POST** /v1/customers/{customer}/sources/{id} | +*DefaultApi* | [**postCustomersCustomerSourcesIdVerify**](doc//DefaultApi.md#postcustomerscustomersourcesidverify) | **POST** /v1/customers/{customer}/sources/{id}/verify | +*DefaultApi* | [**postCustomersCustomerSubscriptions**](doc//DefaultApi.md#postcustomerscustomersubscriptions) | **POST** /v1/customers/{customer}/subscriptions | +*DefaultApi* | [**postCustomersCustomerSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#postcustomerscustomersubscriptionssubscriptionexposedid) | **POST** /v1/customers/{customer}/subscriptions/{subscription_exposed_id} | +*DefaultApi* | [**postCustomersCustomerTaxIds**](doc//DefaultApi.md#postcustomerscustomertaxids) | **POST** /v1/customers/{customer}/tax_ids | +*DefaultApi* | [**postDisputesDispute**](doc//DefaultApi.md#postdisputesdispute) | **POST** /v1/disputes/{dispute} | +*DefaultApi* | [**postDisputesDisputeClose**](doc//DefaultApi.md#postdisputesdisputeclose) | **POST** /v1/disputes/{dispute}/close | +*DefaultApi* | [**postEphemeralKeys**](doc//DefaultApi.md#postephemeralkeys) | **POST** /v1/ephemeral_keys | +*DefaultApi* | [**postFileLinks**](doc//DefaultApi.md#postfilelinks) | **POST** /v1/file_links | +*DefaultApi* | [**postFileLinksLink**](doc//DefaultApi.md#postfilelinkslink) | **POST** /v1/file_links/{link} | +*DefaultApi* | [**postFiles**](doc//DefaultApi.md#postfiles) | **POST** /v1/files | +*DefaultApi* | [**postInvoiceitems**](doc//DefaultApi.md#postinvoiceitems) | **POST** /v1/invoiceitems | +*DefaultApi* | [**postInvoiceitemsInvoiceitem**](doc//DefaultApi.md#postinvoiceitemsinvoiceitem) | **POST** /v1/invoiceitems/{invoiceitem} | +*DefaultApi* | [**postInvoices**](doc//DefaultApi.md#postinvoices) | **POST** /v1/invoices | +*DefaultApi* | [**postInvoicesInvoice**](doc//DefaultApi.md#postinvoicesinvoice) | **POST** /v1/invoices/{invoice} | +*DefaultApi* | [**postInvoicesInvoiceFinalize**](doc//DefaultApi.md#postinvoicesinvoicefinalize) | **POST** /v1/invoices/{invoice}/finalize | +*DefaultApi* | [**postInvoicesInvoiceMarkUncollectible**](doc//DefaultApi.md#postinvoicesinvoicemarkuncollectible) | **POST** /v1/invoices/{invoice}/mark_uncollectible | +*DefaultApi* | [**postInvoicesInvoicePay**](doc//DefaultApi.md#postinvoicesinvoicepay) | **POST** /v1/invoices/{invoice}/pay | +*DefaultApi* | [**postInvoicesInvoiceSend**](doc//DefaultApi.md#postinvoicesinvoicesend) | **POST** /v1/invoices/{invoice}/send | +*DefaultApi* | [**postInvoicesInvoiceVoid**](doc//DefaultApi.md#postinvoicesinvoicevoid) | **POST** /v1/invoices/{invoice}/void | +*DefaultApi* | [**postIssuingAuthorizationsAuthorization**](doc//DefaultApi.md#postissuingauthorizationsauthorization) | **POST** /v1/issuing/authorizations/{authorization} | +*DefaultApi* | [**postIssuingAuthorizationsAuthorizationApprove**](doc//DefaultApi.md#postissuingauthorizationsauthorizationapprove) | **POST** /v1/issuing/authorizations/{authorization}/approve | +*DefaultApi* | [**postIssuingAuthorizationsAuthorizationDecline**](doc//DefaultApi.md#postissuingauthorizationsauthorizationdecline) | **POST** /v1/issuing/authorizations/{authorization}/decline | +*DefaultApi* | [**postIssuingCardholders**](doc//DefaultApi.md#postissuingcardholders) | **POST** /v1/issuing/cardholders | +*DefaultApi* | [**postIssuingCardholdersCardholder**](doc//DefaultApi.md#postissuingcardholderscardholder) | **POST** /v1/issuing/cardholders/{cardholder} | +*DefaultApi* | [**postIssuingCards**](doc//DefaultApi.md#postissuingcards) | **POST** /v1/issuing/cards | +*DefaultApi* | [**postIssuingCardsCard**](doc//DefaultApi.md#postissuingcardscard) | **POST** /v1/issuing/cards/{card} | +*DefaultApi* | [**postIssuingDisputes**](doc//DefaultApi.md#postissuingdisputes) | **POST** /v1/issuing/disputes | +*DefaultApi* | [**postIssuingDisputesDispute**](doc//DefaultApi.md#postissuingdisputesdispute) | **POST** /v1/issuing/disputes/{dispute} | +*DefaultApi* | [**postIssuingDisputesDisputeSubmit**](doc//DefaultApi.md#postissuingdisputesdisputesubmit) | **POST** /v1/issuing/disputes/{dispute}/submit | +*DefaultApi* | [**postIssuingSettlementsSettlement**](doc//DefaultApi.md#postissuingsettlementssettlement) | **POST** /v1/issuing/settlements/{settlement} | +*DefaultApi* | [**postIssuingTransactionsTransaction**](doc//DefaultApi.md#postissuingtransactionstransaction) | **POST** /v1/issuing/transactions/{transaction} | +*DefaultApi* | [**postOrders**](doc//DefaultApi.md#postorders) | **POST** /v1/orders | +*DefaultApi* | [**postOrdersId**](doc//DefaultApi.md#postordersid) | **POST** /v1/orders/{id} | +*DefaultApi* | [**postOrdersIdPay**](doc//DefaultApi.md#postordersidpay) | **POST** /v1/orders/{id}/pay | +*DefaultApi* | [**postOrdersIdReturns**](doc//DefaultApi.md#postordersidreturns) | **POST** /v1/orders/{id}/returns | +*DefaultApi* | [**postPaymentIntents**](doc//DefaultApi.md#postpaymentintents) | **POST** /v1/payment_intents | +*DefaultApi* | [**postPaymentIntentsIntent**](doc//DefaultApi.md#postpaymentintentsintent) | **POST** /v1/payment_intents/{intent} | +*DefaultApi* | [**postPaymentIntentsIntentCancel**](doc//DefaultApi.md#postpaymentintentsintentcancel) | **POST** /v1/payment_intents/{intent}/cancel | +*DefaultApi* | [**postPaymentIntentsIntentCapture**](doc//DefaultApi.md#postpaymentintentsintentcapture) | **POST** /v1/payment_intents/{intent}/capture | +*DefaultApi* | [**postPaymentIntentsIntentConfirm**](doc//DefaultApi.md#postpaymentintentsintentconfirm) | **POST** /v1/payment_intents/{intent}/confirm | +*DefaultApi* | [**postPaymentMethods**](doc//DefaultApi.md#postpaymentmethods) | **POST** /v1/payment_methods | +*DefaultApi* | [**postPaymentMethodsPaymentMethod**](doc//DefaultApi.md#postpaymentmethodspaymentmethod) | **POST** /v1/payment_methods/{payment_method} | +*DefaultApi* | [**postPaymentMethodsPaymentMethodAttach**](doc//DefaultApi.md#postpaymentmethodspaymentmethodattach) | **POST** /v1/payment_methods/{payment_method}/attach | +*DefaultApi* | [**postPaymentMethodsPaymentMethodDetach**](doc//DefaultApi.md#postpaymentmethodspaymentmethoddetach) | **POST** /v1/payment_methods/{payment_method}/detach | +*DefaultApi* | [**postPayouts**](doc//DefaultApi.md#postpayouts) | **POST** /v1/payouts | +*DefaultApi* | [**postPayoutsPayout**](doc//DefaultApi.md#postpayoutspayout) | **POST** /v1/payouts/{payout} | +*DefaultApi* | [**postPayoutsPayoutCancel**](doc//DefaultApi.md#postpayoutspayoutcancel) | **POST** /v1/payouts/{payout}/cancel | +*DefaultApi* | [**postPayoutsPayoutReverse**](doc//DefaultApi.md#postpayoutspayoutreverse) | **POST** /v1/payouts/{payout}/reverse | +*DefaultApi* | [**postPlans**](doc//DefaultApi.md#postplans) | **POST** /v1/plans | +*DefaultApi* | [**postPlansPlan**](doc//DefaultApi.md#postplansplan) | **POST** /v1/plans/{plan} | +*DefaultApi* | [**postPrices**](doc//DefaultApi.md#postprices) | **POST** /v1/prices | +*DefaultApi* | [**postPricesPrice**](doc//DefaultApi.md#postpricesprice) | **POST** /v1/prices/{price} | +*DefaultApi* | [**postProducts**](doc//DefaultApi.md#postproducts) | **POST** /v1/products | +*DefaultApi* | [**postProductsId**](doc//DefaultApi.md#postproductsid) | **POST** /v1/products/{id} | +*DefaultApi* | [**postPromotionCodes**](doc//DefaultApi.md#postpromotioncodes) | **POST** /v1/promotion_codes | +*DefaultApi* | [**postPromotionCodesPromotionCode**](doc//DefaultApi.md#postpromotioncodespromotioncode) | **POST** /v1/promotion_codes/{promotion_code} | +*DefaultApi* | [**postRadarValueListItems**](doc//DefaultApi.md#postradarvaluelistitems) | **POST** /v1/radar/value_list_items | +*DefaultApi* | [**postRadarValueLists**](doc//DefaultApi.md#postradarvaluelists) | **POST** /v1/radar/value_lists | +*DefaultApi* | [**postRadarValueListsValueList**](doc//DefaultApi.md#postradarvaluelistsvaluelist) | **POST** /v1/radar/value_lists/{value_list} | +*DefaultApi* | [**postRecipients**](doc//DefaultApi.md#postrecipients) | **POST** /v1/recipients | +*DefaultApi* | [**postRecipientsId**](doc//DefaultApi.md#postrecipientsid) | **POST** /v1/recipients/{id} | +*DefaultApi* | [**postRefunds**](doc//DefaultApi.md#postrefunds) | **POST** /v1/refunds | +*DefaultApi* | [**postRefundsRefund**](doc//DefaultApi.md#postrefundsrefund) | **POST** /v1/refunds/{refund} | +*DefaultApi* | [**postReportingReportRuns**](doc//DefaultApi.md#postreportingreportruns) | **POST** /v1/reporting/report_runs | +*DefaultApi* | [**postReviewsReviewApprove**](doc//DefaultApi.md#postreviewsreviewapprove) | **POST** /v1/reviews/{review}/approve | +*DefaultApi* | [**postSetupIntents**](doc//DefaultApi.md#postsetupintents) | **POST** /v1/setup_intents | +*DefaultApi* | [**postSetupIntentsIntent**](doc//DefaultApi.md#postsetupintentsintent) | **POST** /v1/setup_intents/{intent} | +*DefaultApi* | [**postSetupIntentsIntentCancel**](doc//DefaultApi.md#postsetupintentsintentcancel) | **POST** /v1/setup_intents/{intent}/cancel | +*DefaultApi* | [**postSetupIntentsIntentConfirm**](doc//DefaultApi.md#postsetupintentsintentconfirm) | **POST** /v1/setup_intents/{intent}/confirm | +*DefaultApi* | [**postSkus**](doc//DefaultApi.md#postskus) | **POST** /v1/skus | +*DefaultApi* | [**postSkusId**](doc//DefaultApi.md#postskusid) | **POST** /v1/skus/{id} | +*DefaultApi* | [**postSources**](doc//DefaultApi.md#postsources) | **POST** /v1/sources | +*DefaultApi* | [**postSourcesSource**](doc//DefaultApi.md#postsourcessource) | **POST** /v1/sources/{source} | +*DefaultApi* | [**postSourcesSourceVerify**](doc//DefaultApi.md#postsourcessourceverify) | **POST** /v1/sources/{source}/verify | +*DefaultApi* | [**postSubscriptionItems**](doc//DefaultApi.md#postsubscriptionitems) | **POST** /v1/subscription_items | +*DefaultApi* | [**postSubscriptionItemsItem**](doc//DefaultApi.md#postsubscriptionitemsitem) | **POST** /v1/subscription_items/{item} | +*DefaultApi* | [**postSubscriptionItemsSubscriptionItemUsageRecords**](doc//DefaultApi.md#postsubscriptionitemssubscriptionitemusagerecords) | **POST** /v1/subscription_items/{subscription_item}/usage_records | +*DefaultApi* | [**postSubscriptionSchedules**](doc//DefaultApi.md#postsubscriptionschedules) | **POST** /v1/subscription_schedules | +*DefaultApi* | [**postSubscriptionSchedulesSchedule**](doc//DefaultApi.md#postsubscriptionschedulesschedule) | **POST** /v1/subscription_schedules/{schedule} | +*DefaultApi* | [**postSubscriptionSchedulesScheduleCancel**](doc//DefaultApi.md#postsubscriptionschedulesschedulecancel) | **POST** /v1/subscription_schedules/{schedule}/cancel | +*DefaultApi* | [**postSubscriptionSchedulesScheduleRelease**](doc//DefaultApi.md#postsubscriptionschedulesschedulerelease) | **POST** /v1/subscription_schedules/{schedule}/release | +*DefaultApi* | [**postSubscriptions**](doc//DefaultApi.md#postsubscriptions) | **POST** /v1/subscriptions | +*DefaultApi* | [**postSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#postsubscriptionssubscriptionexposedid) | **POST** /v1/subscriptions/{subscription_exposed_id} | +*DefaultApi* | [**postTaxRates**](doc//DefaultApi.md#posttaxrates) | **POST** /v1/tax_rates | +*DefaultApi* | [**postTaxRatesTaxRate**](doc//DefaultApi.md#posttaxratestaxrate) | **POST** /v1/tax_rates/{tax_rate} | +*DefaultApi* | [**postTerminalConnectionTokens**](doc//DefaultApi.md#postterminalconnectiontokens) | **POST** /v1/terminal/connection_tokens | +*DefaultApi* | [**postTerminalLocations**](doc//DefaultApi.md#postterminallocations) | **POST** /v1/terminal/locations | +*DefaultApi* | [**postTerminalLocationsLocation**](doc//DefaultApi.md#postterminallocationslocation) | **POST** /v1/terminal/locations/{location} | +*DefaultApi* | [**postTerminalReaders**](doc//DefaultApi.md#postterminalreaders) | **POST** /v1/terminal/readers | +*DefaultApi* | [**postTerminalReadersReader**](doc//DefaultApi.md#postterminalreadersreader) | **POST** /v1/terminal/readers/{reader} | +*DefaultApi* | [**postTokens**](doc//DefaultApi.md#posttokens) | **POST** /v1/tokens | +*DefaultApi* | [**postTopups**](doc//DefaultApi.md#posttopups) | **POST** /v1/topups | +*DefaultApi* | [**postTopupsTopup**](doc//DefaultApi.md#posttopupstopup) | **POST** /v1/topups/{topup} | +*DefaultApi* | [**postTopupsTopupCancel**](doc//DefaultApi.md#posttopupstopupcancel) | **POST** /v1/topups/{topup}/cancel | +*DefaultApi* | [**postTransfers**](doc//DefaultApi.md#posttransfers) | **POST** /v1/transfers | +*DefaultApi* | [**postTransfersIdReversals**](doc//DefaultApi.md#posttransfersidreversals) | **POST** /v1/transfers/{id}/reversals | +*DefaultApi* | [**postTransfersTransfer**](doc//DefaultApi.md#posttransferstransfer) | **POST** /v1/transfers/{transfer} | +*DefaultApi* | [**postTransfersTransferReversalsId**](doc//DefaultApi.md#posttransferstransferreversalsid) | **POST** /v1/transfers/{transfer}/reversals/{id} | +*DefaultApi* | [**postWebhookEndpoints**](doc//DefaultApi.md#postwebhookendpoints) | **POST** /v1/webhook_endpoints | +*DefaultApi* | [**postWebhookEndpointsWebhookEndpoint**](doc//DefaultApi.md#postwebhookendpointswebhookendpoint) | **POST** /v1/webhook_endpoints/{webhook_endpoint} | +*DefaultApi* | [**putAccountLogout**](doc//DefaultApi.md#putaccountlogout) | **PUT** /v1/account/logout | +*DefaultApi* | [**putAccountsAccountLogout**](doc//DefaultApi.md#putaccountsaccountlogout) | **PUT** /v1/accounts/{account}/logout | + + +## Documentation For Models + + - [Account](doc//Account.md) + - [AccountBacsDebitPaymentsSettings](doc//AccountBacsDebitPaymentsSettings.md) + - [AccountBrandingSettings](doc//AccountBrandingSettings.md) + - [AccountBusinessProfile](doc//AccountBusinessProfile.md) + - [AccountCapabilities](doc//AccountCapabilities.md) + - [AccountCapabilityRequirements](doc//AccountCapabilityRequirements.md) + - [AccountCardPaymentsSettings](doc//AccountCardPaymentsSettings.md) + - [AccountDashboardSettings](doc//AccountDashboardSettings.md) + - [AccountDeclineChargeOn](doc//AccountDeclineChargeOn.md) + - [AccountLink](doc//AccountLink.md) + - [AccountPaymentsSettings](doc//AccountPaymentsSettings.md) + - [AccountPayoutSettings](doc//AccountPayoutSettings.md) + - [AccountRequirements](doc//AccountRequirements.md) + - [AccountRequirementsError](doc//AccountRequirementsError.md) + - [AccountSepaDebitPaymentsSettings](doc//AccountSepaDebitPaymentsSettings.md) + - [AccountSettings](doc//AccountSettings.md) + - [AccountTosAcceptance](doc//AccountTosAcceptance.md) + - [Address](doc//Address.md) + - [AlipayAccount](doc//AlipayAccount.md) + - [AllPeopleRelationshipSpecs](doc//AllPeopleRelationshipSpecs.md) + - [AllPeopleRelationshipSpecs1](doc//AllPeopleRelationshipSpecs1.md) + - [AllPeopleRelationshipSpecs2](doc//AllPeopleRelationshipSpecs2.md) + - [AllPeopleRelationshipSpecs3](doc//AllPeopleRelationshipSpecs3.md) + - [AllPricesRecurringParams](doc//AllPricesRecurringParams.md) + - [ApiErrors](doc//ApiErrors.md) + - [ApmsSourcesSourceList](doc//ApmsSourcesSourceList.md) + - [ApmsSourcesSourceList1](doc//ApmsSourcesSourceList1.md) + - [ApmsSourcesSourceTransactionList](doc//ApmsSourcesSourceTransactionList.md) + - [ApplePayDomain](doc//ApplePayDomain.md) + - [ApplePayDomainList](doc//ApplePayDomainList.md) + - [Application](doc//Application.md) + - [ApplicationFee](doc//ApplicationFee.md) + - [Balance](doc//Balance.md) + - [BalanceAmount](doc//BalanceAmount.md) + - [BalanceAmountBySourceType](doc//BalanceAmountBySourceType.md) + - [BalanceDetail](doc//BalanceDetail.md) + - [BalanceTransaction](doc//BalanceTransaction.md) + - [BalanceTransactionsList](doc//BalanceTransactionsList.md) + - [BankAccount](doc//BankAccount.md) + - [BankAccountList](doc//BankAccountList.md) + - [BillingDetails](doc//BillingDetails.md) + - [BillingPortalConfiguration](doc//BillingPortalConfiguration.md) + - [BillingPortalSession](doc//BillingPortalSession.md) + - [BitcoinReceiver](doc//BitcoinReceiver.md) + - [BitcoinTransaction](doc//BitcoinTransaction.md) + - [BitcoinTransactionList](doc//BitcoinTransactionList.md) + - [BitcoinTransactionList1](doc//BitcoinTransactionList1.md) + - [Capability](doc//Capability.md) + - [Card](doc//Card.md) + - [CardGeneratedFromPaymentMethodDetails](doc//CardGeneratedFromPaymentMethodDetails.md) + - [CardList](doc//CardList.md) + - [CardList1](doc//CardList1.md) + - [Charge](doc//Charge.md) + - [ChargeFraudDetails](doc//ChargeFraudDetails.md) + - [ChargeOutcome](doc//ChargeOutcome.md) + - [ChargeTransferData](doc//ChargeTransferData.md) + - [CheckoutSession](doc//CheckoutSession.md) + - [ConnectCollectionTransfer](doc//ConnectCollectionTransfer.md) + - [CountrySpec](doc//CountrySpec.md) + - [CountrySpecVerificationFieldDetails](doc//CountrySpecVerificationFieldDetails.md) + - [CountrySpecVerificationFields](doc//CountrySpecVerificationFields.md) + - [Coupon](doc//Coupon.md) + - [CouponAppliesTo](doc//CouponAppliesTo.md) + - [CreditNote](doc//CreditNote.md) + - [CreditNoteLineItem](doc//CreditNoteLineItem.md) + - [CreditNoteLineItemParams](doc//CreditNoteLineItemParams.md) + - [CreditNoteLinesList](doc//CreditNoteLinesList.md) + - [CreditNoteLinesList1](doc//CreditNoteLinesList1.md) + - [CreditNoteTaxAmount](doc//CreditNoteTaxAmount.md) + - [CreditNotesList](doc//CreditNotesList.md) + - [Customer](doc//Customer.md) + - [CustomerAcceptance](doc//CustomerAcceptance.md) + - [CustomerBalanceTransaction](doc//CustomerBalanceTransaction.md) + - [CustomerBalanceTransactionList](doc//CustomerBalanceTransactionList.md) + - [DeletedAccount](doc//DeletedAccount.md) + - [DeletedAlipayAccount](doc//DeletedAlipayAccount.md) + - [DeletedApplePayDomain](doc//DeletedApplePayDomain.md) + - [DeletedBankAccount](doc//DeletedBankAccount.md) + - [DeletedBitcoinReceiver](doc//DeletedBitcoinReceiver.md) + - [DeletedCard](doc//DeletedCard.md) + - [DeletedCoupon](doc//DeletedCoupon.md) + - [DeletedCustomer](doc//DeletedCustomer.md) + - [DeletedDiscount](doc//DeletedDiscount.md) + - [DeletedExternalAccount](doc//DeletedExternalAccount.md) + - [DeletedInvoice](doc//DeletedInvoice.md) + - [DeletedInvoiceitem](doc//DeletedInvoiceitem.md) + - [DeletedPaymentSource](doc//DeletedPaymentSource.md) + - [DeletedPerson](doc//DeletedPerson.md) + - [DeletedPlan](doc//DeletedPlan.md) + - [DeletedPrice](doc//DeletedPrice.md) + - [DeletedProduct](doc//DeletedProduct.md) + - [DeletedRadarValueList](doc//DeletedRadarValueList.md) + - [DeletedRadarValueListItem](doc//DeletedRadarValueListItem.md) + - [DeletedRecipient](doc//DeletedRecipient.md) + - [DeletedSku](doc//DeletedSku.md) + - [DeletedSubscriptionItem](doc//DeletedSubscriptionItem.md) + - [DeletedTaxId](doc//DeletedTaxId.md) + - [DeletedTerminalLocation](doc//DeletedTerminalLocation.md) + - [DeletedTerminalReader](doc//DeletedTerminalReader.md) + - [DeletedWebhookEndpoint](doc//DeletedWebhookEndpoint.md) + - [DeliveryEstimate](doc//DeliveryEstimate.md) + - [Discount](doc//Discount.md) + - [DiscountsResourceDiscountAmount](doc//DiscountsResourceDiscountAmount.md) + - [Dispute](doc//Dispute.md) + - [DisputeEvidence](doc//DisputeEvidence.md) + - [DisputeEvidenceDetails](doc//DisputeEvidenceDetails.md) + - [EphemeralKey](doc//EphemeralKey.md) + - [Error](doc//Error.md) + - [Event](doc//Event.md) + - [ExchangeRate](doc//ExchangeRate.md) + - [ExternalAccount](doc//ExternalAccount.md) + - [ExternalAccountList](doc//ExternalAccountList.md) + - [ExternalAccountList1](doc//ExternalAccountList1.md) + - [Fee](doc//Fee.md) + - [FeeRefund](doc//FeeRefund.md) + - [FeeRefundList](doc//FeeRefundList.md) + - [FeeRefundList1](doc//FeeRefundList1.md) + - [FileFileLinkList](doc//FileFileLinkList.md) + - [FileLink](doc//FileLink.md) + - [FinancialReportingFinanceReportRunRunParameters](doc//FinancialReportingFinanceReportRunRunParameters.md) + - [FinancialReportingFinanceReportTypeList](doc//FinancialReportingFinanceReportTypeList.md) + - [InlineResponse200](doc//InlineResponse200.md) + - [InlineResponse2001](doc//InlineResponse2001.md) + - [InlineResponse20010](doc//InlineResponse20010.md) + - [InlineResponse20011](doc//InlineResponse20011.md) + - [InlineResponse20012](doc//InlineResponse20012.md) + - [InlineResponse20013](doc//InlineResponse20013.md) + - [InlineResponse20014](doc//InlineResponse20014.md) + - [InlineResponse20015](doc//InlineResponse20015.md) + - [InlineResponse20016](doc//InlineResponse20016.md) + - [InlineResponse20017](doc//InlineResponse20017.md) + - [InlineResponse20018](doc//InlineResponse20018.md) + - [InlineResponse20019](doc//InlineResponse20019.md) + - [InlineResponse2002](doc//InlineResponse2002.md) + - [InlineResponse20020](doc//InlineResponse20020.md) + - [InlineResponse20021](doc//InlineResponse20021.md) + - [InlineResponse20022](doc//InlineResponse20022.md) + - [InlineResponse20023](doc//InlineResponse20023.md) + - [InlineResponse20024](doc//InlineResponse20024.md) + - [InlineResponse20025](doc//InlineResponse20025.md) + - [InlineResponse20026](doc//InlineResponse20026.md) + - [InlineResponse20027](doc//InlineResponse20027.md) + - [InlineResponse20028](doc//InlineResponse20028.md) + - [InlineResponse20029](doc//InlineResponse20029.md) + - [InlineResponse2003](doc//InlineResponse2003.md) + - [InlineResponse20030](doc//InlineResponse20030.md) + - [InlineResponse20031](doc//InlineResponse20031.md) + - [InlineResponse20032](doc//InlineResponse20032.md) + - [InlineResponse20033](doc//InlineResponse20033.md) + - [InlineResponse20034](doc//InlineResponse20034.md) + - [InlineResponse20035](doc//InlineResponse20035.md) + - [InlineResponse20036](doc//InlineResponse20036.md) + - [InlineResponse2004](doc//InlineResponse2004.md) + - [InlineResponse2005](doc//InlineResponse2005.md) + - [InlineResponse2006](doc//InlineResponse2006.md) + - [InlineResponse2007](doc//InlineResponse2007.md) + - [InlineResponse2008](doc//InlineResponse2008.md) + - [InlineResponse2009](doc//InlineResponse2009.md) + - [Inventory](doc//Inventory.md) + - [Invoice](doc//Invoice.md) + - [InvoiceItemPreviewParams](doc//InvoiceItemPreviewParams.md) + - [InvoiceItemThresholdReason](doc//InvoiceItemThresholdReason.md) + - [InvoiceLineItemPeriod](doc//InvoiceLineItemPeriod.md) + - [InvoiceLinesList](doc//InvoiceLinesList.md) + - [InvoiceLinesList1](doc//InvoiceLinesList1.md) + - [InvoicePaymentMethodOptionsBancontact](doc//InvoicePaymentMethodOptionsBancontact.md) + - [InvoicePaymentMethodOptionsCard](doc//InvoicePaymentMethodOptionsCard.md) + - [InvoiceSettingCustomField](doc//InvoiceSettingCustomField.md) + - [InvoiceSettingCustomerSetting](doc//InvoiceSettingCustomerSetting.md) + - [InvoiceSettingSubscriptionScheduleSetting](doc//InvoiceSettingSubscriptionScheduleSetting.md) + - [InvoiceTaxAmount](doc//InvoiceTaxAmount.md) + - [InvoiceThresholdReason](doc//InvoiceThresholdReason.md) + - [InvoiceTransferData](doc//InvoiceTransferData.md) + - [Invoiceitem](doc//Invoiceitem.md) + - [InvoicesList](doc//InvoicesList.md) + - [InvoicesPaymentMethodOptions](doc//InvoicesPaymentMethodOptions.md) + - [InvoicesPaymentSettings](doc//InvoicesPaymentSettings.md) + - [InvoicesResourceInvoiceTaxId](doc//InvoicesResourceInvoiceTaxId.md) + - [InvoicesStatusTransitions](doc//InvoicesStatusTransitions.md) + - [IssuerFraudRecord](doc//IssuerFraudRecord.md) + - [IssuingAuthorization](doc//IssuingAuthorization.md) + - [IssuingAuthorizationAmountDetails](doc//IssuingAuthorizationAmountDetails.md) + - [IssuingAuthorizationMerchantData](doc//IssuingAuthorizationMerchantData.md) + - [IssuingAuthorizationPendingRequest](doc//IssuingAuthorizationPendingRequest.md) + - [IssuingAuthorizationRequest](doc//IssuingAuthorizationRequest.md) + - [IssuingAuthorizationVerificationData](doc//IssuingAuthorizationVerificationData.md) + - [IssuingCard](doc//IssuingCard.md) + - [IssuingCardAuthorizationControls](doc//IssuingCardAuthorizationControls.md) + - [IssuingCardShipping](doc//IssuingCardShipping.md) + - [IssuingCardSpendingLimit](doc//IssuingCardSpendingLimit.md) + - [IssuingCardholder](doc//IssuingCardholder.md) + - [IssuingCardholderAddress](doc//IssuingCardholderAddress.md) + - [IssuingCardholderAuthorizationControls](doc//IssuingCardholderAuthorizationControls.md) + - [IssuingCardholderCompany](doc//IssuingCardholderCompany.md) + - [IssuingCardholderIdDocument](doc//IssuingCardholderIdDocument.md) + - [IssuingCardholderIndividual](doc//IssuingCardholderIndividual.md) + - [IssuingCardholderIndividualDob](doc//IssuingCardholderIndividualDob.md) + - [IssuingCardholderRequirements](doc//IssuingCardholderRequirements.md) + - [IssuingCardholderSpendingLimit](doc//IssuingCardholderSpendingLimit.md) + - [IssuingCardholderVerification](doc//IssuingCardholderVerification.md) + - [IssuingDispute](doc//IssuingDispute.md) + - [IssuingDisputeCanceledEvidence](doc//IssuingDisputeCanceledEvidence.md) + - [IssuingDisputeDuplicateEvidence](doc//IssuingDisputeDuplicateEvidence.md) + - [IssuingDisputeEvidence](doc//IssuingDisputeEvidence.md) + - [IssuingDisputeFraudulentEvidence](doc//IssuingDisputeFraudulentEvidence.md) + - [IssuingDisputeList](doc//IssuingDisputeList.md) + - [IssuingDisputeMerchandiseNotAsDescribedEvidence](doc//IssuingDisputeMerchandiseNotAsDescribedEvidence.md) + - [IssuingDisputeNotReceivedEvidence](doc//IssuingDisputeNotReceivedEvidence.md) + - [IssuingDisputeOtherEvidence](doc//IssuingDisputeOtherEvidence.md) + - [IssuingDisputeServiceNotAsDescribedEvidence](doc//IssuingDisputeServiceNotAsDescribedEvidence.md) + - [IssuingSettlement](doc//IssuingSettlement.md) + - [IssuingTransaction](doc//IssuingTransaction.md) + - [IssuingTransactionAmountDetails](doc//IssuingTransactionAmountDetails.md) + - [IssuingTransactionFlightData](doc//IssuingTransactionFlightData.md) + - [IssuingTransactionFlightDataLeg](doc//IssuingTransactionFlightDataLeg.md) + - [IssuingTransactionFuelData](doc//IssuingTransactionFuelData.md) + - [IssuingTransactionLodgingData](doc//IssuingTransactionLodgingData.md) + - [IssuingTransactionPurchaseDetails](doc//IssuingTransactionPurchaseDetails.md) + - [IssuingTransactionReceiptData](doc//IssuingTransactionReceiptData.md) + - [Item](doc//Item.md) + - [LegalEntityCompany](doc//LegalEntityCompany.md) + - [LegalEntityCompanyVerification](doc//LegalEntityCompanyVerification.md) + - [LegalEntityCompanyVerificationDocument](doc//LegalEntityCompanyVerificationDocument.md) + - [LegalEntityDob](doc//LegalEntityDob.md) + - [LegalEntityJapanAddress](doc//LegalEntityJapanAddress.md) + - [LegalEntityPersonVerification](doc//LegalEntityPersonVerification.md) + - [LegalEntityPersonVerificationDocument](doc//LegalEntityPersonVerificationDocument.md) + - [LineItem](doc//LineItem.md) + - [LineItemsDiscountAmount](doc//LineItemsDiscountAmount.md) + - [LineItemsTaxAmount](doc//LineItemsTaxAmount.md) + - [ListAccountCapability](doc//ListAccountCapability.md) + - [LoginLink](doc//LoginLink.md) + - [Mandate](doc//Mandate.md) + - [MandateAuBecsDebit](doc//MandateAuBecsDebit.md) + - [MandateBacsDebit](doc//MandateBacsDebit.md) + - [MandatePaymentMethodDetails](doc//MandatePaymentMethodDetails.md) + - [MandateSepaDebit](doc//MandateSepaDebit.md) + - [MandateSingleUse](doc//MandateSingleUse.md) + - [ModelFile](doc//ModelFile.md) + - [ModelSource](doc//ModelSource.md) + - [Networks](doc//Networks.md) + - [NotificationEventData](doc//NotificationEventData.md) + - [NotificationEventList](doc//NotificationEventList.md) + - [NotificationEventRequest](doc//NotificationEventRequest.md) + - [OneTimePriceData](doc//OneTimePriceData.md) + - [OnlineAcceptance](doc//OnlineAcceptance.md) + - [Order](doc//Order.md) + - [OrderItem](doc//OrderItem.md) + - [OrderReturn](doc//OrderReturn.md) + - [OrderTimestampSpecs](doc//OrderTimestampSpecs.md) + - [OrdersResourceOrderReturnList](doc//OrdersResourceOrderReturnList.md) + - [PackageDimensions](doc//PackageDimensions.md) + - [PaymentFlowsPaymentIntentList](doc//PaymentFlowsPaymentIntentList.md) + - [PaymentFlowsPaymentIntentResourceChargeList](doc//PaymentFlowsPaymentIntentResourceChargeList.md) + - [PaymentFlowsPaymentMethodList](doc//PaymentFlowsPaymentMethodList.md) + - [PaymentFlowsPrivatePaymentMethodsAlipayDetails](doc//PaymentFlowsPrivatePaymentMethodsAlipayDetails.md) + - [PaymentFlowsSetupIntentList](doc//PaymentFlowsSetupIntentList.md) + - [PaymentFlowsSetupIntentSetupAttemptList](doc//PaymentFlowsSetupIntentSetupAttemptList.md) + - [PaymentIntent](doc//PaymentIntent.md) + - [PaymentIntentNextAction](doc//PaymentIntentNextAction.md) + - [PaymentIntentNextActionAlipayHandleRedirect](doc//PaymentIntentNextActionAlipayHandleRedirect.md) + - [PaymentIntentNextActionDisplayOxxoDetails](doc//PaymentIntentNextActionDisplayOxxoDetails.md) + - [PaymentIntentNextActionRedirectToUrl](doc//PaymentIntentNextActionRedirectToUrl.md) + - [PaymentIntentPaymentMethodOptions](doc//PaymentIntentPaymentMethodOptions.md) + - [PaymentIntentPaymentMethodOptionsCard](doc//PaymentIntentPaymentMethodOptionsCard.md) + - [PaymentIntentPaymentMethodOptionsSepaDebit](doc//PaymentIntentPaymentMethodOptionsSepaDebit.md) + - [PaymentMethod](doc//PaymentMethod.md) + - [PaymentMethodAuBecsDebit](doc//PaymentMethodAuBecsDebit.md) + - [PaymentMethodBacsDebit](doc//PaymentMethodBacsDebit.md) + - [PaymentMethodCard](doc//PaymentMethodCard.md) + - [PaymentMethodCardChecks](doc//PaymentMethodCardChecks.md) + - [PaymentMethodCardGeneratedCard](doc//PaymentMethodCardGeneratedCard.md) + - [PaymentMethodCardWallet](doc//PaymentMethodCardWallet.md) + - [PaymentMethodCardWalletMasterpass](doc//PaymentMethodCardWalletMasterpass.md) + - [PaymentMethodCardWalletVisaCheckout](doc//PaymentMethodCardWalletVisaCheckout.md) + - [PaymentMethodDetails](doc//PaymentMethodDetails.md) + - [PaymentMethodDetailsAchCreditTransfer](doc//PaymentMethodDetailsAchCreditTransfer.md) + - [PaymentMethodDetailsAchDebit](doc//PaymentMethodDetailsAchDebit.md) + - [PaymentMethodDetailsAuBecsDebit](doc//PaymentMethodDetailsAuBecsDebit.md) + - [PaymentMethodDetailsBacsDebit](doc//PaymentMethodDetailsBacsDebit.md) + - [PaymentMethodDetailsBancontact](doc//PaymentMethodDetailsBancontact.md) + - [PaymentMethodDetailsCard](doc//PaymentMethodDetailsCard.md) + - [PaymentMethodDetailsCardChecks](doc//PaymentMethodDetailsCardChecks.md) + - [PaymentMethodDetailsCardInstallments](doc//PaymentMethodDetailsCardInstallments.md) + - [PaymentMethodDetailsCardInstallmentsPlan](doc//PaymentMethodDetailsCardInstallmentsPlan.md) + - [PaymentMethodDetailsCardPresent](doc//PaymentMethodDetailsCardPresent.md) + - [PaymentMethodDetailsCardPresentReceipt](doc//PaymentMethodDetailsCardPresentReceipt.md) + - [PaymentMethodDetailsCardWallet](doc//PaymentMethodDetailsCardWallet.md) + - [PaymentMethodDetailsCardWalletMasterpass](doc//PaymentMethodDetailsCardWalletMasterpass.md) + - [PaymentMethodDetailsCardWalletVisaCheckout](doc//PaymentMethodDetailsCardWalletVisaCheckout.md) + - [PaymentMethodDetailsEps](doc//PaymentMethodDetailsEps.md) + - [PaymentMethodDetailsFpx](doc//PaymentMethodDetailsFpx.md) + - [PaymentMethodDetailsGiropay](doc//PaymentMethodDetailsGiropay.md) + - [PaymentMethodDetailsGrabpay](doc//PaymentMethodDetailsGrabpay.md) + - [PaymentMethodDetailsIdeal](doc//PaymentMethodDetailsIdeal.md) + - [PaymentMethodDetailsInteracPresent](doc//PaymentMethodDetailsInteracPresent.md) + - [PaymentMethodDetailsInteracPresentReceipt](doc//PaymentMethodDetailsInteracPresentReceipt.md) + - [PaymentMethodDetailsMultibanco](doc//PaymentMethodDetailsMultibanco.md) + - [PaymentMethodDetailsOxxo](doc//PaymentMethodDetailsOxxo.md) + - [PaymentMethodDetailsP24](doc//PaymentMethodDetailsP24.md) + - [PaymentMethodDetailsSepaDebit](doc//PaymentMethodDetailsSepaDebit.md) + - [PaymentMethodDetailsSofort](doc//PaymentMethodDetailsSofort.md) + - [PaymentMethodEps](doc//PaymentMethodEps.md) + - [PaymentMethodFpx](doc//PaymentMethodFpx.md) + - [PaymentMethodIdeal](doc//PaymentMethodIdeal.md) + - [PaymentMethodOptionsBancontact](doc//PaymentMethodOptionsBancontact.md) + - [PaymentMethodOptionsCardInstallments](doc//PaymentMethodOptionsCardInstallments.md) + - [PaymentMethodOptionsOxxo](doc//PaymentMethodOptionsOxxo.md) + - [PaymentMethodOptionsSofort](doc//PaymentMethodOptionsSofort.md) + - [PaymentMethodP24](doc//PaymentMethodP24.md) + - [PaymentMethodSepaDebit](doc//PaymentMethodSepaDebit.md) + - [PaymentMethodSofort](doc//PaymentMethodSofort.md) + - [PaymentPagesCheckoutSessionCustomerDetails](doc//PaymentPagesCheckoutSessionCustomerDetails.md) + - [PaymentPagesCheckoutSessionList](doc//PaymentPagesCheckoutSessionList.md) + - [PaymentPagesCheckoutSessionListLineItems](doc//PaymentPagesCheckoutSessionListLineItems.md) + - [PaymentPagesCheckoutSessionListLineItems1](doc//PaymentPagesCheckoutSessionListLineItems1.md) + - [PaymentPagesCheckoutSessionTaxId](doc//PaymentPagesCheckoutSessionTaxId.md) + - [PaymentPagesCheckoutSessionTotalDetails](doc//PaymentPagesCheckoutSessionTotalDetails.md) + - [PaymentPagesCheckoutSessionTotalDetailsResourceBreakdown](doc//PaymentPagesCheckoutSessionTotalDetailsResourceBreakdown.md) + - [PaymentPagesPaymentPageResourcesShippingAddressCollection](doc//PaymentPagesPaymentPageResourcesShippingAddressCollection.md) + - [PaymentSource](doc//PaymentSource.md) + - [Payout](doc//Payout.md) + - [PayoutList](doc//PayoutList.md) + - [Period](doc//Period.md) + - [Period2](doc//Period2.md) + - [Person](doc//Person.md) + - [PersonRelationship](doc//PersonRelationship.md) + - [PersonRequirements](doc//PersonRequirements.md) + - [Plan](doc//Plan.md) + - [PlanList](doc//PlanList.md) + - [PlanTier](doc//PlanTier.md) + - [PlatformTaxFee](doc//PlatformTaxFee.md) + - [PortalBusinessProfile](doc//PortalBusinessProfile.md) + - [PortalCustomerUpdate](doc//PortalCustomerUpdate.md) + - [PortalFeatures](doc//PortalFeatures.md) + - [PortalInvoiceList](doc//PortalInvoiceList.md) + - [PortalPaymentMethodUpdate](doc//PortalPaymentMethodUpdate.md) + - [PortalSubscriptionCancel](doc//PortalSubscriptionCancel.md) + - [PortalSubscriptionUpdate](doc//PortalSubscriptionUpdate.md) + - [PortalSubscriptionUpdateProduct](doc//PortalSubscriptionUpdateProduct.md) + - [Price](doc//Price.md) + - [PriceList](doc//PriceList.md) + - [PriceTier](doc//PriceTier.md) + - [Product](doc//Product.md) + - [PromotionCode](doc//PromotionCode.md) + - [PromotionCodesResourceRestrictions](doc//PromotionCodesResourceRestrictions.md) + - [RadarEarlyFraudWarning](doc//RadarEarlyFraudWarning.md) + - [RadarEarlyFraudWarningList](doc//RadarEarlyFraudWarningList.md) + - [RadarIssuerFraudRecordList](doc//RadarIssuerFraudRecordList.md) + - [RadarListListItemList](doc//RadarListListItemList.md) + - [RadarReviewResourceLocation](doc//RadarReviewResourceLocation.md) + - [RadarReviewResourceSession](doc//RadarReviewResourceSession.md) + - [RadarValueList](doc//RadarValueList.md) + - [RadarValueListItem](doc//RadarValueListItem.md) + - [Recipient](doc//Recipient.md) + - [Recurring](doc//Recurring.md) + - [Refund](doc//Refund.md) + - [RefundList](doc//RefundList.md) + - [RefundList1](doc//RefundList1.md) + - [ReportingReportRun](doc//ReportingReportRun.md) + - [ReportingReportType](doc//ReportingReportType.md) + - [ReserveTransaction](doc//ReserveTransaction.md) + - [Review](doc//Review.md) + - [Rule](doc//Rule.md) + - [ScheduledQueryRun](doc//ScheduledQueryRun.md) + - [SepaDebitGeneratedFrom](doc//SepaDebitGeneratedFrom.md) + - [SetupAttempt](doc//SetupAttempt.md) + - [SetupAttemptPaymentMethodDetails](doc//SetupAttemptPaymentMethodDetails.md) + - [SetupAttemptPaymentMethodDetailsBancontact](doc//SetupAttemptPaymentMethodDetailsBancontact.md) + - [SetupAttemptPaymentMethodDetailsCard](doc//SetupAttemptPaymentMethodDetailsCard.md) + - [SetupAttemptPaymentMethodDetailsCardPresent](doc//SetupAttemptPaymentMethodDetailsCardPresent.md) + - [SetupAttemptPaymentMethodDetailsIdeal](doc//SetupAttemptPaymentMethodDetailsIdeal.md) + - [SetupAttemptPaymentMethodDetailsSofort](doc//SetupAttemptPaymentMethodDetailsSofort.md) + - [SetupIntent](doc//SetupIntent.md) + - [SetupIntentNextAction](doc//SetupIntentNextAction.md) + - [SetupIntentNextActionRedirectToUrl](doc//SetupIntentNextActionRedirectToUrl.md) + - [SetupIntentPaymentMethodOptions](doc//SetupIntentPaymentMethodOptions.md) + - [SetupIntentPaymentMethodOptionsCard](doc//SetupIntentPaymentMethodOptionsCard.md) + - [SetupIntentPaymentMethodOptionsSepaDebit](doc//SetupIntentPaymentMethodOptionsSepaDebit.md) + - [Shipping](doc//Shipping.md) + - [ShippingMethod](doc//ShippingMethod.md) + - [SigmaScheduledQueryRunError](doc//SigmaScheduledQueryRunError.md) + - [Sku](doc//Sku.md) + - [SourceCodeVerificationFlow](doc//SourceCodeVerificationFlow.md) + - [SourceMandateNotification](doc//SourceMandateNotification.md) + - [SourceMandateNotificationAcssDebitData](doc//SourceMandateNotificationAcssDebitData.md) + - [SourceMandateNotificationBacsDebitData](doc//SourceMandateNotificationBacsDebitData.md) + - [SourceMandateNotificationSepaDebitData](doc//SourceMandateNotificationSepaDebitData.md) + - [SourceOrder](doc//SourceOrder.md) + - [SourceOrderItem](doc//SourceOrderItem.md) + - [SourceOwner](doc//SourceOwner.md) + - [SourceReceiverFlow](doc//SourceReceiverFlow.md) + - [SourceRedirectFlow](doc//SourceRedirectFlow.md) + - [SourceTransaction](doc//SourceTransaction.md) + - [SourceTransactionAchCreditTransferData](doc//SourceTransactionAchCreditTransferData.md) + - [SourceTransactionChfCreditTransferData](doc//SourceTransactionChfCreditTransferData.md) + - [SourceTransactionGbpCreditTransferData](doc//SourceTransactionGbpCreditTransferData.md) + - [SourceTransactionPaperCheckData](doc//SourceTransactionPaperCheckData.md) + - [SourceTransactionSepaCreditTransferData](doc//SourceTransactionSepaCreditTransferData.md) + - [SourceTypeAchCreditTransfer](doc//SourceTypeAchCreditTransfer.md) + - [SourceTypeAchDebit](doc//SourceTypeAchDebit.md) + - [SourceTypeAlipay](doc//SourceTypeAlipay.md) + - [SourceTypeAuBecsDebit](doc//SourceTypeAuBecsDebit.md) + - [SourceTypeBancontact](doc//SourceTypeBancontact.md) + - [SourceTypeCard](doc//SourceTypeCard.md) + - [SourceTypeCardPresent](doc//SourceTypeCardPresent.md) + - [SourceTypeEps](doc//SourceTypeEps.md) + - [SourceTypeGiropay](doc//SourceTypeGiropay.md) + - [SourceTypeIdeal](doc//SourceTypeIdeal.md) + - [SourceTypeKlarna](doc//SourceTypeKlarna.md) + - [SourceTypeMultibanco](doc//SourceTypeMultibanco.md) + - [SourceTypeP24](doc//SourceTypeP24.md) + - [SourceTypeSepaDebit](doc//SourceTypeSepaDebit.md) + - [SourceTypeSofort](doc//SourceTypeSofort.md) + - [SourceTypeThreeDSecure](doc//SourceTypeThreeDSecure.md) + - [SourceTypeWechat](doc//SourceTypeWechat.md) + - [StatusTransitions](doc//StatusTransitions.md) + - [Subscription](doc//Subscription.md) + - [SubscriptionBillingThresholds](doc//SubscriptionBillingThresholds.md) + - [SubscriptionItem](doc//SubscriptionItem.md) + - [SubscriptionItemBillingThresholds](doc//SubscriptionItemBillingThresholds.md) + - [SubscriptionItemList](doc//SubscriptionItemList.md) + - [SubscriptionItemUpdateParams](doc//SubscriptionItemUpdateParams.md) + - [SubscriptionList](doc//SubscriptionList.md) + - [SubscriptionList1](doc//SubscriptionList1.md) + - [SubscriptionPendingInvoiceItemInterval](doc//SubscriptionPendingInvoiceItemInterval.md) + - [SubscriptionSchedule](doc//SubscriptionSchedule.md) + - [SubscriptionScheduleAddInvoiceItem](doc//SubscriptionScheduleAddInvoiceItem.md) + - [SubscriptionScheduleConfigurationItem](doc//SubscriptionScheduleConfigurationItem.md) + - [SubscriptionScheduleCurrentPhase](doc//SubscriptionScheduleCurrentPhase.md) + - [SubscriptionSchedulePhaseConfiguration](doc//SubscriptionSchedulePhaseConfiguration.md) + - [SubscriptionSchedulesResourceDefaultSettings](doc//SubscriptionSchedulesResourceDefaultSettings.md) + - [SubscriptionTransferData](doc//SubscriptionTransferData.md) + - [SubscriptionsResourcePauseCollection](doc//SubscriptionsResourcePauseCollection.md) + - [SubscriptionsResourcePendingUpdate](doc//SubscriptionsResourcePendingUpdate.md) + - [TaxDeductedAtSource](doc//TaxDeductedAtSource.md) + - [TaxIDsList](doc//TaxIDsList.md) + - [TaxIDsList1](doc//TaxIDsList1.md) + - [TaxId](doc//TaxId.md) + - [TaxIdVerification](doc//TaxIdVerification.md) + - [TaxRate](doc//TaxRate.md) + - [TerminalConnectionToken](doc//TerminalConnectionToken.md) + - [TerminalLocation](doc//TerminalLocation.md) + - [TerminalLocationLocationList](doc//TerminalLocationLocationList.md) + - [TerminalReader](doc//TerminalReader.md) + - [TerminalReaderRetrieveReader](doc//TerminalReaderRetrieveReader.md) + - [ThreeDSecure](doc//ThreeDSecure.md) + - [ThreeDSecureDetails](doc//ThreeDSecureDetails.md) + - [ThreeDSecureUsage](doc//ThreeDSecureUsage.md) + - [Token](doc//Token.md) + - [Topup](doc//Topup.md) + - [TopupList](doc//TopupList.md) + - [Transfer](doc//Transfer.md) + - [TransferData](doc//TransferData.md) + - [TransferList](doc//TransferList.md) + - [TransferReversal](doc//TransferReversal.md) + - [TransferReversalList](doc//TransferReversalList.md) + - [TransferReversalList1](doc//TransferReversalList1.md) + - [TransferSchedule](doc//TransferSchedule.md) + - [TransformQuantity](doc//TransformQuantity.md) + - [TransformUsage](doc//TransformUsage.md) + - [UsageRecord](doc//UsageRecord.md) + - [UsageRecordSummary](doc//UsageRecordSummary.md) + - [WebhookEndpoint](doc//WebhookEndpoint.md) + + +## Documentation For Authorization + + +## basicAuth + +- **Type**: HTTP Basic authentication + +## bearerAuth + +- **Type**: HTTP Bearer authentication + + +## Author + +dev-platform@stripe.com + + diff --git a/stripe_platform_interface/lib/models.dart b/stripe_platform_interface/lib/models.dart new file mode 100644 index 000000000..19e4d293e --- /dev/null +++ b/stripe_platform_interface/lib/models.dart @@ -0,0 +1,12 @@ + +export 'src/models/apple_pay.dart'; +export 'src/models/apple_pay_button.dart'; + +export 'src/models/card_field_input.dart'; +export 'src/models/errors.dart'; +export 'src/models/payment_intents.dart'; + +export 'src/models/payment_methods.dart'; +export 'src/models/setup_intent.dart'; +export 'src/models/three_d_secure.dart'; +export 'src/models/payment_sheet.dart'; \ No newline at end of file diff --git a/stripe_platform_interface/lib/src/method_channel_stripe.dart b/stripe_platform_interface/lib/src/method_channel_stripe.dart new file mode 100644 index 000000000..ce710147f --- /dev/null +++ b/stripe_platform_interface/lib/src/method_channel_stripe.dart @@ -0,0 +1,142 @@ +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:flutter/foundation.dart'; +import 'package:stripe_platform_interface/src/models/setup_intent.dart'; +import 'package:stripe_platform_interface/src/models/three_d_secure.dart'; +import 'package:stripe_platform_interface/src/models/payment_methods.dart'; +import 'package:stripe_platform_interface/src/models/payment_intents.dart'; +import 'package:stripe_platform_interface/src/models/apple_pay.dart'; +import 'package:stripe_platform_interface/stripe_platform_interface.dart'; + +const Map appInfo = { + "name": "flutter_stripe", + "partnerId": "flutter_stripe", + "version": "0.0.0", + "url": "https://github.com/fluttercommunity/flutter_stripe/" +}; + +/// An implementation of [StripePlatform] that uses method channels. +class MethodChannelStripe extends StripePlatform { + @visibleForTesting + MethodChannel methodChannel = MethodChannel('flutter.stripe/payments'); + + @visibleForTesting + EventChannel eventChannel = EventChannel('flutter.stripe/events'); + + @override + Future initialise({ + required String publishableKey, + String? stripeAccountId, + ThreeDSecureConfigurationParams? threeDSecureParams, + String? merchantIdentifier, + }) async { + await methodChannel.invokeMethod('initialise', { + 'publishableKey': publishableKey, + 'stripeAccountId': stripeAccountId, + 'merchantIdentifier': merchantIdentifier, + 'appInfo': appInfo + // 'threeDSecureParams': threeDSecureParams, + }); + } + + @override + Future configure3dSecure(ThreeDSecureConfigurationParams params) { + // TODO: implement configure3dSecure + throw UnimplementedError(); + } + + @override + Future confirmApplePayPayment(String clientSecret) { + // TODO: implement confirmApplePayPayment + throw UnimplementedError(); + } + + @override + Future confirmPaymentMethod( + String paymentIntentClientSecret, PaymentMethodParams data, + [Map options = const {}]) { + // TODO: implement confirmPaymentMethod + throw UnimplementedError(); + } + + @override + Future confirmSetupIntent( + String paymentIntentClientSecret, PaymentMethodParams data, + [Map options = const {}]) { + // TODO: implement confirmSetupIntent + throw UnimplementedError(); + } + + @override + Future createPaymentMethod(PaymentMethodParams data, + [Map options = const {}]) { + // TODO: implement createPaymentMethod + throw UnimplementedError(); + } + + @override + Future createTokenForCVCUpdate(String cvc) { + // TODO: implement createTokenForCVCUpdate + throw UnimplementedError(); + } + + @override + Future handleCardAction(String paymentIntentClientSecret) { + // TODO: implement handleCardAction + throw UnimplementedError(); + } + + @override + Future isApplePaySupported() async { + if (!Platform.isIOS) return false; + final bool? isSupported = + await methodChannel.invokeMethod('isApplePaySupported'); + return isSupported ?? false; + } + + @override + Future presentApplePay(ApplePayPresentParams params) async { + if (!Platform.isIOS) + throw UnsupportedError('Apple Pay is only available for iOS devices'); + await methodChannel.invokeMethod('presentApplePay', params.toJson()); + } + + @override + Future retrievePaymentIntent(String clientSecret) { + // TODO: implement retrievePaymentIntent + throw UnimplementedError(); + } + + @override + Future paymentSheetConfirmPayment() async { + final options = + await methodChannel.invokeMethod('paymentSheetConfirmPayment'); + return PaymentIntent.fromJson(Map.from(options)); + } + + @override + Future presentPaymentOptions() async { + final options = await methodChannel.invokeMethod('presentPaymentOptions'); + return options != null + ? PaymentOption.fromJson(Map.from(options)) + : null; + } + + @override + Future presentPaymentSheet(String? clientSecret) async { + final options = await methodChannel + .invokeMethod('presentPaymentSheet', {clientSecret: clientSecret}); + return PaymentIntent.fromJson(Map.from(options)); + } + + @override + Future setupPaymentSheet( + SetupPaymentSheetParams params) async { + final options = + await methodChannel.invokeMethod('setupPaymentSheet', params.toJson()); + return options != null + ? PaymentOption.fromJson(Map.from(options)) + : null; + } +} diff --git a/stripe_platform_interface/lib/src/models/apple_pay.dart b/stripe_platform_interface/lib/src/models/apple_pay.dart new file mode 100644 index 000000000..ccc727a90 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/apple_pay.dart @@ -0,0 +1,74 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'apple_pay.g.dart'; + +enum ApplePayShippingMethodType { + ready, //final has been replaced with pending as final is a reserved word in dart + pending +} + +enum ApplePayContactFieldsType { + emailAddress, + name, + phoneNumber, + phoneticName, + postalAddress +} + +@JsonSerializable(explicitToJson: true) +class ApplePayShippingMethod { + ApplePayShippingMethod({ + required this.label, + required this.amount, + required this.identifier, + this.type, + this.detail, + }); + final String label; + final String amount; + final ApplePayShippingMethodType? type; + final String identifier; + final String? detail; + + + factory ApplePayShippingMethod.fromJson(Map json) => + _$ApplePayShippingMethodFromJson(json); + Map toJson() => _$ApplePayShippingMethodToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class ApplePayCartSummaryItem { + ApplePayCartSummaryItem({ + required this.label, + required this.amount, + }); + final String label; + final String amount; + + + factory ApplePayCartSummaryItem.fromJson(Map json) => + _$ApplePayCartSummaryItemFromJson(json); + Map toJson() => _$ApplePayCartSummaryItemToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class ApplePayPresentParams { + ApplePayPresentParams({ + required this.cartItems, + required this.country, + required this.currency, + this.requiredBillingContactFields, + this.requiredShippingAddressFields, + this.shippingMethods, + }); + final List cartItems; + final String country; + final String currency; + final List? requiredShippingAddressFields; + final List? requiredBillingContactFields; + final List? shippingMethods; + + factory ApplePayPresentParams.fromJson(Map json) => + _$ApplePayPresentParamsFromJson(json); + Map toJson() => _$ApplePayPresentParamsToJson(this); +} diff --git a/stripe_platform_interface/lib/src/models/apple_pay.g.dart b/stripe_platform_interface/lib/src/models/apple_pay.g.dart new file mode 100644 index 000000000..4aea29f06 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/apple_pay.g.dart @@ -0,0 +1,132 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'apple_pay.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ApplePayShippingMethod _$ApplePayShippingMethodFromJson( + Map json) { + return ApplePayShippingMethod( + label: json['label'] as String, + amount: json['amount'] as String, + identifier: json['identifier'] as String, + type: + _$enumDecodeNullable(_$ApplePayShippingMethodTypeEnumMap, json['type']), + detail: json['detail'] as String?, + ); +} + +Map _$ApplePayShippingMethodToJson( + ApplePayShippingMethod instance) => + { + 'label': instance.label, + 'amount': instance.amount, + 'type': _$ApplePayShippingMethodTypeEnumMap[instance.type], + 'identifier': instance.identifier, + 'detail': instance.detail, + }; + +K _$enumDecode( + Map enumValues, + Object? source, { + K? unknownValue, +}) { + if (source == null) { + throw ArgumentError( + 'A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}', + ); + } + + return enumValues.entries.singleWhere( + (e) => e.value == source, + orElse: () { + if (unknownValue == null) { + throw ArgumentError( + '`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}', + ); + } + return MapEntry(unknownValue, enumValues.values.first); + }, + ).key; +} + +K? _$enumDecodeNullable( + Map enumValues, + dynamic source, { + K? unknownValue, +}) { + if (source == null) { + return null; + } + return _$enumDecode(enumValues, source, unknownValue: unknownValue); +} + +const _$ApplePayShippingMethodTypeEnumMap = { + ApplePayShippingMethodType.ready: 'ready', + ApplePayShippingMethodType.pending: 'pending', +}; + +ApplePayCartSummaryItem _$ApplePayCartSummaryItemFromJson( + Map json) { + return ApplePayCartSummaryItem( + label: json['label'] as String, + amount: json['amount'] as String, + ); +} + +Map _$ApplePayCartSummaryItemToJson( + ApplePayCartSummaryItem instance) => + { + 'label': instance.label, + 'amount': instance.amount, + }; + +ApplePayPresentParams _$ApplePayPresentParamsFromJson( + Map json) { + return ApplePayPresentParams( + cartItems: (json['cartItems'] as List) + .map((e) => ApplePayCartSummaryItem.fromJson(e as Map)) + .toList(), + country: json['country'] as String, + currency: json['currency'] as String, + requiredBillingContactFields: + (json['requiredBillingContactFields'] as List?) + ?.map((e) => _$enumDecode(_$ApplePayContactFieldsTypeEnumMap, e)) + .toList(), + requiredShippingAddressFields: + (json['requiredShippingAddressFields'] as List?) + ?.map((e) => _$enumDecode(_$ApplePayContactFieldsTypeEnumMap, e)) + .toList(), + shippingMethods: (json['shippingMethods'] as List?) + ?.map((e) => ApplePayShippingMethod.fromJson(e as Map)) + .toList(), + ); +} + +Map _$ApplePayPresentParamsToJson( + ApplePayPresentParams instance) => + { + 'cartItems': instance.cartItems.map((e) => e.toJson()).toList(), + 'country': instance.country, + 'currency': instance.currency, + 'requiredShippingAddressFields': instance.requiredShippingAddressFields + ?.map((e) => _$ApplePayContactFieldsTypeEnumMap[e]) + .toList(), + 'requiredBillingContactFields': instance.requiredBillingContactFields + ?.map((e) => _$ApplePayContactFieldsTypeEnumMap[e]) + .toList(), + 'shippingMethods': + instance.shippingMethods?.map((e) => e.toJson()).toList(), + }; + +const _$ApplePayContactFieldsTypeEnumMap = { + ApplePayContactFieldsType.emailAddress: 'emailAddress', + ApplePayContactFieldsType.name: 'name', + ApplePayContactFieldsType.phoneNumber: 'phoneNumber', + ApplePayContactFieldsType.phoneticName: 'phoneticName', + ApplePayContactFieldsType.postalAddress: 'postalAddress', +}; diff --git a/stripe_platform_interface/lib/src/models/apple_pay_button.dart b/stripe_platform_interface/lib/src/models/apple_pay_button.dart new file mode 100644 index 000000000..18b1aeee9 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/apple_pay_button.dart @@ -0,0 +1,25 @@ +enum ApplePayButtonType { + plain, + buy, + setUp, + inStore, + donate, + checkout, + book, + subscribe, + reload, + addMoney, + topUp, + order, + rent, + support, + contribute, + tip +} + +enum ApplePayButtonStyle { + white, + whiteOutline, + black, + automatic, +} diff --git a/stripe_platform_interface/lib/src/models/card_field_input.dart b/stripe_platform_interface/lib/src/models/card_field_input.dart new file mode 100644 index 000000000..85d710ca7 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/card_field_input.dart @@ -0,0 +1,107 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/painting.dart'; +import 'package:json_annotation/json_annotation.dart'; +part 'card_field_input.g.dart'; + +@JsonSerializable() +class CardDecoration extends Equatable { + + CardDecoration( { + this.backgroundColor, + this.textColor, + this.borderColor, + this.borderWidth, + this.textErrorColor, + this.borderRadius, + }); + + @JsonKey(toJson: ColorKey.toJson, fromJson: ColorKey.fromJson) + final Color? backgroundColor; + + @JsonKey(toJson: ColorKey.toJson, fromJson: ColorKey.fromJson) + final Color? textColor; + + @JsonKey(toJson: ColorKey.toJson, fromJson: ColorKey.fromJson) + final Color? borderColor; + + final double? borderWidth; + final double? borderRadius; + + @JsonKey(toJson: ColorKey.toJson, fromJson: ColorKey.fromJson) + final Color? textErrorColor; + + @override + List get props => [backgroundColor, textColor,borderColor, textErrorColor, borderWidth ]; + + factory CardDecoration.fromJson(Map json) => + _$CardDecorationFromJson(json); + Map toJson() => _$CardDecorationToJson(this); + +} + +class ColorKey { + const ColorKey(); + + static int? toJson(Color? value) { + return value?.value; + } + + static Color? fromJson(value) { + if (value is int) { + return Color(value); + } + return null; + } +} + +@JsonSerializable() +class CardFieldInputDetails { + CardFieldInputDetails({ + required this.last4, + required this.expiryMonth, + required this.expiryYear, + this.postalCode, + required this.brand, + required this.complete, + }); + + final String last4; + final int expiryMonth; + final int expiryYear; + final String? postalCode; + final CardBrand brand; + final bool complete; + + factory CardFieldInputDetails.fromJson(Map json) => + _$CardFieldInputDetailsFromJson(json); + Map toJson() => _$CardFieldInputDetailsToJson(this); +} + +@JsonSerializable() +class CardFieldFocusName { + final CardFieldName? focusedField; + + CardFieldFocusName(this.focusedField); + + factory CardFieldFocusName.fromJson(Map json) => + _$CardFieldFocusNameFromJson(json); + Map toJson() => _$CardFieldFocusNameToJson(this); +} + +enum CardFieldName { + cardNumber, + cvc, + expiryDate, + postalCode, +} + +enum CardBrand { + american, + dinersClub, + discover, + jCB, + masterCard, + unionPay, + visa, + unknown +} diff --git a/stripe_platform_interface/lib/src/models/card_field_input.g.dart b/stripe_platform_interface/lib/src/models/card_field_input.g.dart new file mode 100644 index 000000000..635f52af6 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/card_field_input.g.dart @@ -0,0 +1,117 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'card_field_input.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +CardDecoration _$CardDecorationFromJson(Map json) { + return CardDecoration( + backgroundColor: ColorKey.fromJson(json['backgroundColor']), + textColor: ColorKey.fromJson(json['textColor']), + borderColor: ColorKey.fromJson(json['borderColor']), + borderWidth: (json['borderWidth'] as num?)?.toDouble(), + textErrorColor: ColorKey.fromJson(json['textErrorColor']), + borderRadius: (json['borderRadius'] as num?)?.toDouble(), + ); +} + +Map _$CardDecorationToJson(CardDecoration instance) => + { + 'backgroundColor': ColorKey.toJson(instance.backgroundColor), + 'textColor': ColorKey.toJson(instance.textColor), + 'borderColor': ColorKey.toJson(instance.borderColor), + 'borderWidth': instance.borderWidth, + 'borderRadius': instance.borderRadius, + 'textErrorColor': ColorKey.toJson(instance.textErrorColor), + }; + +CardFieldInputDetails _$CardFieldInputDetailsFromJson( + Map json) { + return CardFieldInputDetails( + last4: json['last4'] as String, + expiryMonth: json['expiryMonth'] as int, + expiryYear: json['expiryYear'] as int, + postalCode: json['postalCode'] as String?, + brand: _$enumDecode(_$CardBrandEnumMap, json['brand']), + complete: json['complete'] as bool, + ); +} + +Map _$CardFieldInputDetailsToJson( + CardFieldInputDetails instance) => + { + 'last4': instance.last4, + 'expiryMonth': instance.expiryMonth, + 'expiryYear': instance.expiryYear, + 'postalCode': instance.postalCode, + 'brand': _$CardBrandEnumMap[instance.brand], + 'complete': instance.complete, + }; + +K _$enumDecode( + Map enumValues, + Object? source, { + K? unknownValue, +}) { + if (source == null) { + throw ArgumentError( + 'A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}', + ); + } + + return enumValues.entries.singleWhere( + (e) => e.value == source, + orElse: () { + if (unknownValue == null) { + throw ArgumentError( + '`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}', + ); + } + return MapEntry(unknownValue, enumValues.values.first); + }, + ).key; +} + +const _$CardBrandEnumMap = { + CardBrand.american: 'american', + CardBrand.dinersClub: 'dinersClub', + CardBrand.discover: 'discover', + CardBrand.jCB: 'jCB', + CardBrand.masterCard: 'masterCard', + CardBrand.unionPay: 'unionPay', + CardBrand.visa: 'visa', + CardBrand.unknown: 'unknown', +}; + +CardFieldFocusName _$CardFieldFocusNameFromJson(Map json) { + return CardFieldFocusName( + _$enumDecodeNullable(_$CardFieldNameEnumMap, json['focusedField']), + ); +} + +Map _$CardFieldFocusNameToJson(CardFieldFocusName instance) => + { + 'focusedField': _$CardFieldNameEnumMap[instance.focusedField], + }; + +K? _$enumDecodeNullable( + Map enumValues, + dynamic source, { + K? unknownValue, +}) { + if (source == null) { + return null; + } + return _$enumDecode(enumValues, source, unknownValue: unknownValue); +} + +const _$CardFieldNameEnumMap = { + CardFieldName.cardNumber: 'cardNumber', + CardFieldName.cvc: 'cvc', + CardFieldName.expiryDate: 'expiryDate', + CardFieldName.postalCode: 'postalCode', +}; diff --git a/stripe_platform_interface/lib/src/models/errors.dart b/stripe_platform_interface/lib/src/models/errors.dart new file mode 100644 index 000000000..3df64cd37 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/errors.dart @@ -0,0 +1,17 @@ +enum ConfirmPaymentError { canceled, failed, unkown } + +enum CardActionError { canceled, failed, unkown } + +enum ConfirmSetupIntentError { canceled, failed, unkown } + +enum CreatePaymentMethodError { failed } +enum RetrievePaymentIntentError { canceled } + +enum ApplePayError { canceled, failed, unkown } + +class StripeError { + final String message; + final T code; + + StripeError(this.code, this.message); +} diff --git a/stripe_platform_interface/lib/src/models/payment_intents.dart b/stripe_platform_interface/lib/src/models/payment_intents.dart new file mode 100644 index 000000000..2d7635ee0 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/payment_intents.dart @@ -0,0 +1,115 @@ +import 'package:stripe_platform_interface/src/models/payment_methods.dart'; + +import 'errors.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'payment_intents.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PaymentIntent { + PaymentIntent({ + required this.id, + required this.amount, + required this.created, + required this.currency, + required this.status, + this.description, + this.receiptEmail, + this.canceledAt, + required this.clientSecret, + required this.livemode, + required this.paymentMethodId, + required this.captureMethod, + required this.confirmationMethod, + this.lastPaymentError, + this.shipping, + }); + final String id; + final num amount; + final int created; + final String currency; + final PaymentIntentsStatus status; + final String? description; + final String? receiptEmail; + final String? canceledAt; + final String clientSecret; + final bool livemode; + final String paymentMethodId; + final CaptureMethod captureMethod; + final ConfirmationMethod confirmationMethod; + final LastPaymentError? lastPaymentError; + final ShippingDetails? shipping; + + factory PaymentIntent.fromJson(Map json) => + _$PaymentIntentFromJson(json); + Map toJson() => _$PaymentIntentToJson(this); +} + +enum CaptureMethod { Manual, Automatic } + +enum ConfirmationMethod { Manual, Automatic } + +@JsonSerializable(explicitToJson: true) +class LastPaymentError extends StripeError { + LastPaymentError({ + required String code, + required this.type, + required this.paymentMethod, + required String message, + }) :super(code, message); + final LastPaymentErrorType type; + + final PaymentMethod paymentMethod; + factory LastPaymentError.fromJson(Map json) => + _$LastPaymentErrorFromJson(json); + Map toJson() => _$LastPaymentErrorToJson(this); +} + +enum LastPaymentErrorType { + ApiConnection, + Api, + Authentication, + Card, + Idempotency, + InvalidRequest, + RateLimit, + Unknown +} + +@JsonSerializable(explicitToJson: true) +class ShippingDetails { + ShippingDetails({ + required this.address, + required this.name, + required this.carrier, + required this.phone, + required this.trackingNumber, + }); + Address address; + String name; + String carrier; + String phone; + String trackingNumber; + + + + factory ShippingDetails.fromJson(Map json) => + _$ShippingDetailsFromJson(json); + Map toJson() => _$ShippingDetailsToJson(this); +} + +enum PaymentIntentsFutureUsage { + OffSession, + OnSession, +} + +enum PaymentIntentsStatus { + Succeeded, + RequiresPaymentMethod, + RequiresConfirmation, + Canceled, + Processing, + RequiresAction, + RequiresCapture, + Unknown, +} diff --git a/stripe_platform_interface/lib/src/models/payment_intents.g.dart b/stripe_platform_interface/lib/src/models/payment_intents.g.dart new file mode 100644 index 000000000..e22fc865a --- /dev/null +++ b/stripe_platform_interface/lib/src/models/payment_intents.g.dart @@ -0,0 +1,148 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'payment_intents.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PaymentIntent _$PaymentIntentFromJson(Map json) { + return PaymentIntent( + id: json['id'] as String, + amount: json['amount'] as num, + created: json['created'] as int, + currency: json['currency'] as String, + status: _$enumDecode(_$PaymentIntentsStatusEnumMap, json['status']), + description: json['description'] as String?, + receiptEmail: json['receiptEmail'] as String?, + canceledAt: json['canceledAt'] as String?, + clientSecret: json['clientSecret'] as String, + livemode: json['livemode'] as bool, + paymentMethodId: json['paymentMethodId'] as String, + captureMethod: _$enumDecode(_$CaptureMethodEnumMap, json['captureMethod']), + confirmationMethod: + _$enumDecode(_$ConfirmationMethodEnumMap, json['confirmationMethod']), + lastPaymentError: json['lastPaymentError'] == null + ? null + : LastPaymentError.fromJson( + json['lastPaymentError'] as Map), + shipping: json['shipping'] == null + ? null + : ShippingDetails.fromJson(json['shipping'] as Map), + ); +} + +Map _$PaymentIntentToJson(PaymentIntent instance) => + { + 'id': instance.id, + 'amount': instance.amount, + 'created': instance.created, + 'currency': instance.currency, + 'status': _$PaymentIntentsStatusEnumMap[instance.status], + 'description': instance.description, + 'receiptEmail': instance.receiptEmail, + 'canceledAt': instance.canceledAt, + 'clientSecret': instance.clientSecret, + 'livemode': instance.livemode, + 'paymentMethodId': instance.paymentMethodId, + 'captureMethod': _$CaptureMethodEnumMap[instance.captureMethod], + 'confirmationMethod': + _$ConfirmationMethodEnumMap[instance.confirmationMethod], + 'lastPaymentError': instance.lastPaymentError?.toJson(), + 'shipping': instance.shipping?.toJson(), + }; + +K _$enumDecode( + Map enumValues, + Object? source, { + K? unknownValue, +}) { + if (source == null) { + throw ArgumentError( + 'A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}', + ); + } + + return enumValues.entries.singleWhere( + (e) => e.value == source, + orElse: () { + if (unknownValue == null) { + throw ArgumentError( + '`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}', + ); + } + return MapEntry(unknownValue, enumValues.values.first); + }, + ).key; +} + +const _$PaymentIntentsStatusEnumMap = { + PaymentIntentsStatus.Succeeded: 'Succeeded', + PaymentIntentsStatus.RequiresPaymentMethod: 'RequiresPaymentMethod', + PaymentIntentsStatus.RequiresConfirmation: 'RequiresConfirmation', + PaymentIntentsStatus.Canceled: 'Canceled', + PaymentIntentsStatus.Processing: 'Processing', + PaymentIntentsStatus.RequiresAction: 'RequiresAction', + PaymentIntentsStatus.RequiresCapture: 'RequiresCapture', + PaymentIntentsStatus.Unknown: 'Unknown', +}; + +const _$CaptureMethodEnumMap = { + CaptureMethod.Manual: 'Manual', + CaptureMethod.Automatic: 'Automatic', +}; + +const _$ConfirmationMethodEnumMap = { + ConfirmationMethod.Manual: 'Manual', + ConfirmationMethod.Automatic: 'Automatic', +}; + +LastPaymentError _$LastPaymentErrorFromJson(Map json) { + return LastPaymentError( + code: json['code'] as String, + type: _$enumDecode(_$LastPaymentErrorTypeEnumMap, json['type']), + paymentMethod: + PaymentMethod.fromJson(json['paymentMethod'] as Map), + message: json['message'] as String, + ); +} + +Map _$LastPaymentErrorToJson(LastPaymentError instance) => + { + 'message': instance.message, + 'code': instance.code, + 'type': _$LastPaymentErrorTypeEnumMap[instance.type], + 'paymentMethod': instance.paymentMethod.toJson(), + }; + +const _$LastPaymentErrorTypeEnumMap = { + LastPaymentErrorType.ApiConnection: 'ApiConnection', + LastPaymentErrorType.Api: 'Api', + LastPaymentErrorType.Authentication: 'Authentication', + LastPaymentErrorType.Card: 'Card', + LastPaymentErrorType.Idempotency: 'Idempotency', + LastPaymentErrorType.InvalidRequest: 'InvalidRequest', + LastPaymentErrorType.RateLimit: 'RateLimit', + LastPaymentErrorType.Unknown: 'Unknown', +}; + +ShippingDetails _$ShippingDetailsFromJson(Map json) { + return ShippingDetails( + address: Address.fromJson(json['address'] as Map), + name: json['name'] as String, + carrier: json['carrier'] as String, + phone: json['phone'] as String, + trackingNumber: json['trackingNumber'] as String, + ); +} + +Map _$ShippingDetailsToJson(ShippingDetails instance) => + { + 'address': instance.address.toJson(), + 'name': instance.name, + 'carrier': instance.carrier, + 'phone': instance.phone, + 'trackingNumber': instance.trackingNumber, + }; diff --git a/stripe_platform_interface/lib/src/models/payment_methods.dart b/stripe_platform_interface/lib/src/models/payment_methods.dart new file mode 100644 index 000000000..d7345ba9f --- /dev/null +++ b/stripe_platform_interface/lib/src/models/payment_methods.dart @@ -0,0 +1,242 @@ +import 'package:stripe_platform_interface/src/models/card_field_input.dart'; +import 'package:stripe_platform_interface/src/models/payment_intents.dart'; + +import 'package:json_annotation/json_annotation.dart'; + +part 'payment_methods.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PaymentMethod { + final String id; + final bool liveMode; + final String customerId; + final BillingDetails billingDetails; + final PaymentMethodType type; + final AuBecsDebit auBecsDebit; + final BacsDebit bacsDebit; + final Card card; + final Fpx fpx; + final Ideal ideal; + final SepaDebit sepaDebit; + final Sofort sofort; + final Upi upi; + + PaymentMethod({ + required this.id, + required this.liveMode, + required this.customerId, + required this.billingDetails, + required this.type, + required this.auBecsDebit, + required this.bacsDebit, + required this.card, + required this.fpx, + required this.ideal, + required this.sepaDebit, + required this.sofort, + required this.upi, + }); + + factory PaymentMethod.fromJson(Map json) => + _$PaymentMethodFromJson(json); + Map toJson() => _$PaymentMethodToJson(this); +} + +abstract class PaymentMethodParams { + String get type; + BillingDetails? billingDetails; + PaymentMethodParams(); +} + +@JsonSerializable(explicitToJson: true) +class AliPayParams extends PaymentMethodParams { + final String type = 'Alipay'; + AliPayParams(); + factory AliPayParams.fromJson(Map json) => + _$AliPayParamsFromJson(json); + Map toJson() => _$AliPayParamsToJson(this); +} + +class CardParams extends PaymentMethodParams { + final String type = 'Card'; + + factory CardParams({ + required CardFieldInputDetails details, + PaymentIntentsFutureUsage? setupFutureUsage, + }) => + _DetailedCardParams( + details, + setupFutureUsage, + ); + + factory CardParams.fromMethodId({ + required String paymentMethodId, + String? cvc, + }) => + _PaymentMethodCardParams(paymentMethodId, cvc); + CardParams._(); +} + +@JsonSerializable(explicitToJson: true) +class _DetailedCardParams extends CardParams { + final CardFieldInputDetails details; + final PaymentIntentsFutureUsage? setupFutureUsage; + + _DetailedCardParams(this.details, this.setupFutureUsage) : super._(); + + factory _DetailedCardParams.fromJson(Map json) => + _$_DetailedCardParamsFromJson(json); + Map toJson() => _$_DetailedCardParamsToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class _PaymentMethodCardParams extends CardParams { + final String paymentMethodId; + final String? cvc; + + _PaymentMethodCardParams(this.paymentMethodId, this.cvc) : super._(); + + factory _PaymentMethodCardParams.fromJson(Map json) => + _$_PaymentMethodCardParamsFromJson(json); + Map toJson() => _$_PaymentMethodCardParamsToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class BillingDetails { + final String? email; + final String? phone; + final String? name; + final Address? address; + BillingDetails({this.email, this.phone, this.name, this.address}); + factory BillingDetails.fromJson(Map json) => + _$BillingDetailsFromJson(json); + Map toJson() => _$BillingDetailsToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class Address { + Address({ + required this.city, + required this.county, + required this.line1, + required this.line2, + required this.postalCode, + required this.state, + }); + String city; + String county; + String line1; + String line2; + String postalCode; + String state; + + factory Address.fromJson(Map json) => + _$AddressFromJson(json); + Map toJson() => _$AddressToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class AuBecsDebit { + String? fingerprint; + String? last4; + String? bsbNumber; + AuBecsDebit(); + factory AuBecsDebit.fromJson(Map json) => + _$AuBecsDebitFromJson(json); + Map toJson() => _$AuBecsDebitToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class BacsDebit { + String? sortCode; + String? fingerprint; + String? last4; + BacsDebit(); + factory BacsDebit.fromJson(Map json) => + _$BacsDebitFromJson(json); + Map toJson() => _$BacsDebitToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class Card { + CardBrand? brand; + String? country; + String? expYear; + String? expMonth; + String? fingerprint; + String? funding; + String? last4; + Card(); + factory Card.fromJson(Map json) => _$CardFromJson(json); + Map toJson() => _$CardToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class Fpx { + String? bank; + + Fpx(); + + factory Fpx.fromJson(Map json) => _$FpxFromJson(json); + Map toJson() => _$FpxToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class Ideal { + String? bankIdentifierCode; + String? bank; + Ideal(); + factory Ideal.fromJson(Map json) => _$IdealFromJson(json); + Map toJson() => _$IdealToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class SepaDebit { + String? country; + String? bankCode; + + String? fingerprint; + String? last4; + SepaDebit(); + factory SepaDebit.fromJson(Map json) => + _$SepaDebitFromJson(json); + Map toJson() => _$SepaDebitToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class Sofort { + String? country; + Sofort(); + factory Sofort.fromJson(Map json) => _$SofortFromJson(json); + Map toJson() => _$SofortToJson(this); +} + +@JsonSerializable(explicitToJson: true) +class Upi { + String? vpa; + Upi(); + + factory Upi.fromJson(Map json) => _$UpiFromJson(json); + Map toJson() => _$UpiToJson(this); +} + +enum PaymentMethodType { + AfterpayClearpay, + Card, + Alipay, + Grabpay, + Ideal, + Fpx, + CardPresent, + SepaDebit, + AuBecsDebit, + BacsDebit, + Giropay, + P24, + Eps, + Bancontact, + Oxxo, + Sofort, + Upi, + Unknown +} diff --git a/stripe_platform_interface/lib/src/models/payment_methods.g.dart b/stripe_platform_interface/lib/src/models/payment_methods.g.dart new file mode 100644 index 000000000..ba6d0f628 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/payment_methods.g.dart @@ -0,0 +1,305 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'payment_methods.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PaymentMethod _$PaymentMethodFromJson(Map json) { + return PaymentMethod( + id: json['id'] as String, + liveMode: json['liveMode'] as bool, + customerId: json['customerId'] as String, + billingDetails: + BillingDetails.fromJson(json['billingDetails'] as Map), + type: _$enumDecode(_$PaymentMethodTypeEnumMap, json['type']), + auBecsDebit: + AuBecsDebit.fromJson(json['auBecsDebit'] as Map), + bacsDebit: BacsDebit.fromJson(json['bacsDebit'] as Map), + card: Card.fromJson(json['card'] as Map), + fpx: Fpx.fromJson(json['fpx'] as Map), + ideal: Ideal.fromJson(json['ideal'] as Map), + sepaDebit: SepaDebit.fromJson(json['sepaDebit'] as Map), + sofort: Sofort.fromJson(json['sofort'] as Map), + upi: Upi.fromJson(json['upi'] as Map), + ); +} + +Map _$PaymentMethodToJson(PaymentMethod instance) => + { + 'id': instance.id, + 'liveMode': instance.liveMode, + 'customerId': instance.customerId, + 'billingDetails': instance.billingDetails.toJson(), + 'type': _$PaymentMethodTypeEnumMap[instance.type], + 'auBecsDebit': instance.auBecsDebit.toJson(), + 'bacsDebit': instance.bacsDebit.toJson(), + 'card': instance.card.toJson(), + 'fpx': instance.fpx.toJson(), + 'ideal': instance.ideal.toJson(), + 'sepaDebit': instance.sepaDebit.toJson(), + 'sofort': instance.sofort.toJson(), + 'upi': instance.upi.toJson(), + }; + +K _$enumDecode( + Map enumValues, + Object? source, { + K? unknownValue, +}) { + if (source == null) { + throw ArgumentError( + 'A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}', + ); + } + + return enumValues.entries.singleWhere( + (e) => e.value == source, + orElse: () { + if (unknownValue == null) { + throw ArgumentError( + '`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}', + ); + } + return MapEntry(unknownValue, enumValues.values.first); + }, + ).key; +} + +const _$PaymentMethodTypeEnumMap = { + PaymentMethodType.AfterpayClearpay: 'AfterpayClearpay', + PaymentMethodType.Card: 'Card', + PaymentMethodType.Alipay: 'Alipay', + PaymentMethodType.Grabpay: 'Grabpay', + PaymentMethodType.Ideal: 'Ideal', + PaymentMethodType.Fpx: 'Fpx', + PaymentMethodType.CardPresent: 'CardPresent', + PaymentMethodType.SepaDebit: 'SepaDebit', + PaymentMethodType.AuBecsDebit: 'AuBecsDebit', + PaymentMethodType.BacsDebit: 'BacsDebit', + PaymentMethodType.Giropay: 'Giropay', + PaymentMethodType.P24: 'P24', + PaymentMethodType.Eps: 'Eps', + PaymentMethodType.Bancontact: 'Bancontact', + PaymentMethodType.Oxxo: 'Oxxo', + PaymentMethodType.Sofort: 'Sofort', + PaymentMethodType.Upi: 'Upi', + PaymentMethodType.Unknown: 'Unknown', +}; + +AliPayParams _$AliPayParamsFromJson(Map json) { + return AliPayParams() + ..billingDetails = json['billingDetails'] == null + ? null + : BillingDetails.fromJson( + json['billingDetails'] as Map); +} + +Map _$AliPayParamsToJson(AliPayParams instance) => + { + 'billingDetails': instance.billingDetails?.toJson(), + }; + +_DetailedCardParams _$_DetailedCardParamsFromJson(Map json) { + return _DetailedCardParams( + CardFieldInputDetails.fromJson(json['details'] as Map), + _$enumDecodeNullable( + _$PaymentIntentsFutureUsageEnumMap, json['setupFutureUsage']), + )..billingDetails = json['billingDetails'] == null + ? null + : BillingDetails.fromJson(json['billingDetails'] as Map); +} + +Map _$_DetailedCardParamsToJson( + _DetailedCardParams instance) => + { + 'billingDetails': instance.billingDetails?.toJson(), + 'details': instance.details.toJson(), + 'setupFutureUsage': + _$PaymentIntentsFutureUsageEnumMap[instance.setupFutureUsage], + }; + +K? _$enumDecodeNullable( + Map enumValues, + dynamic source, { + K? unknownValue, +}) { + if (source == null) { + return null; + } + return _$enumDecode(enumValues, source, unknownValue: unknownValue); +} + +const _$PaymentIntentsFutureUsageEnumMap = { + PaymentIntentsFutureUsage.OffSession: 'OffSession', + PaymentIntentsFutureUsage.OnSession: 'OnSession', +}; + +_PaymentMethodCardParams _$_PaymentMethodCardParamsFromJson( + Map json) { + return _PaymentMethodCardParams( + json['paymentMethodId'] as String, + json['cvc'] as String?, + )..billingDetails = json['billingDetails'] == null + ? null + : BillingDetails.fromJson(json['billingDetails'] as Map); +} + +Map _$_PaymentMethodCardParamsToJson( + _PaymentMethodCardParams instance) => + { + 'billingDetails': instance.billingDetails?.toJson(), + 'paymentMethodId': instance.paymentMethodId, + 'cvc': instance.cvc, + }; + +BillingDetails _$BillingDetailsFromJson(Map json) { + return BillingDetails( + email: json['email'] as String?, + phone: json['phone'] as String?, + name: json['name'] as String?, + address: json['address'] == null + ? null + : Address.fromJson(json['address'] as Map), + ); +} + +Map _$BillingDetailsToJson(BillingDetails instance) => + { + 'email': instance.email, + 'phone': instance.phone, + 'name': instance.name, + 'address': instance.address?.toJson(), + }; + +Address _$AddressFromJson(Map json) { + return Address( + city: json['city'] as String, + county: json['county'] as String, + line1: json['line1'] as String, + line2: json['line2'] as String, + postalCode: json['postalCode'] as String, + state: json['state'] as String, + ); +} + +Map _$AddressToJson(Address instance) => { + 'city': instance.city, + 'county': instance.county, + 'line1': instance.line1, + 'line2': instance.line2, + 'postalCode': instance.postalCode, + 'state': instance.state, + }; + +AuBecsDebit _$AuBecsDebitFromJson(Map json) { + return AuBecsDebit() + ..fingerprint = json['fingerprint'] as String? + ..last4 = json['last4'] as String? + ..bsbNumber = json['bsbNumber'] as String?; +} + +Map _$AuBecsDebitToJson(AuBecsDebit instance) => + { + 'fingerprint': instance.fingerprint, + 'last4': instance.last4, + 'bsbNumber': instance.bsbNumber, + }; + +BacsDebit _$BacsDebitFromJson(Map json) { + return BacsDebit() + ..sortCode = json['sortCode'] as String? + ..fingerprint = json['fingerprint'] as String? + ..last4 = json['last4'] as String?; +} + +Map _$BacsDebitToJson(BacsDebit instance) => { + 'sortCode': instance.sortCode, + 'fingerprint': instance.fingerprint, + 'last4': instance.last4, + }; + +Card _$CardFromJson(Map json) { + return Card() + ..brand = _$enumDecodeNullable(_$CardBrandEnumMap, json['brand']) + ..country = json['country'] as String? + ..expYear = json['expYear'] as String? + ..expMonth = json['expMonth'] as String? + ..fingerprint = json['fingerprint'] as String? + ..funding = json['funding'] as String? + ..last4 = json['last4'] as String?; +} + +Map _$CardToJson(Card instance) => { + 'brand': _$CardBrandEnumMap[instance.brand], + 'country': instance.country, + 'expYear': instance.expYear, + 'expMonth': instance.expMonth, + 'fingerprint': instance.fingerprint, + 'funding': instance.funding, + 'last4': instance.last4, + }; + +const _$CardBrandEnumMap = { + CardBrand.american: 'american', + CardBrand.dinersClub: 'dinersClub', + CardBrand.discover: 'discover', + CardBrand.jCB: 'jCB', + CardBrand.masterCard: 'masterCard', + CardBrand.unionPay: 'unionPay', + CardBrand.visa: 'visa', + CardBrand.unknown: 'unknown', +}; + +Fpx _$FpxFromJson(Map json) { + return Fpx()..bank = json['bank'] as String?; +} + +Map _$FpxToJson(Fpx instance) => { + 'bank': instance.bank, + }; + +Ideal _$IdealFromJson(Map json) { + return Ideal() + ..bankIdentifierCode = json['bankIdentifierCode'] as String? + ..bank = json['bank'] as String?; +} + +Map _$IdealToJson(Ideal instance) => { + 'bankIdentifierCode': instance.bankIdentifierCode, + 'bank': instance.bank, + }; + +SepaDebit _$SepaDebitFromJson(Map json) { + return SepaDebit() + ..country = json['country'] as String? + ..bankCode = json['bankCode'] as String? + ..fingerprint = json['fingerprint'] as String? + ..last4 = json['last4'] as String?; +} + +Map _$SepaDebitToJson(SepaDebit instance) => { + 'country': instance.country, + 'bankCode': instance.bankCode, + 'fingerprint': instance.fingerprint, + 'last4': instance.last4, + }; + +Sofort _$SofortFromJson(Map json) { + return Sofort()..country = json['country'] as String?; +} + +Map _$SofortToJson(Sofort instance) => { + 'country': instance.country, + }; + +Upi _$UpiFromJson(Map json) { + return Upi()..vpa = json['vpa'] as String?; +} + +Map _$UpiToJson(Upi instance) => { + 'vpa': instance.vpa, + }; diff --git a/stripe_platform_interface/lib/src/models/payment_sheet.dart b/stripe_platform_interface/lib/src/models/payment_sheet.dart new file mode 100644 index 000000000..7772631fe --- /dev/null +++ b/stripe_platform_interface/lib/src/models/payment_sheet.dart @@ -0,0 +1,62 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'payment_sheet.g.dart'; + +@JsonSerializable(explicitToJson: true) +class PaymentSheetApplePayParams { + final bool applePay; + final String? merchantCountryCode; + + PaymentSheetApplePayParams({ + this.applePay = false, + this.merchantCountryCode, + }) : assert( + !applePay || merchantCountryCode != null, + 'merchantCountryCode is required when using apple pay', + ); + + factory PaymentSheetApplePayParams.fromJson(Map json) => + _$PaymentSheetApplePayParamsFromJson(json); + Map toJson() => _$PaymentSheetApplePayParamsToJson(this); +} +@JsonSerializable(explicitToJson: true) +class SetupPaymentSheetParams extends PaymentSheetApplePayParams { + final String customerId; + final String customerEphemeralKeySecret; + final String paymentIntentClientSecret; + final bool? customFlow; + final String? merchantDisplayName; + + final PaymentSheetBrightness? style; + + SetupPaymentSheetParams( { + required this.customerId, + required this.customerEphemeralKeySecret, + required this.paymentIntentClientSecret, + this.customFlow, + this.merchantDisplayName, + bool applePay = false, + String? merchantCountryCode, + this.style, + }); + + factory SetupPaymentSheetParams.fromJson(Map json) => + _$SetupPaymentSheetParamsFromJson(json); + Map toJson() => _$SetupPaymentSheetParamsToJson(this); +} + +enum PaymentSheetBrightness { alwaysLight, alwaysDark, automatic } // This should be sync with the theme + +enum PaymentSheetError { Failed, Canceled } + +@JsonSerializable(explicitToJson: true) +class PaymentOption { + final String label; + final String image; + + PaymentOption(this.label, this.image); + + factory PaymentOption.fromJson(Map json) => + _$PaymentOptionFromJson(json); + Map toJson() => _$PaymentOptionToJson(this); +} diff --git a/stripe_platform_interface/lib/src/models/payment_sheet.g.dart b/stripe_platform_interface/lib/src/models/payment_sheet.g.dart new file mode 100644 index 000000000..fbbbccdc6 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/payment_sheet.g.dart @@ -0,0 +1,105 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'payment_sheet.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +PaymentSheetApplePayParams _$PaymentSheetApplePayParamsFromJson( + Map json) { + return PaymentSheetApplePayParams( + applePay: json['applePay'] as bool, + merchantCountryCode: json['merchantCountryCode'] as String?, + ); +} + +Map _$PaymentSheetApplePayParamsToJson( + PaymentSheetApplePayParams instance) => + { + 'applePay': instance.applePay, + 'merchantCountryCode': instance.merchantCountryCode, + }; + +SetupPaymentSheetParams _$SetupPaymentSheetParamsFromJson( + Map json) { + return SetupPaymentSheetParams( + customerId: json['customerId'] as String, + customerEphemeralKeySecret: json['customerEphemeralKeySecret'] as String, + paymentIntentClientSecret: json['paymentIntentClientSecret'] as String, + customFlow: json['customFlow'] as bool?, + merchantDisplayName: json['merchantDisplayName'] as String?, + applePay: json['applePay'] as bool, + merchantCountryCode: json['merchantCountryCode'] as String?, + style: _$enumDecodeNullable(_$PaymentSheetBrightnessEnumMap, json['style']), + ); +} + +Map _$SetupPaymentSheetParamsToJson( + SetupPaymentSheetParams instance) => + { + 'applePay': instance.applePay, + 'merchantCountryCode': instance.merchantCountryCode, + 'customerId': instance.customerId, + 'customerEphemeralKeySecret': instance.customerEphemeralKeySecret, + 'paymentIntentClientSecret': instance.paymentIntentClientSecret, + 'customFlow': instance.customFlow, + 'merchantDisplayName': instance.merchantDisplayName, + 'style': _$PaymentSheetBrightnessEnumMap[instance.style], + }; + +K _$enumDecode( + Map enumValues, + Object? source, { + K? unknownValue, +}) { + if (source == null) { + throw ArgumentError( + 'A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}', + ); + } + + return enumValues.entries.singleWhere( + (e) => e.value == source, + orElse: () { + if (unknownValue == null) { + throw ArgumentError( + '`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}', + ); + } + return MapEntry(unknownValue, enumValues.values.first); + }, + ).key; +} + +K? _$enumDecodeNullable( + Map enumValues, + dynamic source, { + K? unknownValue, +}) { + if (source == null) { + return null; + } + return _$enumDecode(enumValues, source, unknownValue: unknownValue); +} + +const _$PaymentSheetBrightnessEnumMap = { + PaymentSheetBrightness.alwaysLight: 'alwaysLight', + PaymentSheetBrightness.alwaysDark: 'alwaysDark', + PaymentSheetBrightness.automatic: 'automatic', +}; + +PaymentOption _$PaymentOptionFromJson(Map json) { + return PaymentOption( + json['label'] as String, + json['image'] as String, + ); +} + +Map _$PaymentOptionToJson(PaymentOption instance) => + { + 'label': instance.label, + 'image': instance.image, + }; diff --git a/stripe_platform_interface/lib/src/models/setup_intent.dart b/stripe_platform_interface/lib/src/models/setup_intent.dart new file mode 100644 index 000000000..4f900a933 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/setup_intent.dart @@ -0,0 +1,41 @@ +import 'package:stripe_platform_interface/src/models/errors.dart'; +import 'package:stripe_platform_interface/src/models/payment_methods.dart'; + +class SetupIntent { + String id; + String clientSecret; + StripeError? lastSetupError; + String? created; + bool livemode; + String? paymentMethodId; + SetupStatus status; + List paymentMethodTypes; + FutureUsage usage; + String? description; + + SetupIntent({ + required this.id, + required this.clientSecret, + this.lastSetupError, + this.created, + required this.livemode, + this.paymentMethodId, + required this.status, + required this.paymentMethodTypes, + required this.usage, + this.description, + }); +} + +enum FutureUsage { unknown, none, onSession, offSession, oneTime } + +enum SetupStatus { + Succeeded, + RequiresPaymentMethod, + RequiresConfirmation, + Canceled, + Processing, + RequiresAction, + RequiresCapture, + Unknown, +} diff --git a/stripe_platform_interface/lib/src/models/three_d_secure.dart b/stripe_platform_interface/lib/src/models/three_d_secure.dart new file mode 100644 index 000000000..75e29e190 --- /dev/null +++ b/stripe_platform_interface/lib/src/models/three_d_secure.dart @@ -0,0 +1,86 @@ +class ThreeDSecureConfigurationParams + with ThreeDSecureIosThemeMixin, ThreeDSecureIosThemeMixin { + num? timeout; + ThreeDSecureLabelThemeData? label; + ThreeDSecureNavigationBarThemeData? navigationBar; + ThreeDSecureTextFieldThemeData? textField; + ThreeDSecureSubmitButtonThemeData? submitButton; +} + +class ThreeDSecureNavigationBarStyle { + final int value; + + const ThreeDSecureNavigationBarStyle._(this.value); + + static const ThreeDSecureNavigationBarStyle system = + const ThreeDSecureNavigationBarStyle._(0); + static const ThreeDSecureNavigationBarStyle black = + const ThreeDSecureNavigationBarStyle._(1); + static const ThreeDSecureNavigationBarStyle blackTranslucent = + const ThreeDSecureNavigationBarStyle._(2); +} + +class ThreeDSecureIOsNavigationBarProps { + ThreeDSecureNavigationBarStyle? barStyle; + bool? translucent; + String? barTintColor; +} + +mixin ThreeDSecureIosThemeMixin { + String? backgroundColor; + ThreeDSecureFooterThemeData? footerTheme; +} + +mixin ThreeDSecureAndroidThemeMixin { + String? accentColor; +} + +mixin ThreeDSecureIosNavigationBarThemeMixin { + ThreeDSecureNavigationBarStyle? barStyle; + bool? translucent; + String? barTintColor; +} + +mixin ThreeDSecureAndroidNavigationBarThemeMixin { + String? statusBarColor; + String? backgroundColor; +} + +class ThreeDSecureNavigationBarThemeData + with + ThreeDSecureIosNavigationBarThemeMixin, + ThreeDSecureAndroidNavigationBarThemeMixin { + String? headerText; + String? buttonText; + String? textColor; + double? textFontSize; +} + +class ThreeDSecureFooterThemeData { + String? backgroundColor; + String? chevronColor; + String? headingTextColor; + String? textColor; +} + +class ThreeDSecureLabelThemeData { + String? headingTextColor; + String? textColor; + double? textFontSize; + double? headingFontSize; +} + +class ThreeDSecureTextFieldThemeData { + String? borderColor; + double? borderWidth; + double? cornerRadius; + String? textColor; + double? textFontSize; +} + +class ThreeDSecureSubmitButtonThemeData { + String? backgroundColor; + double? cornerRadius; + String? textColor; + double? textFontSize; +} diff --git a/stripe_platform_interface/lib/stripe_platform_interface.dart b/stripe_platform_interface/lib/stripe_platform_interface.dart new file mode 100644 index 000000000..44d777d21 --- /dev/null +++ b/stripe_platform_interface/lib/stripe_platform_interface.dart @@ -0,0 +1,63 @@ +library stripe_platform_interface; + +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'models.dart'; +import 'src/method_channel_stripe.dart'; +import 'src/models/setup_intent.dart'; + +export 'models.dart'; + +abstract class StripePlatform extends PlatformInterface { + StripePlatform() : super(token: _token); + + static final Object _token = Object(); + + static StripePlatform _instance = MethodChannelStripe(); + + /// The default instance of [StripePlatform] to use. + /// + /// Defaults to [MethodChannelStripe]. + static StripePlatform get instance => _instance; + + /// Platform-specific plugins should set this with their own platform-specific + /// class that extends [StripePlatform] when they register themselves. + static set instance(StripePlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + Future initialise({ + required String publishableKey, + // AppInfo? appInfo, + String? stripeAccountId, + ThreeDSecureConfigurationParams? threeDSecureParams, + String? merchantIdentifier, + }); + + Future createPaymentMethod( + PaymentMethodParams data, [ + Map options = const {}, + ]); + + Future handleCardAction(String paymentIntentClientSecret); + Future confirmPaymentMethod( + String paymentIntentClientSecret, PaymentMethodParams data, + [Map options = const {}]); + Future configure3dSecure(ThreeDSecureConfigurationParams params); + Future isApplePaySupported() async { + return false; + } + + Future presentApplePay(ApplePayPresentParams params); + Future confirmApplePayPayment(String clientSecret); + Future confirmSetupIntent( + String paymentIntentClientSecret, PaymentMethodParams data, + [Map options = const {}]); + Future retrievePaymentIntent(String clientSecret); + Future createTokenForCVCUpdate(String cvc); + + Future setupPaymentSheet(SetupPaymentSheetParams params); + Future presentPaymentSheet(String? clientSecret); + Future paymentSheetConfirmPayment(); + Future presentPaymentOptions(); +} diff --git a/stripe_platform_interface/pubspec.yaml b/stripe_platform_interface/pubspec.yaml new file mode 100644 index 000000000..335be0c81 --- /dev/null +++ b/stripe_platform_interface/pubspec.yaml @@ -0,0 +1,27 @@ +name: stripe_platform_interface +description: A new Flutter project. +version: 0.0.0+1 + +environment: + sdk: ">=2.12.0-0.0.dev <3.0.0" + + +dependencies: + flutter: + sdk: flutter + json_annotation: ^4.0.0 + meta: ^1.3.0-nullsafety + plugin_platform_interface: ^1.1.0-nullsafety + equatable: ^2.0.0 + +dev_dependencies: + flutter_test: + sdk: flutter + pedantic: ^1.10.0-nullsafety + build_runner: ^1.11.5 + json_serializable: ^4.0.1 + + + + +flutter: \ No newline at end of file diff --git a/stripe_platform_interface/stripe_platform_interface.iml b/stripe_platform_interface/stripe_platform_interface.iml new file mode 100644 index 000000000..6048a33bd --- /dev/null +++ b/stripe_platform_interface/stripe_platform_interface.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stripe_platform_interface/test/widget_test.dart b/stripe_platform_interface/test/widget_test.dart new file mode 100644 index 000000000..e6119026f --- /dev/null +++ b/stripe_platform_interface/test/widget_test.dart @@ -0,0 +1,14 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + + +void main() { + +} diff --git a/stripe_web/.gitignore b/stripe_web/.gitignore new file mode 100644 index 000000000..1985397a2 --- /dev/null +++ b/stripe_web/.gitignore @@ -0,0 +1,74 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 diff --git a/stripe_web/.metadata b/stripe_web/.metadata new file mode 100644 index 000000000..0f3c84c50 --- /dev/null +++ b/stripe_web/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: a706cd211240f27be3b61f06d70f958c7a4156fe + channel: dev + +project_type: package diff --git a/stripe_web/CHANGELOG.md b/stripe_web/CHANGELOG.md new file mode 100644 index 000000000..ac071598e --- /dev/null +++ b/stripe_web/CHANGELOG.md @@ -0,0 +1,3 @@ +## [0.0.1] - TODO: Add release date. + +* TODO: Describe initial release. diff --git a/stripe_web/LICENSE b/stripe_web/LICENSE new file mode 100644 index 000000000..ba75c69f7 --- /dev/null +++ b/stripe_web/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/stripe_web/README.md b/stripe_web/README.md new file mode 100644 index 000000000..5c8b6b115 --- /dev/null +++ b/stripe_web/README.md @@ -0,0 +1,14 @@ +# stripe_web + +A new Flutter package project. + +## Getting Started + +This project is a starting point for a Dart +[package](https://flutter.dev/developing-packages/), +a library module containing code that can be shared easily across +multiple Flutter or Dart projects. + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/stripe_web/lib/stripe_web.dart b/stripe_web/lib/stripe_web.dart new file mode 100644 index 000000000..23e9461a0 --- /dev/null +++ b/stripe_web/lib/stripe_web.dart @@ -0,0 +1,27 @@ +library stripe_web; + +// var stripe = Stripe('pk_test_TYooMQauvdEDq54NiTphI7jx'); +//var elements = stripe.elements(); + +/* +
+
+ +
+ + + + + +
*/ + + +/* var elements = stripe.elements(); +var style = { + base: { + color: "#32325d", + } +}; + +var card = elements.create("card", { style: style }); +card.mount("#card-element"); */ \ No newline at end of file diff --git a/stripe_web/pubspec.lock b/stripe_web/pubspec.lock new file mode 100644 index 000000000..f1236ae03 --- /dev/null +++ b/stripe_web/pubspec.lock @@ -0,0 +1,147 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.10" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.19" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" +sdks: + dart: ">=2.12.0-0.0 <3.0.0" + flutter: ">=1.17.0" diff --git a/stripe_web/pubspec.yaml b/stripe_web/pubspec.yaml new file mode 100644 index 000000000..1a1f67295 --- /dev/null +++ b/stripe_web/pubspec.yaml @@ -0,0 +1,20 @@ +name: stripe_web +description: A new Flutter package project. +version: 0.0.1 +author: +homepage: + +environment: + sdk: ">=2.7.0 <3.0.0" + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + diff --git a/stripe_web/test/stripe_web_test.dart b/stripe_web/test/stripe_web_test.dart new file mode 100644 index 000000000..b195c1038 --- /dev/null +++ b/stripe_web/test/stripe_web_test.dart @@ -0,0 +1,9 @@ +import 'package:flutter_test/flutter_test.dart'; + +import 'package:stripe_web/stripe_web.dart'; + +void main() { + test('adds one to input values', () { + + }); +} From a11109d239f30ebf89557cef7ebf307750a52d5e Mon Sep 17 00:00:00 2001 From: Jaime Blasco Date: Tue, 9 Mar 2021 16:12:55 +0100 Subject: [PATCH 2/4] Use react-native StripeSdk class --- stripe_ios/ios/Classes/StripeIosPlugin.h | 28 + stripe_ios/ios/Classes/StripeSdk.m | 71 -- stripe_ios/ios/Classes/StripeSdk.swift | 686 +++++++++--------- .../ios/Classes/SwiftStripeIosPlugin.swift | 235 ++---- 4 files changed, 417 insertions(+), 603 deletions(-) delete mode 100644 stripe_ios/ios/Classes/StripeSdk.m diff --git a/stripe_ios/ios/Classes/StripeIosPlugin.h b/stripe_ios/ios/Classes/StripeIosPlugin.h index a713c02d0..aa22e0eec 100644 --- a/stripe_ios/ios/Classes/StripeIosPlugin.h +++ b/stripe_ios/ios/Classes/StripeIosPlugin.h @@ -1,5 +1,33 @@ #import #import + + +/** + * The type of a block that is capable of sending a response to a bridged + * operation. Use this for returning callback methods to JS. + */ +typedef void (^RCTResponseSenderBlock)(NSArray *response); + +/** + * The type of a block that is capable of sending an error response to a + * bridged operation. Use this for returning error information to JS. + */ +typedef void (^RCTResponseErrorBlock)(NSError *error); + +/** + * Block that bridge modules use to resolve the JS promise waiting for a result. + * Nil results are supported and are converted to JS's undefined value. + */ +typedef void (^RCTPromiseResolveBlock)(id result); + +/** + * Block that bridge modules use to reject the JS promise waiting for a result. + * The error may be nil but it is preferable to pass an NSError object for more + * precise error messages. + */ +typedef void (^RCTPromiseRejectBlock)(NSString *code, NSString *message, NSError *error); + + @interface StripeIosPlugin : NSObject @end diff --git a/stripe_ios/ios/Classes/StripeSdk.m b/stripe_ios/ios/Classes/StripeSdk.m deleted file mode 100644 index d965f0e2c..000000000 --- a/stripe_ios/ios/Classes/StripeSdk.m +++ /dev/null @@ -1,71 +0,0 @@ -//#import -// -//@interface RCT_EXTERN_MODULE(StripeSdk, NSObject) -// -//RCT_EXTERN_METHOD( -// initialise:(NSString *)publishableKey -// appInfo: (NSDictionary *)appInfo -// stripeAccountId: (NSString *)stripeAccountId -// params: (NSDictionary *)params -// merchantIdentifier: (NSString *)merchantIdentifier -// ) -// -//RCT_EXTERN_METHOD( -// isApplePaySupported: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject) -// -//RCT_EXTERN_METHOD( -// presentApplePay:(NSDictionary *)params -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject) -// -//RCT_EXTERN_METHOD( -// createTokenForCVCUpdate:(NSString *)cvc -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject) -// -//RCT_EXTERN_METHOD( -// confirmApplePayPayment:(NSString *)clientSecret -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject -// ) -// -//RCT_EXTERN_METHOD( -// createPaymentMethod:(NSDictionary *)data -// options:(NSDictionary *)options -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject -// ) -// -//RCT_EXTERN_METHOD( -// retrievePaymentIntent:(NSString *)clientSecret -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject -// ) -// -//RCT_EXTERN_METHOD( -// handleCardAction:(NSString *)paymentIntentClientSecret -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject -// ) -// -//RCT_EXTERN_METHOD( -// confirmPaymentMethod:(NSString *)paymentIntentClientSecret -// data:(NSDictionary *)data -// options:(NSDictionary *)options -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject -// ) -//RCT_EXTERN_METHOD(configure3dSecure:(NSDictionary *)params) -// -// -//RCT_EXTERN_METHOD( -// confirmSetupIntent:(NSString *)setupIntentClientSecret -// data:(NSDictionary *)data -// options:(NSDictionary *)options -// resolver: (RCTPromiseResolveBlock)resolve -// rejecter: (RCTPromiseRejectBlock)reject -// ) -// -// -//@end diff --git a/stripe_ios/ios/Classes/StripeSdk.swift b/stripe_ios/ios/Classes/StripeSdk.swift index 99c0386d5..a9e0d7232 100644 --- a/stripe_ios/ios/Classes/StripeSdk.swift +++ b/stripe_ios/ios/Classes/StripeSdk.swift @@ -1,343 +1,343 @@ -//import PassKit -//import Stripe -// -//@objc(StripeSdk) -//class StripeSdk: NSObject, STPApplePayContextDelegate { -// var merchantIdentifier: String? = nil -// -// var applePayCompletionCallback: STPIntentClientSecretCompletionBlock? = nil -// var applePayRequestResolver: RCTPromiseResolveBlock? = nil -// var applePayRequestRejecter: RCTPromiseRejectBlock? = nil -// var applePayCompletionRejecter: RCTPromiseRejectBlock? = nil -// var confirmSetupIntentPromise: RCTResponseSenderBlock? = nil -// var confirmApplePayPaymentResolver: RCTPromiseResolveBlock? = nil -// -// @objc static func requiresMainQueueSetup() -> Bool { -// return false -// } -// -// @objc(initialise:appInfo:stripeAccountId:params:merchantIdentifier:) -// func initialise(publishableKey: String, appInfo: NSDictionary, stripeAccountId: String?, params: NSDictionary?, merchantIdentifier: String?) -> Void { -// if let params = params { -// configure3dSecure(params) -// } -// STPAPIClient.shared.publishableKey = publishableKey -// STPAPIClient.shared.stripeAccount = stripeAccountId -// -// let name = RCTConvert.nsString(appInfo["name"]) ?? "" -// let partnerId = RCTConvert.nsString(appInfo["partnerId"]) ?? "" -// let version = RCTConvert.nsString(appInfo["version"]) ?? "" -// let url = RCTConvert.nsString(appInfo["url"]) ?? "" -// -// STPAPIClient.shared.appInfo = STPAppInfo(name: name, partnerId: partnerId, version: version, url: url) -// self.merchantIdentifier = merchantIdentifier -// } -// -// @objc(createTokenForCVCUpdate:resolver:rejecter:) -// func createTokenForCVCUpdate(cvc: String?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { -// guard let cvc = cvc else { -// reject("Failed", "You must provide CVC", nil) -// return; -// } -// -// STPAPIClient.shared.createToken(forCVCUpdate: cvc) { (token, error) in -// if error != nil || token == nil { -// reject("Failed", error?.localizedDescription, nil) -// } else { -// let tokenId = token?.tokenId -// resolve(tokenId) -// } -// } -// } -// -// @objc(confirmSetupIntent:data:options:resolver:rejecter:) -// func confirmSetupIntent (setupIntentClientSecret: String, data: NSDictionary, -// options: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock) { -// var billing: STPPaymentMethodBillingDetails? = nil -// if let billingDetails = data["billingDetails"] as? NSDictionary { -// billing = Mappers.mapToBillingDetails(billingDetails: billingDetails) -// } -// let cardParams = Mappers.mapCardParams(params: data["cardDetails"] as! NSDictionary) -// -// let paymentMethodParams = STPPaymentMethodParams(card: cardParams, billingDetails: billing, metadata: nil) -// let setupIntentParams = STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret) -// setupIntentParams.paymentMethodParams = paymentMethodParams -// -// let paymentHandler = STPPaymentHandler.shared() -// paymentHandler.confirmSetupIntent(setupIntentParams, with: self) { status, setupIntent, error in -// switch (status) { -// case .failed: -// reject(ConfirmSetupIntentErrorType.Failed.rawValue, error?.localizedDescription ?? "", nil) -// break -// case .canceled: -// reject(ConfirmSetupIntentErrorType.Canceled.rawValue, error?.localizedDescription ?? "", nil) -// break -// case .succeeded: -// let intent = Mappers.mapFromSetupIntent(setupIntent: setupIntent!) -// resolve(intent) -// @unknown default: -// reject(ConfirmSetupIntentErrorType.Unknown.rawValue, error?.localizedDescription ?? "", nil) -// break -// } -// } -// } -// -// func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: STPPaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) { -// self.applePayCompletionCallback = completion -// self.applePayRequestResolver?([NSNull()]) -// } -// -// @objc(confirmApplePayPayment:resolver:rejecter:) -// func confirmApplePayPayment(clientSecret: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { -// self.applePayCompletionRejecter = reject -// self.applePayCompletionCallback?(clientSecret, nil) -// self.confirmApplePayPaymentResolver = resolve -// } -// -// func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPPaymentStatus, error: Error?) { -// switch status { -// case .success: -// applePayCompletionRejecter = nil -// applePayRequestRejecter = nil -// confirmApplePayPaymentResolver?([NSNull()]) -// break -// case .error: -// let message = "Apple pay completion failed" -// applePayCompletionRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) -// applePayRequestRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) -// applePayCompletionRejecter = nil -// applePayRequestRejecter = nil -// break -// case .userCancellation: -// let message = "Apple pay payment has been cancelled" -// applePayCompletionRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) -// applePayRequestRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) -// applePayCompletionRejecter = nil -// applePayRequestRejecter = nil -// break -// @unknown default: -// let message = "Cannot complete payment" -// applePayCompletionRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) -// applePayRequestRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) -// applePayCompletionRejecter = nil -// applePayRequestRejecter = nil -// } -// } -// -// @objc(isApplePaySupported:rejecter:) -// func isApplePaySupported(resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock) { -// let isSupported = StripeAPI.deviceSupportsApplePay() -// resolve([isSupported]) -// } -// -// @objc(presentApplePay:resolver:rejecter:) -// func presentApplePay(params: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock) { -// if (merchantIdentifier == nil) { -// reject(ApplePayErrorType.Failed.rawValue, "You must provide merchantIdentifier", nil) -// return -// } -// -// guard let summaryItems = params["cartItems"] as? NSArray else { -// reject(ApplePayErrorType.Failed.rawValue, "You must provide the items for purchase", nil) -// return -// } -// guard let country = params["country"] as? String else { -// reject(ApplePayErrorType.Failed.rawValue, "You must provide the country", nil) -// return -// } -// guard let currency = params["currency"] as? String else { -// reject(ApplePayErrorType.Failed.rawValue, "You must provide the payment currency", nil) -// return -// } -// -// self.applePayRequestResolver = resolve -// self.applePayRequestRejecter = reject -// -// let merchantIdentifier = self.merchantIdentifier ?? "" -// let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: country, currency: currency) -// -// let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray() -// let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray() -// let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray() -// -// paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map { -// Mappers.mapToPKContactField(field: $0 as! String) -// }) -// -// paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map { -// Mappers.mapToPKContactField(field: $0 as! String) -// }) -// -// paymentRequest.shippingMethods = Mappers.mapToShippingMethods(shippingMethods: shippingMethods) -// -// var paymentSummaryItems: [PKPaymentSummaryItem] = [] -// -// if let items = summaryItems as? [[String : Any]] { -// for item in items { -// let label = item["label"] as? String ?? "" -// let amount = NSDecimalNumber(string: item["amount"] as? String ?? "") -// paymentSummaryItems.append(PKPaymentSummaryItem(label: label, amount: amount)) -// } -// } -// -// paymentRequest.paymentSummaryItems = paymentSummaryItems -// if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) { -// DispatchQueue.main.async { -// applePayContext.presentApplePay(on: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController()) -// } -// } else { -// reject(ApplePayErrorType.Failed.rawValue, "Apple pay request failed", nil) -// } -// } -// -// func configure3dSecure(_ params: NSDictionary) { -// let threeDSCustomizationSettings = STPPaymentHandler.shared().threeDSCustomizationSettings -// let uiCustomization = Mappers.mapUICustomization(params) -// -// threeDSCustomizationSettings.uiCustomization = uiCustomization -// } -// -// @objc(createPaymentMethod:options:resolver:rejecter:) -// func createPaymentMethod( -// data: NSDictionary, -// options: NSDictionary, -// resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock -// ) -> Void { -// var billing: STPPaymentMethodBillingDetails? = nil -// if let billingDetails = data["billingDetails"] as! NSDictionary? { -// billing = Mappers.mapToBillingDetails(billingDetails: billingDetails) -// } -// let paymentMethodParams = Mappers.mapCardParamsToPaymentMethodParams(params: data["cardDetails"] as! NSDictionary, billingDetails: billing) -// STPAPIClient.shared.createPaymentMethod(with: paymentMethodParams) { paymentMethod, error in -// if let createError = error { -// reject(NextPaymentActionErrorType.Failed.rawValue, createError.localizedDescription, nil) -// } -// -// if let paymentMethod = paymentMethod { -// let method = Mappers.mapFromPaymentMethod(paymentMethod) -// resolve(method) -// } -// } -// } -// -// @objc(handleCardAction:resolver:rejecter:) -// func handleCardAction( -// paymentIntentClientSecret: String, -// resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock -// ){ -// let paymentHandler = STPPaymentHandler.shared() -// paymentHandler.handleNextAction(forPayment: paymentIntentClientSecret, with: self, returnURL: nil) { status, paymentIntent, handleActionError in -// switch (status) { -// case .failed: -// reject(NextPaymentActionErrorType.Failed.rawValue, handleActionError?.localizedDescription ?? "", nil) -// break -// case .canceled: -// reject(NextPaymentActionErrorType.Canceled.rawValue, handleActionError?.localizedDescription ?? "", nil) -// break -// case .succeeded: -// if let paymentIntent = paymentIntent { -// resolve(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) -// } -// break -// @unknown default: -// reject(NextPaymentActionErrorType.Unknown.rawValue, "Cannot complete payment", nil) -// break -// } -// } -// } -// -// @objc(confirmPaymentMethod:data:options:resolver:rejecter:) -// func confirmPaymentMethod( -// paymentIntentClientSecret: String, -// data: NSDictionary, -// options: NSDictionary, -// resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock -// ) -> Void { -// let paymentMethodId = data["paymentMethodId"] as? String -// let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret) -// if let setupFutureUsage = data["setupFutureUsage"] as? String { -// paymentIntentParams.setupFutureUsage = Mappers.mapToPaymentIntentFutureUsage(usage: setupFutureUsage) -// } -// -// var billingDetails: STPPaymentMethodBillingDetails? = nil -// if let billing = data["billingDetails"] as? NSDictionary { -// billingDetails = Mappers.mapToBillingDetails(billingDetails: billing) -// } -// -// if let cvc = data["cvc"] as? String { -// let cardOptions = STPConfirmCardOptions() -// cardOptions.cvc = cvc; -// let paymentMethodOptions = STPConfirmPaymentMethodOptions() -// paymentMethodOptions.cardOptions = cardOptions -// paymentIntentParams.paymentMethodOptions = paymentMethodOptions -// } else if paymentMethodId != nil { -// paymentIntentParams.paymentMethodId = paymentMethodId -// } else { -// guard let cardDetails = data["cardDetails"] as? NSDictionary else { -// let message = "To confirm the payment you must provide card details or paymentMethodId" -// reject(ConfirmPaymentErrorType.Failed.rawValue, message, nil) -// return -// } -// let paymentMethodParams = Mappers.mapCardParamsToPaymentMethodParams(params: cardDetails, billingDetails: billingDetails) -// paymentIntentParams.paymentMethodParams = paymentMethodParams -// } -// -// let paymentHandler = STPPaymentHandler.shared() -// paymentHandler.confirmPayment(paymentIntentParams, with: self) { (status, paymentIntent, error) in -// switch (status) { -// case .failed: -// reject(ConfirmPaymentErrorType.Failed.rawValue, error?.localizedDescription ?? "", nil) -// break -// case .canceled: -// reject(ConfirmPaymentErrorType.Canceled.rawValue, error?.localizedDescription ?? "", nil) -// break -// case .succeeded: -// if let paymentIntent = paymentIntent { -// let intent = Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent) -// resolve(intent) -// } -// break -// @unknown default: -// reject(ConfirmPaymentErrorType.Unknown.rawValue, "Cannot complete payment", nil) -// break -// } -// } -// -// } -// -// @objc(retrievePaymentIntent:resolver:rejecter:) -// func retrievePaymentIntent( -// clientSecret: String, -// resolver resolve: @escaping RCTPromiseResolveBlock, -// rejecter reject: @escaping RCTPromiseRejectBlock -// ) -> Void { -// STPAPIClient.shared.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, error) in -// guard error == nil else { -// reject(RetrievePaymentIntentErrorType.Unknown.rawValue, error?.localizedDescription, nil) -// return -// } -// -// if let paymentIntent = paymentIntent { -// resolve(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) -// } else { -// reject(RetrievePaymentIntentErrorType.Unknown.rawValue, "Cannot retrieve PaymentIntent", nil) -// } -// } -// } -// -//} -// -//extension StripeSdk: STPAuthenticationContext { -// func authenticationPresentingViewController() -> UIViewController { -// if let topViewController = UIApplication.shared.delegate?.window??.rootViewController { -// return topViewController -// } -// return UIViewController() -// } -//} +import PassKit +import Stripe + +@objc(StripeSdk) +public class StripeSdk: NSObject, STPApplePayContextDelegate { + var merchantIdentifier: String? = nil + + var applePayCompletionCallback: STPIntentClientSecretCompletionBlock? = nil + var applePayRequestResolver: RCTPromiseResolveBlock? = nil + var applePayRequestRejecter: RCTPromiseRejectBlock? = nil + var applePayCompletionRejecter: RCTPromiseRejectBlock? = nil + var confirmSetupIntentPromise: RCTResponseSenderBlock? = nil + var confirmApplePayPaymentResolver: RCTPromiseResolveBlock? = nil + + @objc static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc(initialise:appInfo:stripeAccountId:params:merchantIdentifier:) + func initialise(publishableKey: String, appInfo: NSDictionary, stripeAccountId: String?, params: NSDictionary?, merchantIdentifier: String?) -> Void { + if let params = params { + configure3dSecure(params) + } + STPAPIClient.shared.publishableKey = publishableKey + STPAPIClient.shared.stripeAccount = stripeAccountId + + let name = appInfo["name"] as? String ?? "" + let partnerId = appInfo["partnerId"] as? String ?? "" + let version = appInfo["version"] as? String ?? "" + let url = appInfo["url"] as? String ?? "" + + STPAPIClient.shared.appInfo = STPAppInfo(name: name, partnerId: partnerId, version: version, url: url) + self.merchantIdentifier = merchantIdentifier + } + + @objc(createTokenForCVCUpdate:resolver:rejecter:) + func createTokenForCVCUpdate(cvc: String?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + guard let cvc = cvc else { + reject("Failed", "You must provide CVC", nil) + return; + } + + STPAPIClient.shared.createToken(forCVCUpdate: cvc) { (token, error) in + if error != nil || token == nil { + reject("Failed", error?.localizedDescription, nil) + } else { + let tokenId = token?.tokenId + resolve(tokenId) + } + } + } + + @objc(confirmSetupIntent:data:options:resolver:rejecter:) + func confirmSetupIntent (setupIntentClientSecret: String, data: NSDictionary, + options: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock) { + var billing: STPPaymentMethodBillingDetails? = nil + if let billingDetails = data["billingDetails"] as? NSDictionary { + billing = Mappers.mapToBillingDetails(billingDetails: billingDetails) + } + let cardParams = Mappers.mapCardParams(params: data["cardDetails"] as! NSDictionary) + + let paymentMethodParams = STPPaymentMethodParams(card: cardParams, billingDetails: billing, metadata: nil) + let setupIntentParams = STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret) + setupIntentParams.paymentMethodParams = paymentMethodParams + + let paymentHandler = STPPaymentHandler.shared() + paymentHandler.confirmSetupIntent(setupIntentParams, with: self) { status, setupIntent, error in + switch (status) { + case .failed: + reject(ConfirmSetupIntentErrorType.Failed.rawValue, error?.localizedDescription ?? "", nil) + break + case .canceled: + reject(ConfirmSetupIntentErrorType.Canceled.rawValue, error?.localizedDescription ?? "", nil) + break + case .succeeded: + let intent = Mappers.mapFromSetupIntent(setupIntent: setupIntent!) + resolve(intent) + @unknown default: + reject(ConfirmSetupIntentErrorType.Unknown.rawValue, error?.localizedDescription ?? "", nil) + break + } + } + } + + public func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: STPPaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) { + self.applePayCompletionCallback = completion + self.applePayRequestResolver?([NSNull()]) + } + + @objc(confirmApplePayPayment:resolver:rejecter:) + func confirmApplePayPayment(clientSecret: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + self.applePayCompletionRejecter = reject + self.applePayCompletionCallback?(clientSecret, nil) + self.confirmApplePayPaymentResolver = resolve + } + + public func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPPaymentStatus, error: Error?) { + switch status { + case .success: + applePayCompletionRejecter = nil + applePayRequestRejecter = nil + confirmApplePayPaymentResolver?([NSNull()]) + break + case .error: + let message = "Apple pay completion failed" + applePayCompletionRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) + applePayRequestRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) + applePayCompletionRejecter = nil + applePayRequestRejecter = nil + break + case .userCancellation: + let message = "Apple pay payment has been cancelled" + applePayCompletionRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) + applePayRequestRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) + applePayCompletionRejecter = nil + applePayRequestRejecter = nil + break + @unknown default: + let message = "Cannot complete payment" + applePayCompletionRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) + applePayRequestRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) + applePayCompletionRejecter = nil + applePayRequestRejecter = nil + } + } + + @objc(isApplePaySupported:rejecter:) + func isApplePaySupported(resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock) { + let isSupported = StripeAPI.deviceSupportsApplePay() + resolve([isSupported]) + } + + @objc(presentApplePay:resolver:rejecter:) + func presentApplePay(params: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock) { + if (merchantIdentifier == nil) { + reject(ApplePayErrorType.Failed.rawValue, "You must provide merchantIdentifier", nil) + return + } + + guard let summaryItems = params["cartItems"] as? NSArray else { + reject(ApplePayErrorType.Failed.rawValue, "You must provide the items for purchase", nil) + return + } + guard let country = params["country"] as? String else { + reject(ApplePayErrorType.Failed.rawValue, "You must provide the country", nil) + return + } + guard let currency = params["currency"] as? String else { + reject(ApplePayErrorType.Failed.rawValue, "You must provide the payment currency", nil) + return + } + + self.applePayRequestResolver = resolve + self.applePayRequestRejecter = reject + + let merchantIdentifier = self.merchantIdentifier ?? "" + let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: country, currency: currency) + + let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray() + let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray() + let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray() + + paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map { + Mappers.mapToPKContactField(field: $0 as! String) + }) + + paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map { + Mappers.mapToPKContactField(field: $0 as! String) + }) + + paymentRequest.shippingMethods = Mappers.mapToShippingMethods(shippingMethods: shippingMethods) + + var paymentSummaryItems: [PKPaymentSummaryItem] = [] + + if let items = summaryItems as? [[String : Any]] { + for item in items { + let label = item["label"] as? String ?? "" + let amount = NSDecimalNumber(string: item["amount"] as? String ?? "") + paymentSummaryItems.append(PKPaymentSummaryItem(label: label, amount: amount)) + } + } + + paymentRequest.paymentSummaryItems = paymentSummaryItems + if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) { + DispatchQueue.main.async { + applePayContext.presentApplePay(on: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController()) + } + } else { + reject(ApplePayErrorType.Failed.rawValue, "Apple pay request failed", nil) + } + } + + func configure3dSecure(_ params: NSDictionary) { + let threeDSCustomizationSettings = STPPaymentHandler.shared().threeDSCustomizationSettings + let uiCustomization = Mappers.mapUICustomization(params) + + threeDSCustomizationSettings.uiCustomization = uiCustomization + } + + @objc(createPaymentMethod:options:resolver:rejecter:) + func createPaymentMethod( + data: NSDictionary, + options: NSDictionary, + resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock + ) -> Void { + var billing: STPPaymentMethodBillingDetails? = nil + if let billingDetails = data["billingDetails"] as! NSDictionary? { + billing = Mappers.mapToBillingDetails(billingDetails: billingDetails) + } + let paymentMethodParams = Mappers.mapCardParamsToPaymentMethodParams(params: data["cardDetails"] as! NSDictionary, billingDetails: billing) + STPAPIClient.shared.createPaymentMethod(with: paymentMethodParams) { paymentMethod, error in + if let createError = error { + reject(NextPaymentActionErrorType.Failed.rawValue, createError.localizedDescription, nil) + } + + if let paymentMethod = paymentMethod { + let method = Mappers.mapFromPaymentMethod(paymentMethod) + resolve(method) + } + } + } + + @objc(handleCardAction:resolver:rejecter:) + func handleCardAction( + paymentIntentClientSecret: String, + resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock + ){ + let paymentHandler = STPPaymentHandler.shared() + paymentHandler.handleNextAction(forPayment: paymentIntentClientSecret, with: self, returnURL: nil) { status, paymentIntent, handleActionError in + switch (status) { + case .failed: + reject(NextPaymentActionErrorType.Failed.rawValue, handleActionError?.localizedDescription ?? "", nil) + break + case .canceled: + reject(NextPaymentActionErrorType.Canceled.rawValue, handleActionError?.localizedDescription ?? "", nil) + break + case .succeeded: + if let paymentIntent = paymentIntent { + resolve(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) + } + break + @unknown default: + reject(NextPaymentActionErrorType.Unknown.rawValue, "Cannot complete payment", nil) + break + } + } + } + + @objc(confirmPaymentMethod:data:options:resolver:rejecter:) + func confirmPaymentMethod( + paymentIntentClientSecret: String, + data: NSDictionary, + options: NSDictionary, + resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock + ) -> Void { + let paymentMethodId = data["paymentMethodId"] as? String + let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret) + if let setupFutureUsage = data["setupFutureUsage"] as? String { + paymentIntentParams.setupFutureUsage = Mappers.mapToPaymentIntentFutureUsage(usage: setupFutureUsage) + } + + var billingDetails: STPPaymentMethodBillingDetails? = nil + if let billing = data["billingDetails"] as? NSDictionary { + billingDetails = Mappers.mapToBillingDetails(billingDetails: billing) + } + + if let cvc = data["cvc"] as? String { + let cardOptions = STPConfirmCardOptions() + cardOptions.cvc = cvc; + let paymentMethodOptions = STPConfirmPaymentMethodOptions() + paymentMethodOptions.cardOptions = cardOptions + paymentIntentParams.paymentMethodOptions = paymentMethodOptions + } else if paymentMethodId != nil { + paymentIntentParams.paymentMethodId = paymentMethodId + } else { + guard let cardDetails = data["cardDetails"] as? NSDictionary else { + let message = "To confirm the payment you must provide card details or paymentMethodId" + reject(ConfirmPaymentErrorType.Failed.rawValue, message, nil) + return + } + let paymentMethodParams = Mappers.mapCardParamsToPaymentMethodParams(params: cardDetails, billingDetails: billingDetails) + paymentIntentParams.paymentMethodParams = paymentMethodParams + } + + let paymentHandler = STPPaymentHandler.shared() + paymentHandler.confirmPayment(paymentIntentParams, with: self) { (status, paymentIntent, error) in + switch (status) { + case .failed: + reject(ConfirmPaymentErrorType.Failed.rawValue, error?.localizedDescription ?? "", nil) + break + case .canceled: + reject(ConfirmPaymentErrorType.Canceled.rawValue, error?.localizedDescription ?? "", nil) + break + case .succeeded: + if let paymentIntent = paymentIntent { + let intent = Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent) + resolve(intent) + } + break + @unknown default: + reject(ConfirmPaymentErrorType.Unknown.rawValue, "Cannot complete payment", nil) + break + } + } + + } + + @objc(retrievePaymentIntent:resolver:rejecter:) + func retrievePaymentIntent( + clientSecret: String, + resolver resolve: @escaping RCTPromiseResolveBlock, + rejecter reject: @escaping RCTPromiseRejectBlock + ) -> Void { + STPAPIClient.shared.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, error) in + guard error == nil else { + reject(RetrievePaymentIntentErrorType.Unknown.rawValue, error?.localizedDescription, nil) + return + } + + if let paymentIntent = paymentIntent { + resolve(Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)) + } else { + reject(RetrievePaymentIntentErrorType.Unknown.rawValue, "Cannot retrieve PaymentIntent", nil) + } + } + } + +} + +extension StripeSdk: STPAuthenticationContext { + public func authenticationPresentingViewController() -> UIViewController { + if let topViewController = UIApplication.shared.delegate?.window??.rootViewController { + return topViewController + } + return UIViewController() + } +} diff --git a/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift b/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift index 3059dc016..1b7642754 100644 --- a/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift +++ b/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift @@ -4,21 +4,12 @@ import Stripe import PassKit -public class SwiftStripeIosPlugin: NSObject, FlutterPlugin { - var merchantIdentifier: String? = nil - - var applePayCompletionCallback: STPIntentClientSecretCompletionBlock? = nil - var applePayRequestResult: FlutterResult? = nil - +public class SwiftStripeIosPlugin: StripeSdk, FlutterPlugin { + private var paymentSheet: PaymentSheet? private var paymentSheetFlowController: PaymentSheet.FlowController? -// var applePayRequestRejecter: RCTPromiseRejectBlock? = nil -// var applePayCompletionRejecter: RCTPromiseRejectBlock? = nil -// var confirmSetupIntentPromise: RCTResponseSenderBlock? = nil -// var confirmApplePayPaymentResolver: RCTPromiseResolveBlock? = nil - + public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: "flutter.stripe/payments", binaryMessenger: registrar.messenger()) let instance = SwiftStripeIosPlugin() registrar.addMethodCallDelegate(instance, channel: channel) @@ -33,59 +24,64 @@ public class SwiftStripeIosPlugin: NSObject, FlutterPlugin { public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "initialise": - handleInitialise(call, result: result) - break; + return initialise(call, result: result) case "configure3dSecure": - handleConfigure3dSecure(call, result: result) - break; + return configure3dSecure(call, result: result) case "isApplePaySupported": - print("checking") - handleIsApplePaySupported(call, result:result) - break; + return isApplePaySupported(call, result:result) case "presentApplePay": - handlePresentApplePay(call, result: result) - break; + return presentApplePay(call, result: result) case "setupPaymentSheet": - setupPaymentSheet(call, result: result) - break; + return setupPaymentSheet(call, result: result) case "presentPaymentOptions": - presentPaymentOptions(call, result: result) - break; + return presentPaymentOptions(call, result: result) case "paymentSheetConfirmPayment": - paymentSheetConfirmPayment(call, result: result) - break; + return paymentSheetConfirmPayment(call, result: result) case "presentPaymentSheet": - presentPaymentSheet(call, result: result) - break; + return presentPaymentSheet(call, result: result) default: result(FlutterMethodNotImplemented) } } + + + public func resolver(forResult result: @escaping FlutterResult) -> RCTPromiseResolveBlock { + return { (response) in + if let list = response as? [Any], + let data = list.first { + result(data) + } else { + result(response) + } + } + } + + public func rejecter(forResult result: @escaping FlutterResult) -> RCTPromiseRejectBlock { + return { (code, message, error) in + result(FlutterError.init(code: code ?? "Failed", message: message, details: error)) + } + } } + +// Mark: MethodChannel handlers extension SwiftStripeIosPlugin { - public func handleInitialise(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + public func initialise(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let arguments = call.arguments as? Dictionary, let publishableKey = arguments["publishableKey"] as? String else { result("Not a valid fields") return } - let stripeAccountId : String? = arguments["stripeAccountId"] as? String - let params : NSDictionary? = arguments["params"] as? NSDictionary - let merchantIdentifier: String? = arguments["merchantIdentifier"] as? String - StripeAPI.defaultPublishableKey = publishableKey - initialise( - publishableKey: publishableKey, - appInfo: nil, - stripeAccountId: stripeAccountId, - params: params, - merchantIdentifier: merchantIdentifier - ) + let stripeAccountId = arguments["stripeAccountId"] as? String + let appInfo = arguments["appInfo"] as? NSDictionary + let params = arguments["params"] as? NSDictionary + let merchantIdentifier = arguments["merchantIdentifier"] as? String + initialise(publishableKey: publishableKey, appInfo: appInfo ?? [:], stripeAccountId: stripeAccountId, params: params, merchantIdentifier: merchantIdentifier) result(nil) } - public func handleConfigure3dSecure(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + public func configure3dSecure(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let arguments = call.arguments as? Dictionary, let params = arguments["params"] as? NSDictionary else { result("Not a valid fields") @@ -95,77 +91,22 @@ extension SwiftStripeIosPlugin { result(nil) } - public func handleIsApplePaySupported(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - let isSupported = isApplePaySupported() - print(isSupported) - result(isSupported) + public func isApplePaySupported(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + isApplePaySupported(resolver: resolver(forResult: result), rejecter: rejecter(forResult: result)) } - public func handlePresentApplePay(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - guard let params = call.arguments as? Dictionary else { + + + public func presentApplePay(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let params = call.arguments as? NSDictionary else { result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "Invalid parametes", details: nil)) return } - if (merchantIdentifier == nil) { - result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide merchantIdentifier", details: nil)) - return - } - - guard let summaryItems = params["cartItems"] as? NSArray else { - result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide the items for purchase", details: nil)) - return - } - guard let country = params["country"] as? String else { - result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide the country", details: nil)) - return - } - guard let currency = params["currency"] as? String else { - result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "You must provide the payment currency", details: nil)) - return - } - - self.applePayRequestResult = result - - let merchantIdentifier = self.merchantIdentifier ?? "" - let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: country, currency: currency) - - let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray() - let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray() - let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray() - - paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map { - Mappers.mapToPKContactField(field: $0 as! String) - }) - - paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map { - Mappers.mapToPKContactField(field: $0 as! String) - }) - - paymentRequest.shippingMethods = Mappers.mapToShippingMethods(shippingMethods: shippingMethods) - - var paymentSummaryItems: [PKPaymentSummaryItem] = [] - - if let items = summaryItems as? [[String : Any]] { - for item in items { - let label = item["label"] as? String ?? "" - let amount = NSDecimalNumber(string: item["amount"] as? String ?? "") - paymentSummaryItems.append(PKPaymentSummaryItem(label: label, amount: amount)) - } - } - - paymentRequest.paymentSummaryItems = paymentSummaryItems - if let applePayContext = STPApplePayContext(paymentRequest: paymentRequest, delegate: self) { - DispatchQueue.main.async { - applePayContext.presentApplePay(on: UIApplication.shared.keyWindow?.rootViewController ?? UIViewController()) - } - } else { - result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "Apple pay request failed", details: nil)) - return - } + presentApplePay(params: params, resolver: resolver(forResult: result), rejecter: rejecter(forResult: result)) } - + // This should be using StripeSdk.swift when the PaymentSheet PR is merged func setupPaymentSheet(_ call: FlutterMethodCall, result: @escaping FlutterResult) -> Void { guard let params = call.arguments as? Dictionary else { result(FlutterError.init(code: PaymentSheetErrorType.Failed.rawValue, message: "Invalid parametes", details: nil)) @@ -283,87 +224,3 @@ extension SwiftStripeIosPlugin { } -extension SwiftStripeIosPlugin { - - func initialise(publishableKey: String, appInfo: NSDictionary?, stripeAccountId: String?, params: NSDictionary?, merchantIdentifier: String?) -> Void { - if let params = params { - configure3dSecure(params) - } - STPAPIClient.shared.publishableKey = publishableKey - STPAPIClient.shared.stripeAccount = stripeAccountId - - let name = appInfo?["name"] as? String ?? "" - let partnerId = appInfo?["partnerId"] as? String ?? "" - let version = appInfo?["version"] as? String ?? "" - let url = appInfo?["url"] as? String ?? "" - - STPAPIClient.shared.appInfo = STPAppInfo(name: name, partnerId: partnerId, version: version, url: url) - self.merchantIdentifier = merchantIdentifier - } - - func configure3dSecure(_ params: NSDictionary) { - let threeDSCustomizationSettings = STPPaymentHandler.shared().threeDSCustomizationSettings - let uiCustomization = Mappers.mapUICustomization(params) - - threeDSCustomizationSettings.uiCustomization = uiCustomization - } - - func isApplePaySupported() -> Bool { - return StripeAPI.deviceSupportsApplePay() - } - -} - -extension SwiftStripeIosPlugin: STPApplePayContextDelegate { - - public func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: STPPaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) { - self.applePayCompletionCallback = completion - self.applePayRequestResult?(nil) - - } - - - public func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPPaymentStatus, error: Error?) { - switch status { - case .success: -// applePayCompletionRejecter = nil - applePayRequestResult = nil -// confirmApplePayPaymentResolver?([NSNull()]) - break - case .error: - let message = "Apple pay completion failed" -// applePayCompletionRejecter?(ApplePayErrorType.Failed.rawValue, message, nil) - applePayRequestResult?(FlutterError(code: ApplePayErrorType.Failed.rawValue, message: message, details: nil)) - applePayRequestResult = nil -// applePayCompletionRejecter = nil - - break - case .userCancellation: - let message = "Apple pay payment has been cancelled" -// applePayCompletionRejecter?(ApplePayErrorType.Canceled.rawValue, message, nil) - applePayRequestResult?(FlutterError(code: ApplePayErrorType.Canceled.rawValue, message: message, details: nil)) - applePayRequestResult = nil -// applePayCompletionRejecter = nil - - break - @unknown default: - let message = "Cannot complete payment" -// applePayCompletionRejecter?(ApplePayErrorType.Unknown.rawValue, message, nil) - applePayRequestResult?(FlutterError(code: ApplePayErrorType.Unknown.rawValue, message: message, details: nil)) - applePayRequestResult = nil -// applePayCompletionRejecter = nil - } - } -} - - -extension SwiftStripeIosPlugin: STPAuthenticationContext { - public func authenticationPresentingViewController() -> UIViewController { - if let topViewController = UIApplication.shared.keyWindow?.rootViewController { - return topViewController - } - return UIViewController() - } - - -} From 95355ccb8ed385622d5482cc0f69baac951c6e8c Mon Sep 17 00:00:00 2001 From: Jaime Blasco Date: Tue, 9 Mar 2021 16:56:19 +0100 Subject: [PATCH 3/4] Rename SwiftStripeIosPlugin to StripePlugin --- stripe_ios/ios/Classes/StripeIosPlugin.m | 2 +- ...ripeIosPlugin.swift => StripePlugin.swift} | 144 ++++++++++++++++-- 2 files changed, 130 insertions(+), 16 deletions(-) rename stripe_ios/ios/Classes/{SwiftStripeIosPlugin.swift => StripePlugin.swift} (66%) diff --git a/stripe_ios/ios/Classes/StripeIosPlugin.m b/stripe_ios/ios/Classes/StripeIosPlugin.m index 26b425169..525bc8c0a 100644 --- a/stripe_ios/ios/Classes/StripeIosPlugin.m +++ b/stripe_ios/ios/Classes/StripeIosPlugin.m @@ -10,7 +10,7 @@ @implementation StripeIosPlugin + (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftStripeIosPlugin registerWithRegistrar:registrar]; + [StripePlugin registerWithRegistrar:registrar]; } @end diff --git a/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift b/stripe_ios/ios/Classes/StripePlugin.swift similarity index 66% rename from stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift rename to stripe_ios/ios/Classes/StripePlugin.swift index 1b7642754..e3fd84021 100644 --- a/stripe_ios/ios/Classes/SwiftStripeIosPlugin.swift +++ b/stripe_ios/ios/Classes/StripePlugin.swift @@ -4,19 +4,22 @@ import Stripe import PassKit -public class SwiftStripeIosPlugin: StripeSdk, FlutterPlugin { +public class StripePlugin: StripeSdk, FlutterPlugin { private var paymentSheet: PaymentSheet? private var paymentSheetFlowController: PaymentSheet.FlowController? public static func register(with registrar: FlutterPluginRegistrar) { + // Method Channel let channel = FlutterMethodChannel(name: "flutter.stripe/payments", binaryMessenger: registrar.messenger()) - let instance = SwiftStripeIosPlugin() + let instance = StripePlugin() registrar.addMethodCallDelegate(instance, channel: channel) + // Apple Pay Button let applePayFactory = ApplePayButtonViewFactory(messenger: registrar.messenger()) registrar.register(applePayFactory, withId: "flutter.stripe/apple_pay") + // Card Field let cardFieldFactory = CardFieldViewFactory(messenger: registrar.messenger()) registrar.register(cardFieldFactory, withId: "flutter.stripe/card_field") } @@ -25,12 +28,24 @@ public class SwiftStripeIosPlugin: StripeSdk, FlutterPlugin { switch call.method { case "initialise": return initialise(call, result: result) - case "configure3dSecure": - return configure3dSecure(call, result: result) + case "createTokenForCVCUpdate": + return createTokenForCVCUpdate(call, result: result) + case "confirmSetupIntent": + return confirmSetupIntent(call, result: result) + case "confirmApplePayPayment": + return confirmApplePayPayment(call, result: result) case "isApplePaySupported": return isApplePaySupported(call, result:result) case "presentApplePay": return presentApplePay(call, result: result) + case "configure3dSecure": + return configure3dSecure(call, result: result) + case "handleCardAction": + return handleCardAction(call, result: result) + case "confirmPaymentMethod": + return confirmPaymentMethod(call, result: result) + case "retrievePaymentIntent": + return retrievePaymentIntent(call, result: result) case "setupPaymentSheet": return setupPaymentSheet(call, result: result) case "presentPaymentOptions": @@ -45,7 +60,7 @@ public class SwiftStripeIosPlugin: StripeSdk, FlutterPlugin { } - public func resolver(forResult result: @escaping FlutterResult) -> RCTPromiseResolveBlock { + public func resolver(for result: @escaping FlutterResult) -> RCTPromiseResolveBlock { return { (response) in if let list = response as? [Any], let data = list.first { @@ -56,7 +71,7 @@ public class SwiftStripeIosPlugin: StripeSdk, FlutterPlugin { } } - public func rejecter(forResult result: @escaping FlutterResult) -> RCTPromiseRejectBlock { + public func rejecter(for result: @escaping FlutterResult) -> RCTPromiseRejectBlock { return { (code, message, error) in result(FlutterError.init(code: code ?? "Failed", message: message, details: error)) } @@ -65,7 +80,7 @@ public class SwiftStripeIosPlugin: StripeSdk, FlutterPlugin { // Mark: MethodChannel handlers -extension SwiftStripeIosPlugin { +extension StripePlugin { public func initialise(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let arguments = call.arguments as? Dictionary, @@ -81,30 +96,129 @@ extension SwiftStripeIosPlugin { result(nil) } - public func configure3dSecure(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - guard let arguments = call.arguments as? Dictionary, - let params = arguments["params"] as? NSDictionary else { + func createTokenForCVCUpdate(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary else { result("Not a valid fields") return } - configure3dSecure(params) - result(nil) + let cvc = arguments["cvc"] as? String + createTokenForCVCUpdate(cvc: cvc, resolver: resolver(for: result), rejecter: rejecter(for: result)) } - public func isApplePaySupported(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - isApplePaySupported(resolver: resolver(forResult: result), rejecter: rejecter(forResult: result)) + func confirmSetupIntent (_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let setupIntentClientSecret = arguments["setupIntentClientSecret"] as? String, + let data = arguments["data"] as? NSDictionary, + let options = arguments["options"] as? NSDictionary else { + result("Not a valid fields") + return + } + confirmSetupIntent(setupIntentClientSecret: setupIntentClientSecret, data: data, options: options,resolver: resolver(for: result), rejecter: rejecter(for: result)) } + public func confirmApplePayPayment(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let clientSecret = arguments["clientSecret"] as? String else { + result("Not a valid fields") + return + } + confirmApplePayPayment( + clientSecret: clientSecret, + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) + } + public func isApplePaySupported(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + isApplePaySupported( + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) + } public func presentApplePay(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let params = call.arguments as? NSDictionary else { result(FlutterError.init(code: ApplePayErrorType.Failed.rawValue, message: "Invalid parametes", details: nil)) return } - presentApplePay(params: params, resolver: resolver(forResult: result), rejecter: rejecter(forResult: result)) + presentApplePay( + params: params, + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) + } + + + func createPaymentMethod(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let data = arguments["data"] as? NSDictionary, + let options = arguments["options"] as? NSDictionary else { + result("Not a valid fields") + return + } + createPaymentMethod( + data: data, + options: options, + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) + } + + func handleCardAction(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let paymentIntentClientSecret = arguments["paymentIntentClientSecret"] as? String else { + result("Not a valid fields") + return + } + handleCardAction( + paymentIntentClientSecret: paymentIntentClientSecret, + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) } + func confirmPaymentMethod(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let paymentIntentClientSecret = arguments["paymentIntentClientSecret"] as? String, + let data = arguments["data"] as? NSDictionary, + let options = arguments["options"] as? NSDictionary else { + result("Not a valid fields") + return + } + confirmPaymentMethod( + paymentIntentClientSecret: paymentIntentClientSecret, + data: data, + options: options, + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) + } + + func retrievePaymentIntent(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let clientSecret = arguments["clientSecret"] as? String else { + result("Not a valid fields") + return + } + retrievePaymentIntent( + clientSecret: clientSecret, + resolver: resolver(for: result), + rejecter: rejecter(for: result) + ) + } + + + public func configure3dSecure(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let arguments = call.arguments as? Dictionary, + let params = arguments["params"] as? NSDictionary else { + result("Not a valid fields") + return + } + configure3dSecure(params) + result(nil) + } + + // This should be using StripeSdk.swift when the PaymentSheet PR is merged func setupPaymentSheet(_ call: FlutterMethodCall, result: @escaping FlutterResult) -> Void { From 5f7f34f5aae1b1ce98d5a52e8473a6193c17c275 Mon Sep 17 00:00:00 2001 From: Jaime Blasco Date: Thu, 18 Mar 2021 10:37:31 +0100 Subject: [PATCH 4/4] Remove open_api readme --- stripe_platform_interface/README.md | 924 +--------------------------- 1 file changed, 1 insertion(+), 923 deletions(-) diff --git a/stripe_platform_interface/README.md b/stripe_platform_interface/README.md index 5e0b4a0d6..ccc2c9773 100644 --- a/stripe_platform_interface/README.md +++ b/stripe_platform_interface/README.md @@ -1,923 +1 @@ -# openapi -The Stripe REST API. Please see https://stripe.com/docs/api for more details. - -This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - -- API version: 2020-08-27 -- Build package: org.openapitools.codegen.languages.DartClientCodegen -For more information, please visit [https://stripe.com](https://stripe.com) - -## Requirements - -Dart 2.0 or later - -## Installation & Usage - -### Github -If this Dart package is published to Github, add the following dependency to your pubspec.yaml -``` -dependencies: - openapi: - git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git -``` - -### Local -To use the package in your local drive, add the following dependency to your pubspec.yaml -``` -dependencies: - openapi: - path: /path/to/openapi -``` - -## Tests - -TODO - -## Getting Started - -Please follow the [installation procedure](#installation--usage) and then run the following: - -```dart -import 'package:openapi/api.dart'; - -// TODO Configure HTTP basic authorization: basicAuth -//defaultApiClient.getAuthentication('basicAuth').username = 'YOUR_USERNAME' -//defaultApiClient.getAuthentication('basicAuth').password = 'YOUR_PASSWORD'; -// TODO Configure HTTP Bearer authorization: bearerAuth -// Case 1. Use String Token -//defaultApiClient.getAuthentication('bearerAuth').setAccessToken('YOUR_ACCESS_TOKEN'); -// Case 2. Use Function which generate token. -// String yourTokenGeneratorFunction() { ... } -//defaultApiClient.getAuthentication('bearerAuth').setAccessToken(yourTokenGeneratorFunction); - -final api_instance = DefaultApi(); -final account = account_example; // String | - -try { - final result = api_instance.deleteAccount(account); - print(result); -} catch (e) { - print('Exception when calling DefaultApi->deleteAccount: $e\n'); -} - -``` - -## Documentation for API Endpoints - -All URIs are relative to *https://api.stripe.com* - -Class | Method | HTTP request | Description ------------- | ------------- | ------------- | ------------- -*DefaultApi* | [**deleteAccount**](doc//DefaultApi.md#deleteaccount) | **DELETE** /v1/account | -*DefaultApi* | [**deleteAccountBankAccountsId**](doc//DefaultApi.md#deleteaccountbankaccountsid) | **DELETE** /v1/account/bank_accounts/{id} | -*DefaultApi* | [**deleteAccountExternalAccountsId**](doc//DefaultApi.md#deleteaccountexternalaccountsid) | **DELETE** /v1/account/external_accounts/{id} | -*DefaultApi* | [**deleteAccountPeoplePerson**](doc//DefaultApi.md#deleteaccountpeopleperson) | **DELETE** /v1/account/people/{person} | -*DefaultApi* | [**deleteAccountPersonsPerson**](doc//DefaultApi.md#deleteaccountpersonsperson) | **DELETE** /v1/account/persons/{person} | -*DefaultApi* | [**deleteAccountsAccount**](doc//DefaultApi.md#deleteaccountsaccount) | **DELETE** /v1/accounts/{account} | -*DefaultApi* | [**deleteAccountsAccountBankAccountsId**](doc//DefaultApi.md#deleteaccountsaccountbankaccountsid) | **DELETE** /v1/accounts/{account}/bank_accounts/{id} | -*DefaultApi* | [**deleteAccountsAccountExternalAccountsId**](doc//DefaultApi.md#deleteaccountsaccountexternalaccountsid) | **DELETE** /v1/accounts/{account}/external_accounts/{id} | -*DefaultApi* | [**deleteAccountsAccountPeoplePerson**](doc//DefaultApi.md#deleteaccountsaccountpeopleperson) | **DELETE** /v1/accounts/{account}/people/{person} | -*DefaultApi* | [**deleteAccountsAccountPersonsPerson**](doc//DefaultApi.md#deleteaccountsaccountpersonsperson) | **DELETE** /v1/accounts/{account}/persons/{person} | -*DefaultApi* | [**deleteApplePayDomainsDomain**](doc//DefaultApi.md#deleteapplepaydomainsdomain) | **DELETE** /v1/apple_pay/domains/{domain} | -*DefaultApi* | [**deleteCouponsCoupon**](doc//DefaultApi.md#deletecouponscoupon) | **DELETE** /v1/coupons/{coupon} | -*DefaultApi* | [**deleteCustomersCustomer**](doc//DefaultApi.md#deletecustomerscustomer) | **DELETE** /v1/customers/{customer} | -*DefaultApi* | [**deleteCustomersCustomerBankAccountsId**](doc//DefaultApi.md#deletecustomerscustomerbankaccountsid) | **DELETE** /v1/customers/{customer}/bank_accounts/{id} | -*DefaultApi* | [**deleteCustomersCustomerCardsId**](doc//DefaultApi.md#deletecustomerscustomercardsid) | **DELETE** /v1/customers/{customer}/cards/{id} | -*DefaultApi* | [**deleteCustomersCustomerDiscount**](doc//DefaultApi.md#deletecustomerscustomerdiscount) | **DELETE** /v1/customers/{customer}/discount | -*DefaultApi* | [**deleteCustomersCustomerSourcesId**](doc//DefaultApi.md#deletecustomerscustomersourcesid) | **DELETE** /v1/customers/{customer}/sources/{id} | -*DefaultApi* | [**deleteCustomersCustomerSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#deletecustomerscustomersubscriptionssubscriptionexposedid) | **DELETE** /v1/customers/{customer}/subscriptions/{subscription_exposed_id} | -*DefaultApi* | [**deleteCustomersCustomerSubscriptionsSubscriptionExposedIdDiscount**](doc//DefaultApi.md#deletecustomerscustomersubscriptionssubscriptionexposediddiscount) | **DELETE** /v1/customers/{customer}/subscriptions/{subscription_exposed_id}/discount | -*DefaultApi* | [**deleteCustomersCustomerTaxIdsId**](doc//DefaultApi.md#deletecustomerscustomertaxidsid) | **DELETE** /v1/customers/{customer}/tax_ids/{id} | -*DefaultApi* | [**deleteEphemeralKeysKey**](doc//DefaultApi.md#deleteephemeralkeyskey) | **DELETE** /v1/ephemeral_keys/{key} | -*DefaultApi* | [**deleteInvoiceitemsInvoiceitem**](doc//DefaultApi.md#deleteinvoiceitemsinvoiceitem) | **DELETE** /v1/invoiceitems/{invoiceitem} | -*DefaultApi* | [**deleteInvoicesInvoice**](doc//DefaultApi.md#deleteinvoicesinvoice) | **DELETE** /v1/invoices/{invoice} | -*DefaultApi* | [**deletePlansPlan**](doc//DefaultApi.md#deleteplansplan) | **DELETE** /v1/plans/{plan} | -*DefaultApi* | [**deleteProductsId**](doc//DefaultApi.md#deleteproductsid) | **DELETE** /v1/products/{id} | -*DefaultApi* | [**deleteRadarValueListItemsItem**](doc//DefaultApi.md#deleteradarvaluelistitemsitem) | **DELETE** /v1/radar/value_list_items/{item} | -*DefaultApi* | [**deleteRadarValueListsValueList**](doc//DefaultApi.md#deleteradarvaluelistsvaluelist) | **DELETE** /v1/radar/value_lists/{value_list} | -*DefaultApi* | [**deleteRecipientsId**](doc//DefaultApi.md#deleterecipientsid) | **DELETE** /v1/recipients/{id} | -*DefaultApi* | [**deleteSkusId**](doc//DefaultApi.md#deleteskusid) | **DELETE** /v1/skus/{id} | -*DefaultApi* | [**deleteSubscriptionItemsItem**](doc//DefaultApi.md#deletesubscriptionitemsitem) | **DELETE** /v1/subscription_items/{item} | -*DefaultApi* | [**deleteSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#deletesubscriptionssubscriptionexposedid) | **DELETE** /v1/subscriptions/{subscription_exposed_id} | -*DefaultApi* | [**deleteSubscriptionsSubscriptionExposedIdDiscount**](doc//DefaultApi.md#deletesubscriptionssubscriptionexposediddiscount) | **DELETE** /v1/subscriptions/{subscription_exposed_id}/discount | -*DefaultApi* | [**deleteTerminalLocationsLocation**](doc//DefaultApi.md#deleteterminallocationslocation) | **DELETE** /v1/terminal/locations/{location} | -*DefaultApi* | [**deleteTerminalReadersReader**](doc//DefaultApi.md#deleteterminalreadersreader) | **DELETE** /v1/terminal/readers/{reader} | -*DefaultApi* | [**deleteWebhookEndpointsWebhookEndpoint**](doc//DefaultApi.md#deletewebhookendpointswebhookendpoint) | **DELETE** /v1/webhook_endpoints/{webhook_endpoint} | -*DefaultApi* | [**get3dSecureThreeDSecure**](doc//DefaultApi.md#get3dsecurethreedsecure) | **GET** /v1/3d_secure/{three_d_secure} | -*DefaultApi* | [**getAccount**](doc//DefaultApi.md#getaccount) | **GET** /v1/account | -*DefaultApi* | [**getAccountBankAccountsId**](doc//DefaultApi.md#getaccountbankaccountsid) | **GET** /v1/account/bank_accounts/{id} | -*DefaultApi* | [**getAccountCapabilities**](doc//DefaultApi.md#getaccountcapabilities) | **GET** /v1/account/capabilities | -*DefaultApi* | [**getAccountCapabilitiesCapability**](doc//DefaultApi.md#getaccountcapabilitiescapability) | **GET** /v1/account/capabilities/{capability} | -*DefaultApi* | [**getAccountExternalAccounts**](doc//DefaultApi.md#getaccountexternalaccounts) | **GET** /v1/account/external_accounts | -*DefaultApi* | [**getAccountExternalAccountsId**](doc//DefaultApi.md#getaccountexternalaccountsid) | **GET** /v1/account/external_accounts/{id} | -*DefaultApi* | [**getAccountPeople**](doc//DefaultApi.md#getaccountpeople) | **GET** /v1/account/people | -*DefaultApi* | [**getAccountPeoplePerson**](doc//DefaultApi.md#getaccountpeopleperson) | **GET** /v1/account/people/{person} | -*DefaultApi* | [**getAccountPersons**](doc//DefaultApi.md#getaccountpersons) | **GET** /v1/account/persons | -*DefaultApi* | [**getAccountPersonsPerson**](doc//DefaultApi.md#getaccountpersonsperson) | **GET** /v1/account/persons/{person} | -*DefaultApi* | [**getAccounts**](doc//DefaultApi.md#getaccounts) | **GET** /v1/accounts | -*DefaultApi* | [**getAccountsAccount**](doc//DefaultApi.md#getaccountsaccount) | **GET** /v1/accounts/{account} | -*DefaultApi* | [**getAccountsAccountBankAccountsId**](doc//DefaultApi.md#getaccountsaccountbankaccountsid) | **GET** /v1/accounts/{account}/bank_accounts/{id} | -*DefaultApi* | [**getAccountsAccountCapabilities**](doc//DefaultApi.md#getaccountsaccountcapabilities) | **GET** /v1/accounts/{account}/capabilities | -*DefaultApi* | [**getAccountsAccountCapabilitiesCapability**](doc//DefaultApi.md#getaccountsaccountcapabilitiescapability) | **GET** /v1/accounts/{account}/capabilities/{capability} | -*DefaultApi* | [**getAccountsAccountExternalAccounts**](doc//DefaultApi.md#getaccountsaccountexternalaccounts) | **GET** /v1/accounts/{account}/external_accounts | -*DefaultApi* | [**getAccountsAccountExternalAccountsId**](doc//DefaultApi.md#getaccountsaccountexternalaccountsid) | **GET** /v1/accounts/{account}/external_accounts/{id} | -*DefaultApi* | [**getAccountsAccountPeople**](doc//DefaultApi.md#getaccountsaccountpeople) | **GET** /v1/accounts/{account}/people | -*DefaultApi* | [**getAccountsAccountPeoplePerson**](doc//DefaultApi.md#getaccountsaccountpeopleperson) | **GET** /v1/accounts/{account}/people/{person} | -*DefaultApi* | [**getAccountsAccountPersons**](doc//DefaultApi.md#getaccountsaccountpersons) | **GET** /v1/accounts/{account}/persons | -*DefaultApi* | [**getAccountsAccountPersonsPerson**](doc//DefaultApi.md#getaccountsaccountpersonsperson) | **GET** /v1/accounts/{account}/persons/{person} | -*DefaultApi* | [**getApplePayDomains**](doc//DefaultApi.md#getapplepaydomains) | **GET** /v1/apple_pay/domains | -*DefaultApi* | [**getApplePayDomainsDomain**](doc//DefaultApi.md#getapplepaydomainsdomain) | **GET** /v1/apple_pay/domains/{domain} | -*DefaultApi* | [**getApplicationFees**](doc//DefaultApi.md#getapplicationfees) | **GET** /v1/application_fees | -*DefaultApi* | [**getApplicationFeesFeeRefundsId**](doc//DefaultApi.md#getapplicationfeesfeerefundsid) | **GET** /v1/application_fees/{fee}/refunds/{id} | -*DefaultApi* | [**getApplicationFeesId**](doc//DefaultApi.md#getapplicationfeesid) | **GET** /v1/application_fees/{id} | -*DefaultApi* | [**getApplicationFeesIdRefunds**](doc//DefaultApi.md#getapplicationfeesidrefunds) | **GET** /v1/application_fees/{id}/refunds | -*DefaultApi* | [**getBalance**](doc//DefaultApi.md#getbalance) | **GET** /v1/balance | -*DefaultApi* | [**getBalanceHistory**](doc//DefaultApi.md#getbalancehistory) | **GET** /v1/balance/history | -*DefaultApi* | [**getBalanceHistoryId**](doc//DefaultApi.md#getbalancehistoryid) | **GET** /v1/balance/history/{id} | -*DefaultApi* | [**getBalanceTransactions**](doc//DefaultApi.md#getbalancetransactions) | **GET** /v1/balance_transactions | -*DefaultApi* | [**getBalanceTransactionsId**](doc//DefaultApi.md#getbalancetransactionsid) | **GET** /v1/balance_transactions/{id} | -*DefaultApi* | [**getBillingPortalConfigurations**](doc//DefaultApi.md#getbillingportalconfigurations) | **GET** /v1/billing_portal/configurations | -*DefaultApi* | [**getBillingPortalConfigurationsConfiguration**](doc//DefaultApi.md#getbillingportalconfigurationsconfiguration) | **GET** /v1/billing_portal/configurations/{configuration} | -*DefaultApi* | [**getBitcoinReceivers**](doc//DefaultApi.md#getbitcoinreceivers) | **GET** /v1/bitcoin/receivers | -*DefaultApi* | [**getBitcoinReceiversId**](doc//DefaultApi.md#getbitcoinreceiversid) | **GET** /v1/bitcoin/receivers/{id} | -*DefaultApi* | [**getBitcoinReceiversReceiverTransactions**](doc//DefaultApi.md#getbitcoinreceiversreceivertransactions) | **GET** /v1/bitcoin/receivers/{receiver}/transactions | -*DefaultApi* | [**getBitcoinTransactions**](doc//DefaultApi.md#getbitcointransactions) | **GET** /v1/bitcoin/transactions | -*DefaultApi* | [**getCharges**](doc//DefaultApi.md#getcharges) | **GET** /v1/charges | -*DefaultApi* | [**getChargesCharge**](doc//DefaultApi.md#getchargescharge) | **GET** /v1/charges/{charge} | -*DefaultApi* | [**getChargesChargeDispute**](doc//DefaultApi.md#getchargeschargedispute) | **GET** /v1/charges/{charge}/dispute | -*DefaultApi* | [**getChargesChargeRefunds**](doc//DefaultApi.md#getchargeschargerefunds) | **GET** /v1/charges/{charge}/refunds | -*DefaultApi* | [**getChargesChargeRefundsRefund**](doc//DefaultApi.md#getchargeschargerefundsrefund) | **GET** /v1/charges/{charge}/refunds/{refund} | -*DefaultApi* | [**getCheckoutSessions**](doc//DefaultApi.md#getcheckoutsessions) | **GET** /v1/checkout/sessions | -*DefaultApi* | [**getCheckoutSessionsSession**](doc//DefaultApi.md#getcheckoutsessionssession) | **GET** /v1/checkout/sessions/{session} | -*DefaultApi* | [**getCheckoutSessionsSessionLineItems**](doc//DefaultApi.md#getcheckoutsessionssessionlineitems) | **GET** /v1/checkout/sessions/{session}/line_items | -*DefaultApi* | [**getCountrySpecs**](doc//DefaultApi.md#getcountryspecs) | **GET** /v1/country_specs | -*DefaultApi* | [**getCountrySpecsCountry**](doc//DefaultApi.md#getcountryspecscountry) | **GET** /v1/country_specs/{country} | -*DefaultApi* | [**getCoupons**](doc//DefaultApi.md#getcoupons) | **GET** /v1/coupons | -*DefaultApi* | [**getCouponsCoupon**](doc//DefaultApi.md#getcouponscoupon) | **GET** /v1/coupons/{coupon} | -*DefaultApi* | [**getCreditNotes**](doc//DefaultApi.md#getcreditnotes) | **GET** /v1/credit_notes | -*DefaultApi* | [**getCreditNotesCreditNoteLines**](doc//DefaultApi.md#getcreditnotescreditnotelines) | **GET** /v1/credit_notes/{credit_note}/lines | -*DefaultApi* | [**getCreditNotesId**](doc//DefaultApi.md#getcreditnotesid) | **GET** /v1/credit_notes/{id} | -*DefaultApi* | [**getCreditNotesPreview**](doc//DefaultApi.md#getcreditnotespreview) | **GET** /v1/credit_notes/preview | -*DefaultApi* | [**getCreditNotesPreviewLines**](doc//DefaultApi.md#getcreditnotespreviewlines) | **GET** /v1/credit_notes/preview/lines | -*DefaultApi* | [**getCustomers**](doc//DefaultApi.md#getcustomers) | **GET** /v1/customers | -*DefaultApi* | [**getCustomersCustomer**](doc//DefaultApi.md#getcustomerscustomer) | **GET** /v1/customers/{customer} | -*DefaultApi* | [**getCustomersCustomerBalanceTransactions**](doc//DefaultApi.md#getcustomerscustomerbalancetransactions) | **GET** /v1/customers/{customer}/balance_transactions | -*DefaultApi* | [**getCustomersCustomerBalanceTransactionsTransaction**](doc//DefaultApi.md#getcustomerscustomerbalancetransactionstransaction) | **GET** /v1/customers/{customer}/balance_transactions/{transaction} | -*DefaultApi* | [**getCustomersCustomerBankAccounts**](doc//DefaultApi.md#getcustomerscustomerbankaccounts) | **GET** /v1/customers/{customer}/bank_accounts | -*DefaultApi* | [**getCustomersCustomerBankAccountsId**](doc//DefaultApi.md#getcustomerscustomerbankaccountsid) | **GET** /v1/customers/{customer}/bank_accounts/{id} | -*DefaultApi* | [**getCustomersCustomerCards**](doc//DefaultApi.md#getcustomerscustomercards) | **GET** /v1/customers/{customer}/cards | -*DefaultApi* | [**getCustomersCustomerCardsId**](doc//DefaultApi.md#getcustomerscustomercardsid) | **GET** /v1/customers/{customer}/cards/{id} | -*DefaultApi* | [**getCustomersCustomerDiscount**](doc//DefaultApi.md#getcustomerscustomerdiscount) | **GET** /v1/customers/{customer}/discount | -*DefaultApi* | [**getCustomersCustomerSources**](doc//DefaultApi.md#getcustomerscustomersources) | **GET** /v1/customers/{customer}/sources | -*DefaultApi* | [**getCustomersCustomerSourcesId**](doc//DefaultApi.md#getcustomerscustomersourcesid) | **GET** /v1/customers/{customer}/sources/{id} | -*DefaultApi* | [**getCustomersCustomerSubscriptions**](doc//DefaultApi.md#getcustomerscustomersubscriptions) | **GET** /v1/customers/{customer}/subscriptions | -*DefaultApi* | [**getCustomersCustomerSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#getcustomerscustomersubscriptionssubscriptionexposedid) | **GET** /v1/customers/{customer}/subscriptions/{subscription_exposed_id} | -*DefaultApi* | [**getCustomersCustomerSubscriptionsSubscriptionExposedIdDiscount**](doc//DefaultApi.md#getcustomerscustomersubscriptionssubscriptionexposediddiscount) | **GET** /v1/customers/{customer}/subscriptions/{subscription_exposed_id}/discount | -*DefaultApi* | [**getCustomersCustomerTaxIds**](doc//DefaultApi.md#getcustomerscustomertaxids) | **GET** /v1/customers/{customer}/tax_ids | -*DefaultApi* | [**getCustomersCustomerTaxIdsId**](doc//DefaultApi.md#getcustomerscustomertaxidsid) | **GET** /v1/customers/{customer}/tax_ids/{id} | -*DefaultApi* | [**getDisputes**](doc//DefaultApi.md#getdisputes) | **GET** /v1/disputes | -*DefaultApi* | [**getDisputesDispute**](doc//DefaultApi.md#getdisputesdispute) | **GET** /v1/disputes/{dispute} | -*DefaultApi* | [**getEvents**](doc//DefaultApi.md#getevents) | **GET** /v1/events | -*DefaultApi* | [**getEventsId**](doc//DefaultApi.md#geteventsid) | **GET** /v1/events/{id} | -*DefaultApi* | [**getExchangeRates**](doc//DefaultApi.md#getexchangerates) | **GET** /v1/exchange_rates | -*DefaultApi* | [**getExchangeRatesRateId**](doc//DefaultApi.md#getexchangeratesrateid) | **GET** /v1/exchange_rates/{rate_id} | -*DefaultApi* | [**getFileLinks**](doc//DefaultApi.md#getfilelinks) | **GET** /v1/file_links | -*DefaultApi* | [**getFileLinksLink**](doc//DefaultApi.md#getfilelinkslink) | **GET** /v1/file_links/{link} | -*DefaultApi* | [**getFiles**](doc//DefaultApi.md#getfiles) | **GET** /v1/files | -*DefaultApi* | [**getFilesFile**](doc//DefaultApi.md#getfilesfile) | **GET** /v1/files/{file} | -*DefaultApi* | [**getInvoiceitems**](doc//DefaultApi.md#getinvoiceitems) | **GET** /v1/invoiceitems | -*DefaultApi* | [**getInvoiceitemsInvoiceitem**](doc//DefaultApi.md#getinvoiceitemsinvoiceitem) | **GET** /v1/invoiceitems/{invoiceitem} | -*DefaultApi* | [**getInvoices**](doc//DefaultApi.md#getinvoices) | **GET** /v1/invoices | -*DefaultApi* | [**getInvoicesInvoice**](doc//DefaultApi.md#getinvoicesinvoice) | **GET** /v1/invoices/{invoice} | -*DefaultApi* | [**getInvoicesInvoiceLines**](doc//DefaultApi.md#getinvoicesinvoicelines) | **GET** /v1/invoices/{invoice}/lines | -*DefaultApi* | [**getInvoicesUpcoming**](doc//DefaultApi.md#getinvoicesupcoming) | **GET** /v1/invoices/upcoming | -*DefaultApi* | [**getInvoicesUpcomingLines**](doc//DefaultApi.md#getinvoicesupcominglines) | **GET** /v1/invoices/upcoming/lines | -*DefaultApi* | [**getIssuerFraudRecords**](doc//DefaultApi.md#getissuerfraudrecords) | **GET** /v1/issuer_fraud_records | -*DefaultApi* | [**getIssuerFraudRecordsIssuerFraudRecord**](doc//DefaultApi.md#getissuerfraudrecordsissuerfraudrecord) | **GET** /v1/issuer_fraud_records/{issuer_fraud_record} | -*DefaultApi* | [**getIssuingAuthorizations**](doc//DefaultApi.md#getissuingauthorizations) | **GET** /v1/issuing/authorizations | -*DefaultApi* | [**getIssuingAuthorizationsAuthorization**](doc//DefaultApi.md#getissuingauthorizationsauthorization) | **GET** /v1/issuing/authorizations/{authorization} | -*DefaultApi* | [**getIssuingCardholders**](doc//DefaultApi.md#getissuingcardholders) | **GET** /v1/issuing/cardholders | -*DefaultApi* | [**getIssuingCardholdersCardholder**](doc//DefaultApi.md#getissuingcardholderscardholder) | **GET** /v1/issuing/cardholders/{cardholder} | -*DefaultApi* | [**getIssuingCards**](doc//DefaultApi.md#getissuingcards) | **GET** /v1/issuing/cards | -*DefaultApi* | [**getIssuingCardsCard**](doc//DefaultApi.md#getissuingcardscard) | **GET** /v1/issuing/cards/{card} | -*DefaultApi* | [**getIssuingDisputes**](doc//DefaultApi.md#getissuingdisputes) | **GET** /v1/issuing/disputes | -*DefaultApi* | [**getIssuingDisputesDispute**](doc//DefaultApi.md#getissuingdisputesdispute) | **GET** /v1/issuing/disputes/{dispute} | -*DefaultApi* | [**getIssuingSettlements**](doc//DefaultApi.md#getissuingsettlements) | **GET** /v1/issuing/settlements | -*DefaultApi* | [**getIssuingSettlementsSettlement**](doc//DefaultApi.md#getissuingsettlementssettlement) | **GET** /v1/issuing/settlements/{settlement} | -*DefaultApi* | [**getIssuingTransactions**](doc//DefaultApi.md#getissuingtransactions) | **GET** /v1/issuing/transactions | -*DefaultApi* | [**getIssuingTransactionsTransaction**](doc//DefaultApi.md#getissuingtransactionstransaction) | **GET** /v1/issuing/transactions/{transaction} | -*DefaultApi* | [**getMandatesMandate**](doc//DefaultApi.md#getmandatesmandate) | **GET** /v1/mandates/{mandate} | -*DefaultApi* | [**getOrderReturns**](doc//DefaultApi.md#getorderreturns) | **GET** /v1/order_returns | -*DefaultApi* | [**getOrderReturnsId**](doc//DefaultApi.md#getorderreturnsid) | **GET** /v1/order_returns/{id} | -*DefaultApi* | [**getOrders**](doc//DefaultApi.md#getorders) | **GET** /v1/orders | -*DefaultApi* | [**getOrdersId**](doc//DefaultApi.md#getordersid) | **GET** /v1/orders/{id} | -*DefaultApi* | [**getPaymentIntents**](doc//DefaultApi.md#getpaymentintents) | **GET** /v1/payment_intents | -*DefaultApi* | [**getPaymentIntentsIntent**](doc//DefaultApi.md#getpaymentintentsintent) | **GET** /v1/payment_intents/{intent} | -*DefaultApi* | [**getPaymentMethods**](doc//DefaultApi.md#getpaymentmethods) | **GET** /v1/payment_methods | -*DefaultApi* | [**getPaymentMethodsPaymentMethod**](doc//DefaultApi.md#getpaymentmethodspaymentmethod) | **GET** /v1/payment_methods/{payment_method} | -*DefaultApi* | [**getPayouts**](doc//DefaultApi.md#getpayouts) | **GET** /v1/payouts | -*DefaultApi* | [**getPayoutsPayout**](doc//DefaultApi.md#getpayoutspayout) | **GET** /v1/payouts/{payout} | -*DefaultApi* | [**getPlans**](doc//DefaultApi.md#getplans) | **GET** /v1/plans | -*DefaultApi* | [**getPlansPlan**](doc//DefaultApi.md#getplansplan) | **GET** /v1/plans/{plan} | -*DefaultApi* | [**getPrices**](doc//DefaultApi.md#getprices) | **GET** /v1/prices | -*DefaultApi* | [**getPricesPrice**](doc//DefaultApi.md#getpricesprice) | **GET** /v1/prices/{price} | -*DefaultApi* | [**getProducts**](doc//DefaultApi.md#getproducts) | **GET** /v1/products | -*DefaultApi* | [**getProductsId**](doc//DefaultApi.md#getproductsid) | **GET** /v1/products/{id} | -*DefaultApi* | [**getPromotionCodes**](doc//DefaultApi.md#getpromotioncodes) | **GET** /v1/promotion_codes | -*DefaultApi* | [**getPromotionCodesPromotionCode**](doc//DefaultApi.md#getpromotioncodespromotioncode) | **GET** /v1/promotion_codes/{promotion_code} | -*DefaultApi* | [**getRadarEarlyFraudWarnings**](doc//DefaultApi.md#getradarearlyfraudwarnings) | **GET** /v1/radar/early_fraud_warnings | -*DefaultApi* | [**getRadarEarlyFraudWarningsEarlyFraudWarning**](doc//DefaultApi.md#getradarearlyfraudwarningsearlyfraudwarning) | **GET** /v1/radar/early_fraud_warnings/{early_fraud_warning} | -*DefaultApi* | [**getRadarValueListItems**](doc//DefaultApi.md#getradarvaluelistitems) | **GET** /v1/radar/value_list_items | -*DefaultApi* | [**getRadarValueListItemsItem**](doc//DefaultApi.md#getradarvaluelistitemsitem) | **GET** /v1/radar/value_list_items/{item} | -*DefaultApi* | [**getRadarValueLists**](doc//DefaultApi.md#getradarvaluelists) | **GET** /v1/radar/value_lists | -*DefaultApi* | [**getRadarValueListsValueList**](doc//DefaultApi.md#getradarvaluelistsvaluelist) | **GET** /v1/radar/value_lists/{value_list} | -*DefaultApi* | [**getRecipients**](doc//DefaultApi.md#getrecipients) | **GET** /v1/recipients | -*DefaultApi* | [**getRecipientsId**](doc//DefaultApi.md#getrecipientsid) | **GET** /v1/recipients/{id} | -*DefaultApi* | [**getRefunds**](doc//DefaultApi.md#getrefunds) | **GET** /v1/refunds | -*DefaultApi* | [**getRefundsRefund**](doc//DefaultApi.md#getrefundsrefund) | **GET** /v1/refunds/{refund} | -*DefaultApi* | [**getReportingReportRuns**](doc//DefaultApi.md#getreportingreportruns) | **GET** /v1/reporting/report_runs | -*DefaultApi* | [**getReportingReportRunsReportRun**](doc//DefaultApi.md#getreportingreportrunsreportrun) | **GET** /v1/reporting/report_runs/{report_run} | -*DefaultApi* | [**getReportingReportTypes**](doc//DefaultApi.md#getreportingreporttypes) | **GET** /v1/reporting/report_types | -*DefaultApi* | [**getReportingReportTypesReportType**](doc//DefaultApi.md#getreportingreporttypesreporttype) | **GET** /v1/reporting/report_types/{report_type} | -*DefaultApi* | [**getReviews**](doc//DefaultApi.md#getreviews) | **GET** /v1/reviews | -*DefaultApi* | [**getReviewsReview**](doc//DefaultApi.md#getreviewsreview) | **GET** /v1/reviews/{review} | -*DefaultApi* | [**getSetupAttempts**](doc//DefaultApi.md#getsetupattempts) | **GET** /v1/setup_attempts | -*DefaultApi* | [**getSetupIntents**](doc//DefaultApi.md#getsetupintents) | **GET** /v1/setup_intents | -*DefaultApi* | [**getSetupIntentsIntent**](doc//DefaultApi.md#getsetupintentsintent) | **GET** /v1/setup_intents/{intent} | -*DefaultApi* | [**getSigmaScheduledQueryRuns**](doc//DefaultApi.md#getsigmascheduledqueryruns) | **GET** /v1/sigma/scheduled_query_runs | -*DefaultApi* | [**getSigmaScheduledQueryRunsScheduledQueryRun**](doc//DefaultApi.md#getsigmascheduledqueryrunsscheduledqueryrun) | **GET** /v1/sigma/scheduled_query_runs/{scheduled_query_run} | -*DefaultApi* | [**getSkus**](doc//DefaultApi.md#getskus) | **GET** /v1/skus | -*DefaultApi* | [**getSkusId**](doc//DefaultApi.md#getskusid) | **GET** /v1/skus/{id} | -*DefaultApi* | [**getSourcesSource**](doc//DefaultApi.md#getsourcessource) | **GET** /v1/sources/{source} | -*DefaultApi* | [**getSourcesSourceMandateNotificationsMandateNotification**](doc//DefaultApi.md#getsourcessourcemandatenotificationsmandatenotification) | **GET** /v1/sources/{source}/mandate_notifications/{mandate_notification} | -*DefaultApi* | [**getSourcesSourceSourceTransactions**](doc//DefaultApi.md#getsourcessourcesourcetransactions) | **GET** /v1/sources/{source}/source_transactions | -*DefaultApi* | [**getSourcesSourceSourceTransactionsSourceTransaction**](doc//DefaultApi.md#getsourcessourcesourcetransactionssourcetransaction) | **GET** /v1/sources/{source}/source_transactions/{source_transaction} | -*DefaultApi* | [**getSubscriptionItems**](doc//DefaultApi.md#getsubscriptionitems) | **GET** /v1/subscription_items | -*DefaultApi* | [**getSubscriptionItemsItem**](doc//DefaultApi.md#getsubscriptionitemsitem) | **GET** /v1/subscription_items/{item} | -*DefaultApi* | [**getSubscriptionItemsSubscriptionItemUsageRecordSummaries**](doc//DefaultApi.md#getsubscriptionitemssubscriptionitemusagerecordsummaries) | **GET** /v1/subscription_items/{subscription_item}/usage_record_summaries | -*DefaultApi* | [**getSubscriptionSchedules**](doc//DefaultApi.md#getsubscriptionschedules) | **GET** /v1/subscription_schedules | -*DefaultApi* | [**getSubscriptionSchedulesSchedule**](doc//DefaultApi.md#getsubscriptionschedulesschedule) | **GET** /v1/subscription_schedules/{schedule} | -*DefaultApi* | [**getSubscriptions**](doc//DefaultApi.md#getsubscriptions) | **GET** /v1/subscriptions | -*DefaultApi* | [**getSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#getsubscriptionssubscriptionexposedid) | **GET** /v1/subscriptions/{subscription_exposed_id} | -*DefaultApi* | [**getTaxRates**](doc//DefaultApi.md#gettaxrates) | **GET** /v1/tax_rates | -*DefaultApi* | [**getTaxRatesTaxRate**](doc//DefaultApi.md#gettaxratestaxrate) | **GET** /v1/tax_rates/{tax_rate} | -*DefaultApi* | [**getTerminalLocations**](doc//DefaultApi.md#getterminallocations) | **GET** /v1/terminal/locations | -*DefaultApi* | [**getTerminalLocationsLocation**](doc//DefaultApi.md#getterminallocationslocation) | **GET** /v1/terminal/locations/{location} | -*DefaultApi* | [**getTerminalReaders**](doc//DefaultApi.md#getterminalreaders) | **GET** /v1/terminal/readers | -*DefaultApi* | [**getTerminalReadersReader**](doc//DefaultApi.md#getterminalreadersreader) | **GET** /v1/terminal/readers/{reader} | -*DefaultApi* | [**getTokensToken**](doc//DefaultApi.md#gettokenstoken) | **GET** /v1/tokens/{token} | -*DefaultApi* | [**getTopups**](doc//DefaultApi.md#gettopups) | **GET** /v1/topups | -*DefaultApi* | [**getTopupsTopup**](doc//DefaultApi.md#gettopupstopup) | **GET** /v1/topups/{topup} | -*DefaultApi* | [**getTransfers**](doc//DefaultApi.md#gettransfers) | **GET** /v1/transfers | -*DefaultApi* | [**getTransfersIdReversals**](doc//DefaultApi.md#gettransfersidreversals) | **GET** /v1/transfers/{id}/reversals | -*DefaultApi* | [**getTransfersTransfer**](doc//DefaultApi.md#gettransferstransfer) | **GET** /v1/transfers/{transfer} | -*DefaultApi* | [**getTransfersTransferReversalsId**](doc//DefaultApi.md#gettransferstransferreversalsid) | **GET** /v1/transfers/{transfer}/reversals/{id} | -*DefaultApi* | [**getWebhookEndpoints**](doc//DefaultApi.md#getwebhookendpoints) | **GET** /v1/webhook_endpoints | -*DefaultApi* | [**getWebhookEndpointsWebhookEndpoint**](doc//DefaultApi.md#getwebhookendpointswebhookendpoint) | **GET** /v1/webhook_endpoints/{webhook_endpoint} | -*DefaultApi* | [**post3dSecure**](doc//DefaultApi.md#post3dsecure) | **POST** /v1/3d_secure | -*DefaultApi* | [**postAccount**](doc//DefaultApi.md#postaccount) | **POST** /v1/account | -*DefaultApi* | [**postAccountBankAccounts**](doc//DefaultApi.md#postaccountbankaccounts) | **POST** /v1/account/bank_accounts | -*DefaultApi* | [**postAccountBankAccountsId**](doc//DefaultApi.md#postaccountbankaccountsid) | **POST** /v1/account/bank_accounts/{id} | -*DefaultApi* | [**postAccountCapabilitiesCapability**](doc//DefaultApi.md#postaccountcapabilitiescapability) | **POST** /v1/account/capabilities/{capability} | -*DefaultApi* | [**postAccountExternalAccounts**](doc//DefaultApi.md#postaccountexternalaccounts) | **POST** /v1/account/external_accounts | -*DefaultApi* | [**postAccountExternalAccountsId**](doc//DefaultApi.md#postaccountexternalaccountsid) | **POST** /v1/account/external_accounts/{id} | -*DefaultApi* | [**postAccountLinks**](doc//DefaultApi.md#postaccountlinks) | **POST** /v1/account_links | -*DefaultApi* | [**postAccountLoginLinks**](doc//DefaultApi.md#postaccountloginlinks) | **POST** /v1/account/login_links | -*DefaultApi* | [**postAccountPeople**](doc//DefaultApi.md#postaccountpeople) | **POST** /v1/account/people | -*DefaultApi* | [**postAccountPeoplePerson**](doc//DefaultApi.md#postaccountpeopleperson) | **POST** /v1/account/people/{person} | -*DefaultApi* | [**postAccountPersons**](doc//DefaultApi.md#postaccountpersons) | **POST** /v1/account/persons | -*DefaultApi* | [**postAccountPersonsPerson**](doc//DefaultApi.md#postaccountpersonsperson) | **POST** /v1/account/persons/{person} | -*DefaultApi* | [**postAccounts**](doc//DefaultApi.md#postaccounts) | **POST** /v1/accounts | -*DefaultApi* | [**postAccountsAccount**](doc//DefaultApi.md#postaccountsaccount) | **POST** /v1/accounts/{account} | -*DefaultApi* | [**postAccountsAccountBankAccounts**](doc//DefaultApi.md#postaccountsaccountbankaccounts) | **POST** /v1/accounts/{account}/bank_accounts | -*DefaultApi* | [**postAccountsAccountBankAccountsId**](doc//DefaultApi.md#postaccountsaccountbankaccountsid) | **POST** /v1/accounts/{account}/bank_accounts/{id} | -*DefaultApi* | [**postAccountsAccountCapabilitiesCapability**](doc//DefaultApi.md#postaccountsaccountcapabilitiescapability) | **POST** /v1/accounts/{account}/capabilities/{capability} | -*DefaultApi* | [**postAccountsAccountExternalAccounts**](doc//DefaultApi.md#postaccountsaccountexternalaccounts) | **POST** /v1/accounts/{account}/external_accounts | -*DefaultApi* | [**postAccountsAccountExternalAccountsId**](doc//DefaultApi.md#postaccountsaccountexternalaccountsid) | **POST** /v1/accounts/{account}/external_accounts/{id} | -*DefaultApi* | [**postAccountsAccountLoginLinks**](doc//DefaultApi.md#postaccountsaccountloginlinks) | **POST** /v1/accounts/{account}/login_links | -*DefaultApi* | [**postAccountsAccountPeople**](doc//DefaultApi.md#postaccountsaccountpeople) | **POST** /v1/accounts/{account}/people | -*DefaultApi* | [**postAccountsAccountPeoplePerson**](doc//DefaultApi.md#postaccountsaccountpeopleperson) | **POST** /v1/accounts/{account}/people/{person} | -*DefaultApi* | [**postAccountsAccountPersons**](doc//DefaultApi.md#postaccountsaccountpersons) | **POST** /v1/accounts/{account}/persons | -*DefaultApi* | [**postAccountsAccountPersonsPerson**](doc//DefaultApi.md#postaccountsaccountpersonsperson) | **POST** /v1/accounts/{account}/persons/{person} | -*DefaultApi* | [**postAccountsAccountReject**](doc//DefaultApi.md#postaccountsaccountreject) | **POST** /v1/accounts/{account}/reject | -*DefaultApi* | [**postApplePayDomains**](doc//DefaultApi.md#postapplepaydomains) | **POST** /v1/apple_pay/domains | -*DefaultApi* | [**postApplicationFeesFeeRefundsId**](doc//DefaultApi.md#postapplicationfeesfeerefundsid) | **POST** /v1/application_fees/{fee}/refunds/{id} | -*DefaultApi* | [**postApplicationFeesIdRefund**](doc//DefaultApi.md#postapplicationfeesidrefund) | **POST** /v1/application_fees/{id}/refund | -*DefaultApi* | [**postApplicationFeesIdRefunds**](doc//DefaultApi.md#postapplicationfeesidrefunds) | **POST** /v1/application_fees/{id}/refunds | -*DefaultApi* | [**postBillingPortalConfigurations**](doc//DefaultApi.md#postbillingportalconfigurations) | **POST** /v1/billing_portal/configurations | -*DefaultApi* | [**postBillingPortalConfigurationsConfiguration**](doc//DefaultApi.md#postbillingportalconfigurationsconfiguration) | **POST** /v1/billing_portal/configurations/{configuration} | -*DefaultApi* | [**postBillingPortalSessions**](doc//DefaultApi.md#postbillingportalsessions) | **POST** /v1/billing_portal/sessions | -*DefaultApi* | [**postCharges**](doc//DefaultApi.md#postcharges) | **POST** /v1/charges | -*DefaultApi* | [**postChargesCharge**](doc//DefaultApi.md#postchargescharge) | **POST** /v1/charges/{charge} | -*DefaultApi* | [**postChargesChargeCapture**](doc//DefaultApi.md#postchargeschargecapture) | **POST** /v1/charges/{charge}/capture | -*DefaultApi* | [**postChargesChargeDispute**](doc//DefaultApi.md#postchargeschargedispute) | **POST** /v1/charges/{charge}/dispute | -*DefaultApi* | [**postChargesChargeDisputeClose**](doc//DefaultApi.md#postchargeschargedisputeclose) | **POST** /v1/charges/{charge}/dispute/close | -*DefaultApi* | [**postChargesChargeRefund**](doc//DefaultApi.md#postchargeschargerefund) | **POST** /v1/charges/{charge}/refund | -*DefaultApi* | [**postChargesChargeRefunds**](doc//DefaultApi.md#postchargeschargerefunds) | **POST** /v1/charges/{charge}/refunds | -*DefaultApi* | [**postChargesChargeRefundsRefund**](doc//DefaultApi.md#postchargeschargerefundsrefund) | **POST** /v1/charges/{charge}/refunds/{refund} | -*DefaultApi* | [**postCheckoutSessions**](doc//DefaultApi.md#postcheckoutsessions) | **POST** /v1/checkout/sessions | -*DefaultApi* | [**postCoupons**](doc//DefaultApi.md#postcoupons) | **POST** /v1/coupons | -*DefaultApi* | [**postCouponsCoupon**](doc//DefaultApi.md#postcouponscoupon) | **POST** /v1/coupons/{coupon} | -*DefaultApi* | [**postCreditNotes**](doc//DefaultApi.md#postcreditnotes) | **POST** /v1/credit_notes | -*DefaultApi* | [**postCreditNotesId**](doc//DefaultApi.md#postcreditnotesid) | **POST** /v1/credit_notes/{id} | -*DefaultApi* | [**postCreditNotesIdVoid**](doc//DefaultApi.md#postcreditnotesidvoid) | **POST** /v1/credit_notes/{id}/void | -*DefaultApi* | [**postCustomers**](doc//DefaultApi.md#postcustomers) | **POST** /v1/customers | -*DefaultApi* | [**postCustomersCustomer**](doc//DefaultApi.md#postcustomerscustomer) | **POST** /v1/customers/{customer} | -*DefaultApi* | [**postCustomersCustomerBalanceTransactions**](doc//DefaultApi.md#postcustomerscustomerbalancetransactions) | **POST** /v1/customers/{customer}/balance_transactions | -*DefaultApi* | [**postCustomersCustomerBalanceTransactionsTransaction**](doc//DefaultApi.md#postcustomerscustomerbalancetransactionstransaction) | **POST** /v1/customers/{customer}/balance_transactions/{transaction} | -*DefaultApi* | [**postCustomersCustomerBankAccounts**](doc//DefaultApi.md#postcustomerscustomerbankaccounts) | **POST** /v1/customers/{customer}/bank_accounts | -*DefaultApi* | [**postCustomersCustomerBankAccountsId**](doc//DefaultApi.md#postcustomerscustomerbankaccountsid) | **POST** /v1/customers/{customer}/bank_accounts/{id} | -*DefaultApi* | [**postCustomersCustomerBankAccountsIdVerify**](doc//DefaultApi.md#postcustomerscustomerbankaccountsidverify) | **POST** /v1/customers/{customer}/bank_accounts/{id}/verify | -*DefaultApi* | [**postCustomersCustomerCards**](doc//DefaultApi.md#postcustomerscustomercards) | **POST** /v1/customers/{customer}/cards | -*DefaultApi* | [**postCustomersCustomerCardsId**](doc//DefaultApi.md#postcustomerscustomercardsid) | **POST** /v1/customers/{customer}/cards/{id} | -*DefaultApi* | [**postCustomersCustomerSources**](doc//DefaultApi.md#postcustomerscustomersources) | **POST** /v1/customers/{customer}/sources | -*DefaultApi* | [**postCustomersCustomerSourcesId**](doc//DefaultApi.md#postcustomerscustomersourcesid) | **POST** /v1/customers/{customer}/sources/{id} | -*DefaultApi* | [**postCustomersCustomerSourcesIdVerify**](doc//DefaultApi.md#postcustomerscustomersourcesidverify) | **POST** /v1/customers/{customer}/sources/{id}/verify | -*DefaultApi* | [**postCustomersCustomerSubscriptions**](doc//DefaultApi.md#postcustomerscustomersubscriptions) | **POST** /v1/customers/{customer}/subscriptions | -*DefaultApi* | [**postCustomersCustomerSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#postcustomerscustomersubscriptionssubscriptionexposedid) | **POST** /v1/customers/{customer}/subscriptions/{subscription_exposed_id} | -*DefaultApi* | [**postCustomersCustomerTaxIds**](doc//DefaultApi.md#postcustomerscustomertaxids) | **POST** /v1/customers/{customer}/tax_ids | -*DefaultApi* | [**postDisputesDispute**](doc//DefaultApi.md#postdisputesdispute) | **POST** /v1/disputes/{dispute} | -*DefaultApi* | [**postDisputesDisputeClose**](doc//DefaultApi.md#postdisputesdisputeclose) | **POST** /v1/disputes/{dispute}/close | -*DefaultApi* | [**postEphemeralKeys**](doc//DefaultApi.md#postephemeralkeys) | **POST** /v1/ephemeral_keys | -*DefaultApi* | [**postFileLinks**](doc//DefaultApi.md#postfilelinks) | **POST** /v1/file_links | -*DefaultApi* | [**postFileLinksLink**](doc//DefaultApi.md#postfilelinkslink) | **POST** /v1/file_links/{link} | -*DefaultApi* | [**postFiles**](doc//DefaultApi.md#postfiles) | **POST** /v1/files | -*DefaultApi* | [**postInvoiceitems**](doc//DefaultApi.md#postinvoiceitems) | **POST** /v1/invoiceitems | -*DefaultApi* | [**postInvoiceitemsInvoiceitem**](doc//DefaultApi.md#postinvoiceitemsinvoiceitem) | **POST** /v1/invoiceitems/{invoiceitem} | -*DefaultApi* | [**postInvoices**](doc//DefaultApi.md#postinvoices) | **POST** /v1/invoices | -*DefaultApi* | [**postInvoicesInvoice**](doc//DefaultApi.md#postinvoicesinvoice) | **POST** /v1/invoices/{invoice} | -*DefaultApi* | [**postInvoicesInvoiceFinalize**](doc//DefaultApi.md#postinvoicesinvoicefinalize) | **POST** /v1/invoices/{invoice}/finalize | -*DefaultApi* | [**postInvoicesInvoiceMarkUncollectible**](doc//DefaultApi.md#postinvoicesinvoicemarkuncollectible) | **POST** /v1/invoices/{invoice}/mark_uncollectible | -*DefaultApi* | [**postInvoicesInvoicePay**](doc//DefaultApi.md#postinvoicesinvoicepay) | **POST** /v1/invoices/{invoice}/pay | -*DefaultApi* | [**postInvoicesInvoiceSend**](doc//DefaultApi.md#postinvoicesinvoicesend) | **POST** /v1/invoices/{invoice}/send | -*DefaultApi* | [**postInvoicesInvoiceVoid**](doc//DefaultApi.md#postinvoicesinvoicevoid) | **POST** /v1/invoices/{invoice}/void | -*DefaultApi* | [**postIssuingAuthorizationsAuthorization**](doc//DefaultApi.md#postissuingauthorizationsauthorization) | **POST** /v1/issuing/authorizations/{authorization} | -*DefaultApi* | [**postIssuingAuthorizationsAuthorizationApprove**](doc//DefaultApi.md#postissuingauthorizationsauthorizationapprove) | **POST** /v1/issuing/authorizations/{authorization}/approve | -*DefaultApi* | [**postIssuingAuthorizationsAuthorizationDecline**](doc//DefaultApi.md#postissuingauthorizationsauthorizationdecline) | **POST** /v1/issuing/authorizations/{authorization}/decline | -*DefaultApi* | [**postIssuingCardholders**](doc//DefaultApi.md#postissuingcardholders) | **POST** /v1/issuing/cardholders | -*DefaultApi* | [**postIssuingCardholdersCardholder**](doc//DefaultApi.md#postissuingcardholderscardholder) | **POST** /v1/issuing/cardholders/{cardholder} | -*DefaultApi* | [**postIssuingCards**](doc//DefaultApi.md#postissuingcards) | **POST** /v1/issuing/cards | -*DefaultApi* | [**postIssuingCardsCard**](doc//DefaultApi.md#postissuingcardscard) | **POST** /v1/issuing/cards/{card} | -*DefaultApi* | [**postIssuingDisputes**](doc//DefaultApi.md#postissuingdisputes) | **POST** /v1/issuing/disputes | -*DefaultApi* | [**postIssuingDisputesDispute**](doc//DefaultApi.md#postissuingdisputesdispute) | **POST** /v1/issuing/disputes/{dispute} | -*DefaultApi* | [**postIssuingDisputesDisputeSubmit**](doc//DefaultApi.md#postissuingdisputesdisputesubmit) | **POST** /v1/issuing/disputes/{dispute}/submit | -*DefaultApi* | [**postIssuingSettlementsSettlement**](doc//DefaultApi.md#postissuingsettlementssettlement) | **POST** /v1/issuing/settlements/{settlement} | -*DefaultApi* | [**postIssuingTransactionsTransaction**](doc//DefaultApi.md#postissuingtransactionstransaction) | **POST** /v1/issuing/transactions/{transaction} | -*DefaultApi* | [**postOrders**](doc//DefaultApi.md#postorders) | **POST** /v1/orders | -*DefaultApi* | [**postOrdersId**](doc//DefaultApi.md#postordersid) | **POST** /v1/orders/{id} | -*DefaultApi* | [**postOrdersIdPay**](doc//DefaultApi.md#postordersidpay) | **POST** /v1/orders/{id}/pay | -*DefaultApi* | [**postOrdersIdReturns**](doc//DefaultApi.md#postordersidreturns) | **POST** /v1/orders/{id}/returns | -*DefaultApi* | [**postPaymentIntents**](doc//DefaultApi.md#postpaymentintents) | **POST** /v1/payment_intents | -*DefaultApi* | [**postPaymentIntentsIntent**](doc//DefaultApi.md#postpaymentintentsintent) | **POST** /v1/payment_intents/{intent} | -*DefaultApi* | [**postPaymentIntentsIntentCancel**](doc//DefaultApi.md#postpaymentintentsintentcancel) | **POST** /v1/payment_intents/{intent}/cancel | -*DefaultApi* | [**postPaymentIntentsIntentCapture**](doc//DefaultApi.md#postpaymentintentsintentcapture) | **POST** /v1/payment_intents/{intent}/capture | -*DefaultApi* | [**postPaymentIntentsIntentConfirm**](doc//DefaultApi.md#postpaymentintentsintentconfirm) | **POST** /v1/payment_intents/{intent}/confirm | -*DefaultApi* | [**postPaymentMethods**](doc//DefaultApi.md#postpaymentmethods) | **POST** /v1/payment_methods | -*DefaultApi* | [**postPaymentMethodsPaymentMethod**](doc//DefaultApi.md#postpaymentmethodspaymentmethod) | **POST** /v1/payment_methods/{payment_method} | -*DefaultApi* | [**postPaymentMethodsPaymentMethodAttach**](doc//DefaultApi.md#postpaymentmethodspaymentmethodattach) | **POST** /v1/payment_methods/{payment_method}/attach | -*DefaultApi* | [**postPaymentMethodsPaymentMethodDetach**](doc//DefaultApi.md#postpaymentmethodspaymentmethoddetach) | **POST** /v1/payment_methods/{payment_method}/detach | -*DefaultApi* | [**postPayouts**](doc//DefaultApi.md#postpayouts) | **POST** /v1/payouts | -*DefaultApi* | [**postPayoutsPayout**](doc//DefaultApi.md#postpayoutspayout) | **POST** /v1/payouts/{payout} | -*DefaultApi* | [**postPayoutsPayoutCancel**](doc//DefaultApi.md#postpayoutspayoutcancel) | **POST** /v1/payouts/{payout}/cancel | -*DefaultApi* | [**postPayoutsPayoutReverse**](doc//DefaultApi.md#postpayoutspayoutreverse) | **POST** /v1/payouts/{payout}/reverse | -*DefaultApi* | [**postPlans**](doc//DefaultApi.md#postplans) | **POST** /v1/plans | -*DefaultApi* | [**postPlansPlan**](doc//DefaultApi.md#postplansplan) | **POST** /v1/plans/{plan} | -*DefaultApi* | [**postPrices**](doc//DefaultApi.md#postprices) | **POST** /v1/prices | -*DefaultApi* | [**postPricesPrice**](doc//DefaultApi.md#postpricesprice) | **POST** /v1/prices/{price} | -*DefaultApi* | [**postProducts**](doc//DefaultApi.md#postproducts) | **POST** /v1/products | -*DefaultApi* | [**postProductsId**](doc//DefaultApi.md#postproductsid) | **POST** /v1/products/{id} | -*DefaultApi* | [**postPromotionCodes**](doc//DefaultApi.md#postpromotioncodes) | **POST** /v1/promotion_codes | -*DefaultApi* | [**postPromotionCodesPromotionCode**](doc//DefaultApi.md#postpromotioncodespromotioncode) | **POST** /v1/promotion_codes/{promotion_code} | -*DefaultApi* | [**postRadarValueListItems**](doc//DefaultApi.md#postradarvaluelistitems) | **POST** /v1/radar/value_list_items | -*DefaultApi* | [**postRadarValueLists**](doc//DefaultApi.md#postradarvaluelists) | **POST** /v1/radar/value_lists | -*DefaultApi* | [**postRadarValueListsValueList**](doc//DefaultApi.md#postradarvaluelistsvaluelist) | **POST** /v1/radar/value_lists/{value_list} | -*DefaultApi* | [**postRecipients**](doc//DefaultApi.md#postrecipients) | **POST** /v1/recipients | -*DefaultApi* | [**postRecipientsId**](doc//DefaultApi.md#postrecipientsid) | **POST** /v1/recipients/{id} | -*DefaultApi* | [**postRefunds**](doc//DefaultApi.md#postrefunds) | **POST** /v1/refunds | -*DefaultApi* | [**postRefundsRefund**](doc//DefaultApi.md#postrefundsrefund) | **POST** /v1/refunds/{refund} | -*DefaultApi* | [**postReportingReportRuns**](doc//DefaultApi.md#postreportingreportruns) | **POST** /v1/reporting/report_runs | -*DefaultApi* | [**postReviewsReviewApprove**](doc//DefaultApi.md#postreviewsreviewapprove) | **POST** /v1/reviews/{review}/approve | -*DefaultApi* | [**postSetupIntents**](doc//DefaultApi.md#postsetupintents) | **POST** /v1/setup_intents | -*DefaultApi* | [**postSetupIntentsIntent**](doc//DefaultApi.md#postsetupintentsintent) | **POST** /v1/setup_intents/{intent} | -*DefaultApi* | [**postSetupIntentsIntentCancel**](doc//DefaultApi.md#postsetupintentsintentcancel) | **POST** /v1/setup_intents/{intent}/cancel | -*DefaultApi* | [**postSetupIntentsIntentConfirm**](doc//DefaultApi.md#postsetupintentsintentconfirm) | **POST** /v1/setup_intents/{intent}/confirm | -*DefaultApi* | [**postSkus**](doc//DefaultApi.md#postskus) | **POST** /v1/skus | -*DefaultApi* | [**postSkusId**](doc//DefaultApi.md#postskusid) | **POST** /v1/skus/{id} | -*DefaultApi* | [**postSources**](doc//DefaultApi.md#postsources) | **POST** /v1/sources | -*DefaultApi* | [**postSourcesSource**](doc//DefaultApi.md#postsourcessource) | **POST** /v1/sources/{source} | -*DefaultApi* | [**postSourcesSourceVerify**](doc//DefaultApi.md#postsourcessourceverify) | **POST** /v1/sources/{source}/verify | -*DefaultApi* | [**postSubscriptionItems**](doc//DefaultApi.md#postsubscriptionitems) | **POST** /v1/subscription_items | -*DefaultApi* | [**postSubscriptionItemsItem**](doc//DefaultApi.md#postsubscriptionitemsitem) | **POST** /v1/subscription_items/{item} | -*DefaultApi* | [**postSubscriptionItemsSubscriptionItemUsageRecords**](doc//DefaultApi.md#postsubscriptionitemssubscriptionitemusagerecords) | **POST** /v1/subscription_items/{subscription_item}/usage_records | -*DefaultApi* | [**postSubscriptionSchedules**](doc//DefaultApi.md#postsubscriptionschedules) | **POST** /v1/subscription_schedules | -*DefaultApi* | [**postSubscriptionSchedulesSchedule**](doc//DefaultApi.md#postsubscriptionschedulesschedule) | **POST** /v1/subscription_schedules/{schedule} | -*DefaultApi* | [**postSubscriptionSchedulesScheduleCancel**](doc//DefaultApi.md#postsubscriptionschedulesschedulecancel) | **POST** /v1/subscription_schedules/{schedule}/cancel | -*DefaultApi* | [**postSubscriptionSchedulesScheduleRelease**](doc//DefaultApi.md#postsubscriptionschedulesschedulerelease) | **POST** /v1/subscription_schedules/{schedule}/release | -*DefaultApi* | [**postSubscriptions**](doc//DefaultApi.md#postsubscriptions) | **POST** /v1/subscriptions | -*DefaultApi* | [**postSubscriptionsSubscriptionExposedId**](doc//DefaultApi.md#postsubscriptionssubscriptionexposedid) | **POST** /v1/subscriptions/{subscription_exposed_id} | -*DefaultApi* | [**postTaxRates**](doc//DefaultApi.md#posttaxrates) | **POST** /v1/tax_rates | -*DefaultApi* | [**postTaxRatesTaxRate**](doc//DefaultApi.md#posttaxratestaxrate) | **POST** /v1/tax_rates/{tax_rate} | -*DefaultApi* | [**postTerminalConnectionTokens**](doc//DefaultApi.md#postterminalconnectiontokens) | **POST** /v1/terminal/connection_tokens | -*DefaultApi* | [**postTerminalLocations**](doc//DefaultApi.md#postterminallocations) | **POST** /v1/terminal/locations | -*DefaultApi* | [**postTerminalLocationsLocation**](doc//DefaultApi.md#postterminallocationslocation) | **POST** /v1/terminal/locations/{location} | -*DefaultApi* | [**postTerminalReaders**](doc//DefaultApi.md#postterminalreaders) | **POST** /v1/terminal/readers | -*DefaultApi* | [**postTerminalReadersReader**](doc//DefaultApi.md#postterminalreadersreader) | **POST** /v1/terminal/readers/{reader} | -*DefaultApi* | [**postTokens**](doc//DefaultApi.md#posttokens) | **POST** /v1/tokens | -*DefaultApi* | [**postTopups**](doc//DefaultApi.md#posttopups) | **POST** /v1/topups | -*DefaultApi* | [**postTopupsTopup**](doc//DefaultApi.md#posttopupstopup) | **POST** /v1/topups/{topup} | -*DefaultApi* | [**postTopupsTopupCancel**](doc//DefaultApi.md#posttopupstopupcancel) | **POST** /v1/topups/{topup}/cancel | -*DefaultApi* | [**postTransfers**](doc//DefaultApi.md#posttransfers) | **POST** /v1/transfers | -*DefaultApi* | [**postTransfersIdReversals**](doc//DefaultApi.md#posttransfersidreversals) | **POST** /v1/transfers/{id}/reversals | -*DefaultApi* | [**postTransfersTransfer**](doc//DefaultApi.md#posttransferstransfer) | **POST** /v1/transfers/{transfer} | -*DefaultApi* | [**postTransfersTransferReversalsId**](doc//DefaultApi.md#posttransferstransferreversalsid) | **POST** /v1/transfers/{transfer}/reversals/{id} | -*DefaultApi* | [**postWebhookEndpoints**](doc//DefaultApi.md#postwebhookendpoints) | **POST** /v1/webhook_endpoints | -*DefaultApi* | [**postWebhookEndpointsWebhookEndpoint**](doc//DefaultApi.md#postwebhookendpointswebhookendpoint) | **POST** /v1/webhook_endpoints/{webhook_endpoint} | -*DefaultApi* | [**putAccountLogout**](doc//DefaultApi.md#putaccountlogout) | **PUT** /v1/account/logout | -*DefaultApi* | [**putAccountsAccountLogout**](doc//DefaultApi.md#putaccountsaccountlogout) | **PUT** /v1/accounts/{account}/logout | - - -## Documentation For Models - - - [Account](doc//Account.md) - - [AccountBacsDebitPaymentsSettings](doc//AccountBacsDebitPaymentsSettings.md) - - [AccountBrandingSettings](doc//AccountBrandingSettings.md) - - [AccountBusinessProfile](doc//AccountBusinessProfile.md) - - [AccountCapabilities](doc//AccountCapabilities.md) - - [AccountCapabilityRequirements](doc//AccountCapabilityRequirements.md) - - [AccountCardPaymentsSettings](doc//AccountCardPaymentsSettings.md) - - [AccountDashboardSettings](doc//AccountDashboardSettings.md) - - [AccountDeclineChargeOn](doc//AccountDeclineChargeOn.md) - - [AccountLink](doc//AccountLink.md) - - [AccountPaymentsSettings](doc//AccountPaymentsSettings.md) - - [AccountPayoutSettings](doc//AccountPayoutSettings.md) - - [AccountRequirements](doc//AccountRequirements.md) - - [AccountRequirementsError](doc//AccountRequirementsError.md) - - [AccountSepaDebitPaymentsSettings](doc//AccountSepaDebitPaymentsSettings.md) - - [AccountSettings](doc//AccountSettings.md) - - [AccountTosAcceptance](doc//AccountTosAcceptance.md) - - [Address](doc//Address.md) - - [AlipayAccount](doc//AlipayAccount.md) - - [AllPeopleRelationshipSpecs](doc//AllPeopleRelationshipSpecs.md) - - [AllPeopleRelationshipSpecs1](doc//AllPeopleRelationshipSpecs1.md) - - [AllPeopleRelationshipSpecs2](doc//AllPeopleRelationshipSpecs2.md) - - [AllPeopleRelationshipSpecs3](doc//AllPeopleRelationshipSpecs3.md) - - [AllPricesRecurringParams](doc//AllPricesRecurringParams.md) - - [ApiErrors](doc//ApiErrors.md) - - [ApmsSourcesSourceList](doc//ApmsSourcesSourceList.md) - - [ApmsSourcesSourceList1](doc//ApmsSourcesSourceList1.md) - - [ApmsSourcesSourceTransactionList](doc//ApmsSourcesSourceTransactionList.md) - - [ApplePayDomain](doc//ApplePayDomain.md) - - [ApplePayDomainList](doc//ApplePayDomainList.md) - - [Application](doc//Application.md) - - [ApplicationFee](doc//ApplicationFee.md) - - [Balance](doc//Balance.md) - - [BalanceAmount](doc//BalanceAmount.md) - - [BalanceAmountBySourceType](doc//BalanceAmountBySourceType.md) - - [BalanceDetail](doc//BalanceDetail.md) - - [BalanceTransaction](doc//BalanceTransaction.md) - - [BalanceTransactionsList](doc//BalanceTransactionsList.md) - - [BankAccount](doc//BankAccount.md) - - [BankAccountList](doc//BankAccountList.md) - - [BillingDetails](doc//BillingDetails.md) - - [BillingPortalConfiguration](doc//BillingPortalConfiguration.md) - - [BillingPortalSession](doc//BillingPortalSession.md) - - [BitcoinReceiver](doc//BitcoinReceiver.md) - - [BitcoinTransaction](doc//BitcoinTransaction.md) - - [BitcoinTransactionList](doc//BitcoinTransactionList.md) - - [BitcoinTransactionList1](doc//BitcoinTransactionList1.md) - - [Capability](doc//Capability.md) - - [Card](doc//Card.md) - - [CardGeneratedFromPaymentMethodDetails](doc//CardGeneratedFromPaymentMethodDetails.md) - - [CardList](doc//CardList.md) - - [CardList1](doc//CardList1.md) - - [Charge](doc//Charge.md) - - [ChargeFraudDetails](doc//ChargeFraudDetails.md) - - [ChargeOutcome](doc//ChargeOutcome.md) - - [ChargeTransferData](doc//ChargeTransferData.md) - - [CheckoutSession](doc//CheckoutSession.md) - - [ConnectCollectionTransfer](doc//ConnectCollectionTransfer.md) - - [CountrySpec](doc//CountrySpec.md) - - [CountrySpecVerificationFieldDetails](doc//CountrySpecVerificationFieldDetails.md) - - [CountrySpecVerificationFields](doc//CountrySpecVerificationFields.md) - - [Coupon](doc//Coupon.md) - - [CouponAppliesTo](doc//CouponAppliesTo.md) - - [CreditNote](doc//CreditNote.md) - - [CreditNoteLineItem](doc//CreditNoteLineItem.md) - - [CreditNoteLineItemParams](doc//CreditNoteLineItemParams.md) - - [CreditNoteLinesList](doc//CreditNoteLinesList.md) - - [CreditNoteLinesList1](doc//CreditNoteLinesList1.md) - - [CreditNoteTaxAmount](doc//CreditNoteTaxAmount.md) - - [CreditNotesList](doc//CreditNotesList.md) - - [Customer](doc//Customer.md) - - [CustomerAcceptance](doc//CustomerAcceptance.md) - - [CustomerBalanceTransaction](doc//CustomerBalanceTransaction.md) - - [CustomerBalanceTransactionList](doc//CustomerBalanceTransactionList.md) - - [DeletedAccount](doc//DeletedAccount.md) - - [DeletedAlipayAccount](doc//DeletedAlipayAccount.md) - - [DeletedApplePayDomain](doc//DeletedApplePayDomain.md) - - [DeletedBankAccount](doc//DeletedBankAccount.md) - - [DeletedBitcoinReceiver](doc//DeletedBitcoinReceiver.md) - - [DeletedCard](doc//DeletedCard.md) - - [DeletedCoupon](doc//DeletedCoupon.md) - - [DeletedCustomer](doc//DeletedCustomer.md) - - [DeletedDiscount](doc//DeletedDiscount.md) - - [DeletedExternalAccount](doc//DeletedExternalAccount.md) - - [DeletedInvoice](doc//DeletedInvoice.md) - - [DeletedInvoiceitem](doc//DeletedInvoiceitem.md) - - [DeletedPaymentSource](doc//DeletedPaymentSource.md) - - [DeletedPerson](doc//DeletedPerson.md) - - [DeletedPlan](doc//DeletedPlan.md) - - [DeletedPrice](doc//DeletedPrice.md) - - [DeletedProduct](doc//DeletedProduct.md) - - [DeletedRadarValueList](doc//DeletedRadarValueList.md) - - [DeletedRadarValueListItem](doc//DeletedRadarValueListItem.md) - - [DeletedRecipient](doc//DeletedRecipient.md) - - [DeletedSku](doc//DeletedSku.md) - - [DeletedSubscriptionItem](doc//DeletedSubscriptionItem.md) - - [DeletedTaxId](doc//DeletedTaxId.md) - - [DeletedTerminalLocation](doc//DeletedTerminalLocation.md) - - [DeletedTerminalReader](doc//DeletedTerminalReader.md) - - [DeletedWebhookEndpoint](doc//DeletedWebhookEndpoint.md) - - [DeliveryEstimate](doc//DeliveryEstimate.md) - - [Discount](doc//Discount.md) - - [DiscountsResourceDiscountAmount](doc//DiscountsResourceDiscountAmount.md) - - [Dispute](doc//Dispute.md) - - [DisputeEvidence](doc//DisputeEvidence.md) - - [DisputeEvidenceDetails](doc//DisputeEvidenceDetails.md) - - [EphemeralKey](doc//EphemeralKey.md) - - [Error](doc//Error.md) - - [Event](doc//Event.md) - - [ExchangeRate](doc//ExchangeRate.md) - - [ExternalAccount](doc//ExternalAccount.md) - - [ExternalAccountList](doc//ExternalAccountList.md) - - [ExternalAccountList1](doc//ExternalAccountList1.md) - - [Fee](doc//Fee.md) - - [FeeRefund](doc//FeeRefund.md) - - [FeeRefundList](doc//FeeRefundList.md) - - [FeeRefundList1](doc//FeeRefundList1.md) - - [FileFileLinkList](doc//FileFileLinkList.md) - - [FileLink](doc//FileLink.md) - - [FinancialReportingFinanceReportRunRunParameters](doc//FinancialReportingFinanceReportRunRunParameters.md) - - [FinancialReportingFinanceReportTypeList](doc//FinancialReportingFinanceReportTypeList.md) - - [InlineResponse200](doc//InlineResponse200.md) - - [InlineResponse2001](doc//InlineResponse2001.md) - - [InlineResponse20010](doc//InlineResponse20010.md) - - [InlineResponse20011](doc//InlineResponse20011.md) - - [InlineResponse20012](doc//InlineResponse20012.md) - - [InlineResponse20013](doc//InlineResponse20013.md) - - [InlineResponse20014](doc//InlineResponse20014.md) - - [InlineResponse20015](doc//InlineResponse20015.md) - - [InlineResponse20016](doc//InlineResponse20016.md) - - [InlineResponse20017](doc//InlineResponse20017.md) - - [InlineResponse20018](doc//InlineResponse20018.md) - - [InlineResponse20019](doc//InlineResponse20019.md) - - [InlineResponse2002](doc//InlineResponse2002.md) - - [InlineResponse20020](doc//InlineResponse20020.md) - - [InlineResponse20021](doc//InlineResponse20021.md) - - [InlineResponse20022](doc//InlineResponse20022.md) - - [InlineResponse20023](doc//InlineResponse20023.md) - - [InlineResponse20024](doc//InlineResponse20024.md) - - [InlineResponse20025](doc//InlineResponse20025.md) - - [InlineResponse20026](doc//InlineResponse20026.md) - - [InlineResponse20027](doc//InlineResponse20027.md) - - [InlineResponse20028](doc//InlineResponse20028.md) - - [InlineResponse20029](doc//InlineResponse20029.md) - - [InlineResponse2003](doc//InlineResponse2003.md) - - [InlineResponse20030](doc//InlineResponse20030.md) - - [InlineResponse20031](doc//InlineResponse20031.md) - - [InlineResponse20032](doc//InlineResponse20032.md) - - [InlineResponse20033](doc//InlineResponse20033.md) - - [InlineResponse20034](doc//InlineResponse20034.md) - - [InlineResponse20035](doc//InlineResponse20035.md) - - [InlineResponse20036](doc//InlineResponse20036.md) - - [InlineResponse2004](doc//InlineResponse2004.md) - - [InlineResponse2005](doc//InlineResponse2005.md) - - [InlineResponse2006](doc//InlineResponse2006.md) - - [InlineResponse2007](doc//InlineResponse2007.md) - - [InlineResponse2008](doc//InlineResponse2008.md) - - [InlineResponse2009](doc//InlineResponse2009.md) - - [Inventory](doc//Inventory.md) - - [Invoice](doc//Invoice.md) - - [InvoiceItemPreviewParams](doc//InvoiceItemPreviewParams.md) - - [InvoiceItemThresholdReason](doc//InvoiceItemThresholdReason.md) - - [InvoiceLineItemPeriod](doc//InvoiceLineItemPeriod.md) - - [InvoiceLinesList](doc//InvoiceLinesList.md) - - [InvoiceLinesList1](doc//InvoiceLinesList1.md) - - [InvoicePaymentMethodOptionsBancontact](doc//InvoicePaymentMethodOptionsBancontact.md) - - [InvoicePaymentMethodOptionsCard](doc//InvoicePaymentMethodOptionsCard.md) - - [InvoiceSettingCustomField](doc//InvoiceSettingCustomField.md) - - [InvoiceSettingCustomerSetting](doc//InvoiceSettingCustomerSetting.md) - - [InvoiceSettingSubscriptionScheduleSetting](doc//InvoiceSettingSubscriptionScheduleSetting.md) - - [InvoiceTaxAmount](doc//InvoiceTaxAmount.md) - - [InvoiceThresholdReason](doc//InvoiceThresholdReason.md) - - [InvoiceTransferData](doc//InvoiceTransferData.md) - - [Invoiceitem](doc//Invoiceitem.md) - - [InvoicesList](doc//InvoicesList.md) - - [InvoicesPaymentMethodOptions](doc//InvoicesPaymentMethodOptions.md) - - [InvoicesPaymentSettings](doc//InvoicesPaymentSettings.md) - - [InvoicesResourceInvoiceTaxId](doc//InvoicesResourceInvoiceTaxId.md) - - [InvoicesStatusTransitions](doc//InvoicesStatusTransitions.md) - - [IssuerFraudRecord](doc//IssuerFraudRecord.md) - - [IssuingAuthorization](doc//IssuingAuthorization.md) - - [IssuingAuthorizationAmountDetails](doc//IssuingAuthorizationAmountDetails.md) - - [IssuingAuthorizationMerchantData](doc//IssuingAuthorizationMerchantData.md) - - [IssuingAuthorizationPendingRequest](doc//IssuingAuthorizationPendingRequest.md) - - [IssuingAuthorizationRequest](doc//IssuingAuthorizationRequest.md) - - [IssuingAuthorizationVerificationData](doc//IssuingAuthorizationVerificationData.md) - - [IssuingCard](doc//IssuingCard.md) - - [IssuingCardAuthorizationControls](doc//IssuingCardAuthorizationControls.md) - - [IssuingCardShipping](doc//IssuingCardShipping.md) - - [IssuingCardSpendingLimit](doc//IssuingCardSpendingLimit.md) - - [IssuingCardholder](doc//IssuingCardholder.md) - - [IssuingCardholderAddress](doc//IssuingCardholderAddress.md) - - [IssuingCardholderAuthorizationControls](doc//IssuingCardholderAuthorizationControls.md) - - [IssuingCardholderCompany](doc//IssuingCardholderCompany.md) - - [IssuingCardholderIdDocument](doc//IssuingCardholderIdDocument.md) - - [IssuingCardholderIndividual](doc//IssuingCardholderIndividual.md) - - [IssuingCardholderIndividualDob](doc//IssuingCardholderIndividualDob.md) - - [IssuingCardholderRequirements](doc//IssuingCardholderRequirements.md) - - [IssuingCardholderSpendingLimit](doc//IssuingCardholderSpendingLimit.md) - - [IssuingCardholderVerification](doc//IssuingCardholderVerification.md) - - [IssuingDispute](doc//IssuingDispute.md) - - [IssuingDisputeCanceledEvidence](doc//IssuingDisputeCanceledEvidence.md) - - [IssuingDisputeDuplicateEvidence](doc//IssuingDisputeDuplicateEvidence.md) - - [IssuingDisputeEvidence](doc//IssuingDisputeEvidence.md) - - [IssuingDisputeFraudulentEvidence](doc//IssuingDisputeFraudulentEvidence.md) - - [IssuingDisputeList](doc//IssuingDisputeList.md) - - [IssuingDisputeMerchandiseNotAsDescribedEvidence](doc//IssuingDisputeMerchandiseNotAsDescribedEvidence.md) - - [IssuingDisputeNotReceivedEvidence](doc//IssuingDisputeNotReceivedEvidence.md) - - [IssuingDisputeOtherEvidence](doc//IssuingDisputeOtherEvidence.md) - - [IssuingDisputeServiceNotAsDescribedEvidence](doc//IssuingDisputeServiceNotAsDescribedEvidence.md) - - [IssuingSettlement](doc//IssuingSettlement.md) - - [IssuingTransaction](doc//IssuingTransaction.md) - - [IssuingTransactionAmountDetails](doc//IssuingTransactionAmountDetails.md) - - [IssuingTransactionFlightData](doc//IssuingTransactionFlightData.md) - - [IssuingTransactionFlightDataLeg](doc//IssuingTransactionFlightDataLeg.md) - - [IssuingTransactionFuelData](doc//IssuingTransactionFuelData.md) - - [IssuingTransactionLodgingData](doc//IssuingTransactionLodgingData.md) - - [IssuingTransactionPurchaseDetails](doc//IssuingTransactionPurchaseDetails.md) - - [IssuingTransactionReceiptData](doc//IssuingTransactionReceiptData.md) - - [Item](doc//Item.md) - - [LegalEntityCompany](doc//LegalEntityCompany.md) - - [LegalEntityCompanyVerification](doc//LegalEntityCompanyVerification.md) - - [LegalEntityCompanyVerificationDocument](doc//LegalEntityCompanyVerificationDocument.md) - - [LegalEntityDob](doc//LegalEntityDob.md) - - [LegalEntityJapanAddress](doc//LegalEntityJapanAddress.md) - - [LegalEntityPersonVerification](doc//LegalEntityPersonVerification.md) - - [LegalEntityPersonVerificationDocument](doc//LegalEntityPersonVerificationDocument.md) - - [LineItem](doc//LineItem.md) - - [LineItemsDiscountAmount](doc//LineItemsDiscountAmount.md) - - [LineItemsTaxAmount](doc//LineItemsTaxAmount.md) - - [ListAccountCapability](doc//ListAccountCapability.md) - - [LoginLink](doc//LoginLink.md) - - [Mandate](doc//Mandate.md) - - [MandateAuBecsDebit](doc//MandateAuBecsDebit.md) - - [MandateBacsDebit](doc//MandateBacsDebit.md) - - [MandatePaymentMethodDetails](doc//MandatePaymentMethodDetails.md) - - [MandateSepaDebit](doc//MandateSepaDebit.md) - - [MandateSingleUse](doc//MandateSingleUse.md) - - [ModelFile](doc//ModelFile.md) - - [ModelSource](doc//ModelSource.md) - - [Networks](doc//Networks.md) - - [NotificationEventData](doc//NotificationEventData.md) - - [NotificationEventList](doc//NotificationEventList.md) - - [NotificationEventRequest](doc//NotificationEventRequest.md) - - [OneTimePriceData](doc//OneTimePriceData.md) - - [OnlineAcceptance](doc//OnlineAcceptance.md) - - [Order](doc//Order.md) - - [OrderItem](doc//OrderItem.md) - - [OrderReturn](doc//OrderReturn.md) - - [OrderTimestampSpecs](doc//OrderTimestampSpecs.md) - - [OrdersResourceOrderReturnList](doc//OrdersResourceOrderReturnList.md) - - [PackageDimensions](doc//PackageDimensions.md) - - [PaymentFlowsPaymentIntentList](doc//PaymentFlowsPaymentIntentList.md) - - [PaymentFlowsPaymentIntentResourceChargeList](doc//PaymentFlowsPaymentIntentResourceChargeList.md) - - [PaymentFlowsPaymentMethodList](doc//PaymentFlowsPaymentMethodList.md) - - [PaymentFlowsPrivatePaymentMethodsAlipayDetails](doc//PaymentFlowsPrivatePaymentMethodsAlipayDetails.md) - - [PaymentFlowsSetupIntentList](doc//PaymentFlowsSetupIntentList.md) - - [PaymentFlowsSetupIntentSetupAttemptList](doc//PaymentFlowsSetupIntentSetupAttemptList.md) - - [PaymentIntent](doc//PaymentIntent.md) - - [PaymentIntentNextAction](doc//PaymentIntentNextAction.md) - - [PaymentIntentNextActionAlipayHandleRedirect](doc//PaymentIntentNextActionAlipayHandleRedirect.md) - - [PaymentIntentNextActionDisplayOxxoDetails](doc//PaymentIntentNextActionDisplayOxxoDetails.md) - - [PaymentIntentNextActionRedirectToUrl](doc//PaymentIntentNextActionRedirectToUrl.md) - - [PaymentIntentPaymentMethodOptions](doc//PaymentIntentPaymentMethodOptions.md) - - [PaymentIntentPaymentMethodOptionsCard](doc//PaymentIntentPaymentMethodOptionsCard.md) - - [PaymentIntentPaymentMethodOptionsSepaDebit](doc//PaymentIntentPaymentMethodOptionsSepaDebit.md) - - [PaymentMethod](doc//PaymentMethod.md) - - [PaymentMethodAuBecsDebit](doc//PaymentMethodAuBecsDebit.md) - - [PaymentMethodBacsDebit](doc//PaymentMethodBacsDebit.md) - - [PaymentMethodCard](doc//PaymentMethodCard.md) - - [PaymentMethodCardChecks](doc//PaymentMethodCardChecks.md) - - [PaymentMethodCardGeneratedCard](doc//PaymentMethodCardGeneratedCard.md) - - [PaymentMethodCardWallet](doc//PaymentMethodCardWallet.md) - - [PaymentMethodCardWalletMasterpass](doc//PaymentMethodCardWalletMasterpass.md) - - [PaymentMethodCardWalletVisaCheckout](doc//PaymentMethodCardWalletVisaCheckout.md) - - [PaymentMethodDetails](doc//PaymentMethodDetails.md) - - [PaymentMethodDetailsAchCreditTransfer](doc//PaymentMethodDetailsAchCreditTransfer.md) - - [PaymentMethodDetailsAchDebit](doc//PaymentMethodDetailsAchDebit.md) - - [PaymentMethodDetailsAuBecsDebit](doc//PaymentMethodDetailsAuBecsDebit.md) - - [PaymentMethodDetailsBacsDebit](doc//PaymentMethodDetailsBacsDebit.md) - - [PaymentMethodDetailsBancontact](doc//PaymentMethodDetailsBancontact.md) - - [PaymentMethodDetailsCard](doc//PaymentMethodDetailsCard.md) - - [PaymentMethodDetailsCardChecks](doc//PaymentMethodDetailsCardChecks.md) - - [PaymentMethodDetailsCardInstallments](doc//PaymentMethodDetailsCardInstallments.md) - - [PaymentMethodDetailsCardInstallmentsPlan](doc//PaymentMethodDetailsCardInstallmentsPlan.md) - - [PaymentMethodDetailsCardPresent](doc//PaymentMethodDetailsCardPresent.md) - - [PaymentMethodDetailsCardPresentReceipt](doc//PaymentMethodDetailsCardPresentReceipt.md) - - [PaymentMethodDetailsCardWallet](doc//PaymentMethodDetailsCardWallet.md) - - [PaymentMethodDetailsCardWalletMasterpass](doc//PaymentMethodDetailsCardWalletMasterpass.md) - - [PaymentMethodDetailsCardWalletVisaCheckout](doc//PaymentMethodDetailsCardWalletVisaCheckout.md) - - [PaymentMethodDetailsEps](doc//PaymentMethodDetailsEps.md) - - [PaymentMethodDetailsFpx](doc//PaymentMethodDetailsFpx.md) - - [PaymentMethodDetailsGiropay](doc//PaymentMethodDetailsGiropay.md) - - [PaymentMethodDetailsGrabpay](doc//PaymentMethodDetailsGrabpay.md) - - [PaymentMethodDetailsIdeal](doc//PaymentMethodDetailsIdeal.md) - - [PaymentMethodDetailsInteracPresent](doc//PaymentMethodDetailsInteracPresent.md) - - [PaymentMethodDetailsInteracPresentReceipt](doc//PaymentMethodDetailsInteracPresentReceipt.md) - - [PaymentMethodDetailsMultibanco](doc//PaymentMethodDetailsMultibanco.md) - - [PaymentMethodDetailsOxxo](doc//PaymentMethodDetailsOxxo.md) - - [PaymentMethodDetailsP24](doc//PaymentMethodDetailsP24.md) - - [PaymentMethodDetailsSepaDebit](doc//PaymentMethodDetailsSepaDebit.md) - - [PaymentMethodDetailsSofort](doc//PaymentMethodDetailsSofort.md) - - [PaymentMethodEps](doc//PaymentMethodEps.md) - - [PaymentMethodFpx](doc//PaymentMethodFpx.md) - - [PaymentMethodIdeal](doc//PaymentMethodIdeal.md) - - [PaymentMethodOptionsBancontact](doc//PaymentMethodOptionsBancontact.md) - - [PaymentMethodOptionsCardInstallments](doc//PaymentMethodOptionsCardInstallments.md) - - [PaymentMethodOptionsOxxo](doc//PaymentMethodOptionsOxxo.md) - - [PaymentMethodOptionsSofort](doc//PaymentMethodOptionsSofort.md) - - [PaymentMethodP24](doc//PaymentMethodP24.md) - - [PaymentMethodSepaDebit](doc//PaymentMethodSepaDebit.md) - - [PaymentMethodSofort](doc//PaymentMethodSofort.md) - - [PaymentPagesCheckoutSessionCustomerDetails](doc//PaymentPagesCheckoutSessionCustomerDetails.md) - - [PaymentPagesCheckoutSessionList](doc//PaymentPagesCheckoutSessionList.md) - - [PaymentPagesCheckoutSessionListLineItems](doc//PaymentPagesCheckoutSessionListLineItems.md) - - [PaymentPagesCheckoutSessionListLineItems1](doc//PaymentPagesCheckoutSessionListLineItems1.md) - - [PaymentPagesCheckoutSessionTaxId](doc//PaymentPagesCheckoutSessionTaxId.md) - - [PaymentPagesCheckoutSessionTotalDetails](doc//PaymentPagesCheckoutSessionTotalDetails.md) - - [PaymentPagesCheckoutSessionTotalDetailsResourceBreakdown](doc//PaymentPagesCheckoutSessionTotalDetailsResourceBreakdown.md) - - [PaymentPagesPaymentPageResourcesShippingAddressCollection](doc//PaymentPagesPaymentPageResourcesShippingAddressCollection.md) - - [PaymentSource](doc//PaymentSource.md) - - [Payout](doc//Payout.md) - - [PayoutList](doc//PayoutList.md) - - [Period](doc//Period.md) - - [Period2](doc//Period2.md) - - [Person](doc//Person.md) - - [PersonRelationship](doc//PersonRelationship.md) - - [PersonRequirements](doc//PersonRequirements.md) - - [Plan](doc//Plan.md) - - [PlanList](doc//PlanList.md) - - [PlanTier](doc//PlanTier.md) - - [PlatformTaxFee](doc//PlatformTaxFee.md) - - [PortalBusinessProfile](doc//PortalBusinessProfile.md) - - [PortalCustomerUpdate](doc//PortalCustomerUpdate.md) - - [PortalFeatures](doc//PortalFeatures.md) - - [PortalInvoiceList](doc//PortalInvoiceList.md) - - [PortalPaymentMethodUpdate](doc//PortalPaymentMethodUpdate.md) - - [PortalSubscriptionCancel](doc//PortalSubscriptionCancel.md) - - [PortalSubscriptionUpdate](doc//PortalSubscriptionUpdate.md) - - [PortalSubscriptionUpdateProduct](doc//PortalSubscriptionUpdateProduct.md) - - [Price](doc//Price.md) - - [PriceList](doc//PriceList.md) - - [PriceTier](doc//PriceTier.md) - - [Product](doc//Product.md) - - [PromotionCode](doc//PromotionCode.md) - - [PromotionCodesResourceRestrictions](doc//PromotionCodesResourceRestrictions.md) - - [RadarEarlyFraudWarning](doc//RadarEarlyFraudWarning.md) - - [RadarEarlyFraudWarningList](doc//RadarEarlyFraudWarningList.md) - - [RadarIssuerFraudRecordList](doc//RadarIssuerFraudRecordList.md) - - [RadarListListItemList](doc//RadarListListItemList.md) - - [RadarReviewResourceLocation](doc//RadarReviewResourceLocation.md) - - [RadarReviewResourceSession](doc//RadarReviewResourceSession.md) - - [RadarValueList](doc//RadarValueList.md) - - [RadarValueListItem](doc//RadarValueListItem.md) - - [Recipient](doc//Recipient.md) - - [Recurring](doc//Recurring.md) - - [Refund](doc//Refund.md) - - [RefundList](doc//RefundList.md) - - [RefundList1](doc//RefundList1.md) - - [ReportingReportRun](doc//ReportingReportRun.md) - - [ReportingReportType](doc//ReportingReportType.md) - - [ReserveTransaction](doc//ReserveTransaction.md) - - [Review](doc//Review.md) - - [Rule](doc//Rule.md) - - [ScheduledQueryRun](doc//ScheduledQueryRun.md) - - [SepaDebitGeneratedFrom](doc//SepaDebitGeneratedFrom.md) - - [SetupAttempt](doc//SetupAttempt.md) - - [SetupAttemptPaymentMethodDetails](doc//SetupAttemptPaymentMethodDetails.md) - - [SetupAttemptPaymentMethodDetailsBancontact](doc//SetupAttemptPaymentMethodDetailsBancontact.md) - - [SetupAttemptPaymentMethodDetailsCard](doc//SetupAttemptPaymentMethodDetailsCard.md) - - [SetupAttemptPaymentMethodDetailsCardPresent](doc//SetupAttemptPaymentMethodDetailsCardPresent.md) - - [SetupAttemptPaymentMethodDetailsIdeal](doc//SetupAttemptPaymentMethodDetailsIdeal.md) - - [SetupAttemptPaymentMethodDetailsSofort](doc//SetupAttemptPaymentMethodDetailsSofort.md) - - [SetupIntent](doc//SetupIntent.md) - - [SetupIntentNextAction](doc//SetupIntentNextAction.md) - - [SetupIntentNextActionRedirectToUrl](doc//SetupIntentNextActionRedirectToUrl.md) - - [SetupIntentPaymentMethodOptions](doc//SetupIntentPaymentMethodOptions.md) - - [SetupIntentPaymentMethodOptionsCard](doc//SetupIntentPaymentMethodOptionsCard.md) - - [SetupIntentPaymentMethodOptionsSepaDebit](doc//SetupIntentPaymentMethodOptionsSepaDebit.md) - - [Shipping](doc//Shipping.md) - - [ShippingMethod](doc//ShippingMethod.md) - - [SigmaScheduledQueryRunError](doc//SigmaScheduledQueryRunError.md) - - [Sku](doc//Sku.md) - - [SourceCodeVerificationFlow](doc//SourceCodeVerificationFlow.md) - - [SourceMandateNotification](doc//SourceMandateNotification.md) - - [SourceMandateNotificationAcssDebitData](doc//SourceMandateNotificationAcssDebitData.md) - - [SourceMandateNotificationBacsDebitData](doc//SourceMandateNotificationBacsDebitData.md) - - [SourceMandateNotificationSepaDebitData](doc//SourceMandateNotificationSepaDebitData.md) - - [SourceOrder](doc//SourceOrder.md) - - [SourceOrderItem](doc//SourceOrderItem.md) - - [SourceOwner](doc//SourceOwner.md) - - [SourceReceiverFlow](doc//SourceReceiverFlow.md) - - [SourceRedirectFlow](doc//SourceRedirectFlow.md) - - [SourceTransaction](doc//SourceTransaction.md) - - [SourceTransactionAchCreditTransferData](doc//SourceTransactionAchCreditTransferData.md) - - [SourceTransactionChfCreditTransferData](doc//SourceTransactionChfCreditTransferData.md) - - [SourceTransactionGbpCreditTransferData](doc//SourceTransactionGbpCreditTransferData.md) - - [SourceTransactionPaperCheckData](doc//SourceTransactionPaperCheckData.md) - - [SourceTransactionSepaCreditTransferData](doc//SourceTransactionSepaCreditTransferData.md) - - [SourceTypeAchCreditTransfer](doc//SourceTypeAchCreditTransfer.md) - - [SourceTypeAchDebit](doc//SourceTypeAchDebit.md) - - [SourceTypeAlipay](doc//SourceTypeAlipay.md) - - [SourceTypeAuBecsDebit](doc//SourceTypeAuBecsDebit.md) - - [SourceTypeBancontact](doc//SourceTypeBancontact.md) - - [SourceTypeCard](doc//SourceTypeCard.md) - - [SourceTypeCardPresent](doc//SourceTypeCardPresent.md) - - [SourceTypeEps](doc//SourceTypeEps.md) - - [SourceTypeGiropay](doc//SourceTypeGiropay.md) - - [SourceTypeIdeal](doc//SourceTypeIdeal.md) - - [SourceTypeKlarna](doc//SourceTypeKlarna.md) - - [SourceTypeMultibanco](doc//SourceTypeMultibanco.md) - - [SourceTypeP24](doc//SourceTypeP24.md) - - [SourceTypeSepaDebit](doc//SourceTypeSepaDebit.md) - - [SourceTypeSofort](doc//SourceTypeSofort.md) - - [SourceTypeThreeDSecure](doc//SourceTypeThreeDSecure.md) - - [SourceTypeWechat](doc//SourceTypeWechat.md) - - [StatusTransitions](doc//StatusTransitions.md) - - [Subscription](doc//Subscription.md) - - [SubscriptionBillingThresholds](doc//SubscriptionBillingThresholds.md) - - [SubscriptionItem](doc//SubscriptionItem.md) - - [SubscriptionItemBillingThresholds](doc//SubscriptionItemBillingThresholds.md) - - [SubscriptionItemList](doc//SubscriptionItemList.md) - - [SubscriptionItemUpdateParams](doc//SubscriptionItemUpdateParams.md) - - [SubscriptionList](doc//SubscriptionList.md) - - [SubscriptionList1](doc//SubscriptionList1.md) - - [SubscriptionPendingInvoiceItemInterval](doc//SubscriptionPendingInvoiceItemInterval.md) - - [SubscriptionSchedule](doc//SubscriptionSchedule.md) - - [SubscriptionScheduleAddInvoiceItem](doc//SubscriptionScheduleAddInvoiceItem.md) - - [SubscriptionScheduleConfigurationItem](doc//SubscriptionScheduleConfigurationItem.md) - - [SubscriptionScheduleCurrentPhase](doc//SubscriptionScheduleCurrentPhase.md) - - [SubscriptionSchedulePhaseConfiguration](doc//SubscriptionSchedulePhaseConfiguration.md) - - [SubscriptionSchedulesResourceDefaultSettings](doc//SubscriptionSchedulesResourceDefaultSettings.md) - - [SubscriptionTransferData](doc//SubscriptionTransferData.md) - - [SubscriptionsResourcePauseCollection](doc//SubscriptionsResourcePauseCollection.md) - - [SubscriptionsResourcePendingUpdate](doc//SubscriptionsResourcePendingUpdate.md) - - [TaxDeductedAtSource](doc//TaxDeductedAtSource.md) - - [TaxIDsList](doc//TaxIDsList.md) - - [TaxIDsList1](doc//TaxIDsList1.md) - - [TaxId](doc//TaxId.md) - - [TaxIdVerification](doc//TaxIdVerification.md) - - [TaxRate](doc//TaxRate.md) - - [TerminalConnectionToken](doc//TerminalConnectionToken.md) - - [TerminalLocation](doc//TerminalLocation.md) - - [TerminalLocationLocationList](doc//TerminalLocationLocationList.md) - - [TerminalReader](doc//TerminalReader.md) - - [TerminalReaderRetrieveReader](doc//TerminalReaderRetrieveReader.md) - - [ThreeDSecure](doc//ThreeDSecure.md) - - [ThreeDSecureDetails](doc//ThreeDSecureDetails.md) - - [ThreeDSecureUsage](doc//ThreeDSecureUsage.md) - - [Token](doc//Token.md) - - [Topup](doc//Topup.md) - - [TopupList](doc//TopupList.md) - - [Transfer](doc//Transfer.md) - - [TransferData](doc//TransferData.md) - - [TransferList](doc//TransferList.md) - - [TransferReversal](doc//TransferReversal.md) - - [TransferReversalList](doc//TransferReversalList.md) - - [TransferReversalList1](doc//TransferReversalList1.md) - - [TransferSchedule](doc//TransferSchedule.md) - - [TransformQuantity](doc//TransformQuantity.md) - - [TransformUsage](doc//TransformUsage.md) - - [UsageRecord](doc//UsageRecord.md) - - [UsageRecordSummary](doc//UsageRecordSummary.md) - - [WebhookEndpoint](doc//WebhookEndpoint.md) - - -## Documentation For Authorization - - -## basicAuth - -- **Type**: HTTP Basic authentication - -## bearerAuth - -- **Type**: HTTP Bearer authentication - - -## Author - -dev-platform@stripe.com - - +# stripe_platform_interface