Code Monkey home page Code Monkey logo

mek-packages's People

Contributors

brex900 avatar gabm3 avatar kuamanet avatar manuinnz avatar jermaine-uome avatar jacopofranza avatar

Stargazers

myFLO-Developer1 avatar August Emmery avatar Vitalii Vyrodov avatar tony loc avatar  avatar  avatar Danilo Urrutia avatar  avatar  avatar SERDAR PINAR avatar Trong Tran avatar

Watchers

 avatar SERDAR PINAR avatar  avatar

mek-packages's Issues

Error message given by stripe during payment verification

Hi @BreX900

No matter what reason the payment fails, PlatformException is constantly thrown and it does not contain the error message coming from stripe.

I think it is already stated in the codes that this part is not fully verified. As a result of my tests, while it works smoothly on Android devices, we cannot catch the error on iOS devices.

Screenshot 2024-02-14 at 14 58 26

When I catch the error it looks like this

Screenshot 2024-02-14 at 14 54 59

I leave a simple code block so you can reproduce the error. If there is a point I missed and you can help me, I would be very happy.

  Future<void> payment(
    String clientSecret,
  ) async {
    try {
      // insufficient_funds
      terminal?.setSimulatorConfiguration(const SimulatorConfiguration(
          simulatedCard: SimulatedCard.fromTestCardNumber("4000000000009995")));

      PaymentIntent? paymentIntent =
          await terminal?.retrievePaymentIntent(clientSecret);

      PaymentIntent? processablePaymentIntent =
          await terminal?.collectPaymentMethod(paymentIntent!);

      await terminal?.confirmPaymentIntent(processablePaymentIntent!);
    } on TerminalException catch (e) {
      print(e);
    } on PlatformException catch (e) {
      print(e);
    } catch (e) {
      print(e);
    }
  }

mek_stripe_terminal version : 3.2.1
flutter version : 3.16.0

Cannot connect to BBPOS WisePad 3...

Hi @BreX900,
thanks for this library. It looks really cool! However, I'm not able to connect to my BBPOS WisePad 3. I'm using the very simple demo code from below. When using isSimulated: true, everything works as expected. However, when isSimulated: false, the following happens: the reader does appear in the list, when selecting it, I get the bluetooth popup and the reader now beeps and displays the bluetooth icon continuously. However, Connected to reader [...] is never printed, the connectBluetoothReader() method does not seem to return.

Do you have any idea what the problem could be? The properties of the reader say that there's no update available, though I don't know if this would even be set correctly before being fully connected.

Thanks in advance!

pubspec.yaml

name: pos
description: A new Flutter project.
publish_to: 'none'
version: 1.0.0+1

environment:
  sdk: '>=3.1.0 <4.0.0'
dependencies:
  flutter:
    sdk: flutter
  mek_stripe_terminal: ^3.2.1
  permission_handler: ^11.1.0
  stripe: ^4.11.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^2.0.0

flutter:
  uses-material-design: true

main.dart

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:mek_stripe_terminal/mek_stripe_terminal.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:stripe/stripe.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  Terminal? stripeTerminal;

  var _readers = const <Reader>[];

  Stripe stripe = Stripe(
      "[[redacted]]");

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton(
                onPressed: () async {
                  final permissions = [
                    Permission.locationWhenInUse,
                    Permission.bluetooth,
                    Permission.bluetoothScan,
                    Permission.bluetoothConnect,
                  ];
                  await permissions.request();
                  print("Got permissions");
                },
                child: const Text('1. Request Permissions')),
            const Divider(),
            TextButton(
              onPressed: () async {
                stripeTerminal = await Terminal.getInstance(
                  fetchToken: () async {
                    return await createTerminalConnectionToken();
                  },
                );
                print("Initialized Terminal");
              },
              child: const Text('2. Initialize Terminal'),
            ),
            const Divider(),
            TextButton(
              onPressed: () async {
                setState(() => _readers = const <Reader>[]);
                await stripeTerminal
                    ?.setSimulatorConfiguration(const SimulatorConfiguration());
                stripeTerminal
                    ?.discoverReaders(const BluetoothDiscoveryConfiguration(
                        isSimulated: false))
                    .listen((List<Reader> readers) {
                  setState(() => _readers = readers);
                });
              },
              child: const Text('3. Discover Readers'),
            ),
            ListView.builder(
              shrinkWrap: true,
              itemCount: _readers.length,
              itemBuilder: (BuildContext context, int index) {
                final reader = _readers[index];
                return ListTile(
                  title: Text(reader.serialNumber),
                  subtitle: Text(reader.batteryStatus.toString()),
                  onTap: () async {
                    try {
                      print('Connecting to reader ${reader.serialNumber}...');
                      await stripeTerminal?.connectBluetoothReader(reader,
                          locationId: "[[redacted]]");
                      print('Connected to reader ${reader.serialNumber}');
                    } catch (error, stackTrace) {
                      print('$error\n$stackTrace');
                    }
                  },
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }

  Future<String> createTerminalConnectionToken() async {
    try {
      final terminalToken =
          await stripe.client.post('/terminal/connection_tokens');
      print(jsonEncode(terminalToken));
      return terminalToken['secret'] as String;
    } catch (error, stackTrace) {
      print('$error\n$stackTrace');
      rethrow;
    }
  }
}

PlatformException - Failed to generate key pair

Thanks for the great package!

I developed a simple demo app using this plugin. But while it works fine on Android 12 and above devices, I get the following error on an Android 11 device.

Fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: PlatformException(error, Failed to generate key pair, null, java.security.ProviderException: Failed to generate key pair
	at android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.generateKeystoreKeyPair(AndroidKeyStoreKeyPairGeneratorSpi.java:515)
	at android.security.keystore.AndroidKeyStoreKeyPairGeneratorSpi.generateKeyPair(AndroidKeyStoreKeyPairGeneratorSpi.java:471)
	at java.security.KeyPairGenerator$Delegate.generateKeyPair(KeyPairGenerator.java:727)
	at java.security.KeyPairGenerator.genKeyPair(KeyPairGenerator.java:497)
	at com.stripe.cots.common.compatibility.PreFlightChecks.initialize(Unknown Source:87)
	at com.stripe.stripeterminal.internal.common.adapter.CotsClient.initializeKeys(Unknown Source:2)
	at com.stripe.stripeterminal.internal.common.adapter.CotsAdapter.initKeystore(Unknown Source:2)
	at com.stripe.stripeterminal.Terminal$Companion.initTerminal(SourceFile:3)
	at com.stripe.stripeterminal.Terminal$Companion.initTerminal(SourceFile:2)
	at s6.c.g(Unknown Source:109)
	at t6.m1$b.b(Unknown Source:393)
	at t6.m1$b.a(Unknown Source:0)
	at t6.l1.a(Unknown Source:2)
	at k4.j$a.a(Unknown Source:17)
	at c4.c.l(Unknown Source:18)
	at c4.c.m(Unknown Source:40)
	at c4.c.i(Unknown Source:0)
	at c4.b.run(Unknown Source:12)
	at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:223)
	at android.app.ActivityThread.main(ActivityThread.java:7664)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.security.KeyStoreException: Unknown error
	at android.security.KeyStore.getKeyStoreException(KeyStore.java:1301)
	... 25 more
)
       at StandardMethodCodec.decodeEnvelope(message_codecs.dart:651)
       at MethodChannel._invokeMethod(platform_channel.dart:322)
       at _$TerminalPlatform.init(terminal_platform.api.dart:27)
       at Terminal.getInstance.<fn>(terminal.dart:52)
       at _HomeViewState._initTerminal(home.dart:102)

Device informations

Screenshot 2023-12-27 at 12 57 25

pubspec.yaml

description: A new Flutter project.

publish_to: "none"

version: 1.0.0+2

environment:
  sdk: ">=3.0.0 <4.0.0"

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2
  mek_stripe_terminal: ^3.2.0
  stripe:
    git:
      url: https://github.com/enyo/stripe-dart
  permission_handler: ^11.1.0
  shared_preferences: ^2.2.2
  intl: ^0.19.0
  firebase_core: ^2.24.2
  firebase_crashlytics: ^3.4.8

dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_lints: ^2.0.0

flutter:
  uses-material-design: true

project/build.gradle

buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:8.1.3'
        // START: FlutterFire Configuration
        classpath 'com.google.gms:google-services:4.4.0'
        // END: FlutterFire Configuration
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

project/app/build.gradle

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'
// START: FlutterFire Configuration
apply plugin: 'com.google.gms.google-services'
// END: FlutterFire Configuration
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdk 34 // flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    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.companyname.mek_test.mek_test"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
        minSdkVersion 26
        targetSdkVersion flutter.targetSdkVersion
        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
        }
    }
    namespace 'com.companyname.mek_test.mek_test'
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

The error occurs during the process of initializing our app's Stripe Terminal SDK.

  final terminal = await Terminal.getInstance(
    fetchToken: _fetchConnectionToken,
  );
  Future<String> _fetchConnectionToken() async {
    var token = await _api.createTerminalConnectionToken();
    return token;
  }
  Future<String> createTerminalConnectionToken() async {
    try {
      final terminalToken =
          await _stripe.client.post('/terminal/connection_tokens');
      return terminalToken['secret'] as String;
    } catch (error) {
      rethrow;
    }
  }

Flutter version: 3.16.0 (stable channel)
mek_stripe_terminal: ^3.2.0

I would like to know if there are any suggestions or updates to resolve this issue. I'm also wondering if other users are experiencing this issue and if there is a potential workaround.

discoverReaders ios bug

discoverReaders(configuration).listen((readers) {

});

IOS After 2-3 calls it doesn’t find any more readers
on Android everything is fine

clientsecret

hi there
when create a paymentintent then clientsecret already null. how can i get clientsecret ? thanks

Some issues about update device, lost connect and reconnect

Hi @BreX900, thanks for this lib. I'm encountering a few issues while using your SDK:

Can you guide me on how to identify if an M2 device has a new update available?
To update the M2 device, we would use the function installAvailableUpdate(), correct? After using this function, how can we listen for events that indicate the device update completion?
How can we determine which M2 device have lost connection, and what is the process for reconnecting it?
I hope you can help explain these issues I'm facing.

Thanks

Execution failed for task ':app:minifyReleaseWithR8'

Hi,
Whenever try to build release apk that time showing error like this :
can you please help me

ERROR: Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in /home/user/StudioProjects/mek_stripe_terminal_build_gen/build/app/outputs/mapping/release/missing_rules.txt.

ERROR: R8: Missing class com.google.android.play.core.splitcompat.SplitCompatApplication (referenced from: void io.flutter.app.FlutterPlayStoreSplitApplication.() and 5 other contexts)
Missing class com.google.android.play.core.splitinstall.SplitInstallException (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.lambda$installDeferredComponent$1(int, java.lang.String, java.lang.Exception))
Missing class com.google.android.play.core.splitinstall.SplitInstallManager (referenced from: com.google.android.play.core.splitinstall.SplitInstallManager io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.splitInstallManager and 5 other contexts)
Missing class com.google.android.play.core.splitinstall.SplitInstallManagerFactory (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.(android.content.Context, io.flutter.embedding.engine.FlutterJNI))
Missing class com.google.android.play.core.splitinstall.SplitInstallRequest$Builder (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.installDeferredComponent(int, java.lang.String))
Missing class com.google.android.play.core.splitinstall.SplitInstallRequest (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.installDeferredComponent(int, java.lang.String))
Missing class com.google.android.play.core.splitinstall.SplitInstallSessionState (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager$FeatureInstallStateUpdatedListener.onStateUpdate(com.google.android.play.core.splitinstall.SplitInstallSessionState) and 1 other context)
Missing class com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.(android.content.Context, io.flutter.embedding.engine.FlutterJNI) and 2 other contexts)
Missing class com.google.android.play.core.tasks.OnFailureListener (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.installDeferredComponent(int, java.lang.String))
Missing class com.google.android.play.core.tasks.OnSuccessListener (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.installDeferredComponent(int, java.lang.String))
Missing class com.google.android.play.core.tasks.Task (referenced from: void io.flutter.embedding.engine.deferredcomponents.PlayStoreDeferredComponentManager.installDeferredComponent(int, java.lang.String) and 1 other context)
Missing class java.beans.ConstructorProperties (referenced from: void com.fasterxml.jackson.databind.ext.Java7SupportImpl.() and 2 other contexts)
Missing class java.beans.Transient (referenced from: void com.fasterxml.jackson.databind.ext.Java7SupportImpl.() and 1 other context)
Missing class org.slf4j.impl.StaticLoggerBinder (referenced from: void org.slf4j.LoggerFactory.bind() and 3 other contexts)
Missing class org.slf4j.impl.StaticMDCBinder (referenced from: org.slf4j.spi.MDCAdapter org.slf4j.MDC.bwCompatibleGetMDCAdapterFromBinder())

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:minifyReleaseWithR8'.

A failure occurred while executing com.android.build.gradle.internal.tasks.R8Task$R8Runnable
Compilation failed to complete

Invalid Required Parameter of iOS when trying to collectionPaymentMethod on (via Mobile Reader)

I am getting an invalidateRequiredParameter error on the Terminal.collectPaymentMethod() only on iOS.

Android is working as expected.

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: TerminalException: invalidRequiredParameter
A required parameter was invalid or missing.
#0      TerminalPlatform._throwIfIsHostException (package:mek_stripe_terminal/src/platform/terminal_platform.dart:185:5)
#1      _$TerminalPlatform.startCollectPaymentMethod (package:mek_stripe_terminal/src/platform/terminal_platform.api.dart:288:24)
<asynchronous suspension>
#2      Terminal.collectPaymentMethod.<anonymous closure> (package:mek_stripe_terminal/src/terminal.dart:331:14)

This is the payment intent i am creating server side. and this is the response I'm getting from Stripe.

{
  "object": {
    "id": "pi_xxxxxx",
    "object": "payment_intent",
    "amount": 2120,
    "amount_capturable": 0,
    "amount_details": {
      "tip": {
      }
    },
    "amount_received": 0,
    "application": null,
    "application_fee_amount": null,
    "automatic_payment_methods": {
      "enabled": false
    },
    "canceled_at": null,
    "cancellation_reason": null,
    "capture_method": "automatic",
    "client_secret": "pi_xxxxxxxx",
    "confirmation_method": "automatic",
    "created": 1711836594,
    "currency": "usd",
    "customer": null,
    "description": null,
    "invoice": null,
    "last_payment_error": null,
    "latest_charge": null,
    "livemode": false,
    "metadata": {
      "buyerId": "terminal",
    },
    "next_action": null,
    "on_behalf_of": "acct_1xxxxxxxxx",
    "payment_method": null,
    "payment_method_configuration_details": null,
    "payment_method_options": {
      "card_present": {
        "request_extended_authorization": false,
        "request_incremental_authorization_support": false
      }
    },
    "payment_method_types": [
      "card_present"
    ],
    "processing": null,
    "receipt_email": null,
    "review": null,
    "setup_future_usage": null,
    "shipping": null,
    "source": null,
    "statement_descriptor": null,
    "statement_descriptor_suffix": null,
    "status": "requires_payment_method",
    "transfer_data": {
      "destination": "acct_xxxx"
    },
    "transfer_group": null
  }
}

App crashes when we try to discover Bluetooth devices in IOS Simulator

When I try to discover Bluetooth device in ios simulator, the app crashes with following error code in crash report.
For the discovering local devices it works well. I have also checked the required permission before initializing terminal.

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Termination Reason: SIGNAL 6 
Abort trap: 6 Terminating Process: pos [12533]


Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib        	    0x7ff8376f4202 __pthread_kill + 10
1   libsystem_pthread.dylib       	    0x7ff83774cee6 pthread_kill + 263
2   libsystem_c.dylib             	    0x7ff800131ef2 __abort + 139
3   libsystem_c.dylib             	    0x7ff800131e67 abort + 145
4   StripeTerminal                	       0x102515a05 -[SCPTerminal validateInfoPlistForDiscoveryConfiguration:].cold.2 + 104
5   StripeTerminal                	       0x1024043b1 -[SCPTerminal validateInfoPlistForDiscoveryConfiguration:] + 188
6   StripeTerminal                	       0x102404824 -[SCPTerminal discoverReaders:delegate:completion:] + 87
7   mek_stripe_terminal           	       0x101b97a03 DiscoveryDelegatePlugin.onListen(_:_:) + 515 (DiscoveryDelegatePlugin.swift:40)
8   mek_stripe_terminal           	       0x101bf20db implicit closure #2 in implicit closure #1 in TerminalPlugin.setupDiscoverReaders() + 75 (TerminalPlugin.swift:88)
9   mek_stripe_terminal           	       0x101ba320f closure #1 in DiscoverReadersControllerApi.setHandler(_:_:) + 783 (TerminalApi.swift:254)
10  mek_stripe_terminal           	       0x101ba2405 ControllerHandler.onListen(withArguments:eventSink:) + 149 (TerminalApi.swift:86)
11  mek_stripe_terminal           	       0x101ba254e @objc ControllerHandler.onListen(withArguments:eventSink:) + 222
12  Flutter                       	       0x108def4d4 invocation function for block in SetStreamHandlerMessageHandlerOnChannel(NSObject<FlutterStreamHandler>*, NSString*, NSObject<FlutterBinaryMessenger>*, NSObject<FlutterMethodCodec>*, NSObject<FlutterTaskQueue>*) + 524
13  Flutter                       	       0x1087b0f52 invocation function for block in flutter::PlatformMessageHandlerIos::HandlePlatformMessage(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformMessage, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformMessage>>) + 94
14  libdispatch.dylib             	    0x7ff80013be40 _dispatch_call_block_and_release + 12
15  libdispatch.dylib             	    0x7ff80013d0d9 _dispatch_client_callout + 8
16  libdispatch.dylib             	    0x7ff80014cb86 _dispatch_main_queue_drain + 1330
17  libdispatch.dylib             	    0x7ff80014c646 _dispatch_main_queue_callback_4CF + 31
18  CoreFoundation                	    0x7ff8003b26cc __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
19  CoreFoundation                	    0x7ff8003acfbe __CFRunLoopRun + 2429
20  CoreFoundation                	    0x7ff8003ac264 CFRunLoopRunSpecific + 560
21  GraphicsServices              	    0x7ff809b4024e GSEventRunModal + 139
22  UIKitCore                     	       0x1050827bf -[UIApplication _run] + 994
23  UIKitCore                     	       0x1050875de UIApplicationMain + 123
24  pos                           	       0x1009e186f main + 63 (AppDelegate.swift:5)
25  dyld_sim                      	       0x100ba0384 start_sim + 10
26  dyld                          	       0x10867f41f start + 1903

checked about SIGABRT error happens due to https://developer.apple.com/documentation/xcode/understanding-the-exception-types-in-a-crash-report#EXCCRASH-SIGABRT

Simulator : ios 16.4
Flutter version : 3.13.7
Mek package version : 3.1.1

dongle restarts on readReusableCard()

Hello
I'm using the BBPOS Chipper 2X BT. I connect to it via bluetooth successfully, but once I click a button I use for the method readReusableCard(), nothing happens, not even an error log is displayed.
Is it possible to track the error?
Once the dongle is connected it should be able to read the debt card on the dongle?
thanks a lot

[iOS Tap To Pay] This feature is currently not available for the selected reader.

First and foremost, thank you for such an excellent product!

I'm having a problem with Tap to Pay on iOS.
Could you please assist me in figuring it out?

On Android, everything works.
Apple granted me permission to utilize the ProximityReader APIs.
The project appears to be correctly set up. I created project.entitlements added "com.apple.developer.proximity-reader.payment.acceptance" to the project.entitlements and added the full path in Code Signing Entitlements.
To be sure that I have all the permissions and that I set the project well, I installed the official Stripe iOS SDK, and Tap to Pay works on exact same device (tested SDK versions 3.0.0 and 2.23.1)

Log:

2023-09-14 12:50:18.813753+0200 Runner[3779:1281223] Metal API Validation Enabled 2023-09-14 12:50:19.291982+0200 Runner[3779:1281223] [VERBOSE-2:FlutterDarwinContextMetalImpeller.mm(37)] Using the Impeller rendering backend. 2023-09-14 12:50:19.373268+0200 Runner[3779:1281644] flutter: The Dart VM service is listening on http://127.0.0.1:55715/3wDt3bh-UNE=/ 2023-09-14 12:50:21.102277+0200 Runner[3779:1281613] [VERBOSE-2:shell.cc(1004)] The 'StripeTerminalHandlers' channel sent a message from native to Flutter on a non-platform thread. Platform channel messages must be sent on the platform thread. Failure to do so may result in data loss or crashes, and must be fixed in the plugin or application code creating that channel. See https://docs.flutter.dev/platform-integration/platform-channels#channels-and-platform-threading for more information. 2023-09-14 12:50:23.066992+0200 Runner[3779:1281609] [ProximityReader] User cancelled 2023-09-14 12:50:30.290732+0200 Runner[3779:1281223] Can't find keyplane that supports type 4 for keyboard iPhone-PortraitTruffle-NumberPad; using 27315_PortraitTruffle_iPhone-Simple-Pad_Default 2023-09-14 12:50:32.787972+0200 Runner[3779:1281617] [VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(, This feature is currently not available for the selected reader., Error Domain=com.stripe-terminal Code=1880 "This feature is currently not available for the selected reader." UserInfo={NSLocalizedDescription=This feature is currently not available for the selected reader., com.stripe-terminal:Message=This feature is currently not available for the selected reader.}, null) #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:652:7) #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:310:18) <asynchronous suspension> #2 _$StripeTerminalPlatform.createPaymentIntent (package:mek_stripe_terminal/src/platform/stripe_terminal_platform.api.dart:214:22) <asynchronous suspension> #3 StripeTerminal.createPaymentIntent (package:mek_stripe_terminal/src/stripe_terminal.dart:288:7) <asynchronous suspension> #4 _TapToPayState._pay (package:shoppingapp/src/sample_feature/tap_to_pay.dart:150:16) <asynchronous suspension>

Code:

import 'dart:convert';
import 'dart:developer';
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:mek_stripe_terminal/mek_stripe_terminal.dart';
import 'package:permission_handler/permission_handler.dart';

class TapToPay extends StatefulWidget {
  const TapToPay({
    super.key,
  });

  static const routeName = '/';

  @override
  State<TapToPay> createState() => _TapToPayState();
}

class _TapToPayState extends State<TapToPay> {
  StripeTerminal? stripeTerminal;
  @override
  void initState() {
    super.initState();
    _init();
  }

  var _readers = [];
  var _amount = 0;
  var _error = "";
  var _isSuccess = false;

  void _init() async {
    setState(() {
      _error = "";
      _isSuccess = false;
    });
    final permissions = [
      Permission.locationWhenInUse,
      Permission.bluetooth,
      if (Platform.isAndroid) ...[
        Permission.bluetoothScan,
        Permission.bluetoothConnect,
      ],
    ];
    await permissions.request();
    stripeTerminal = await StripeTerminal.getInstance(
      fetchToken: getStripeToken,
    );
    stripeTerminal!
        .discoverReaders(
            discoveryMethod: DiscoveryMethod.localMobile, simulated: false)
        .listen((List readers) {
      setState(() => _readers = readers);
      _connectReader();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Padding(
            padding: const EdgeInsets.all(50),
            child: TextField(
              textAlign: TextAlign.center,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Amount',
              ),
              keyboardType: TextInputType.number,
              onChanged: (value) {
                setState(() {
                  _amount = int.parse(value);
                });
              },
            ),
          ),
          const SizedBox(
            height: 20,
          ),
          ElevatedButton(
            style: ElevatedButton.styleFrom(
              backgroundColor: Colors.green, // background
            ),
            onPressed: _pay,
            child: const Text(
              'Pay',
              style: TextStyle(color: Colors.white, fontSize: 20),
            ),
          ),
          const SizedBox(
            height: 50,
          ),
          if (_isSuccess)
            const Text('SUCCESS', style: TextStyle(color: Colors.green)),
          Padding(
            padding: const EdgeInsets.all(20),
            child: Text(
              _error,
              style: const TextStyle(color: Colors.red),
            ),
          ),
        ],
      ),
    );
  }

  Future<String> getStripeToken() async {
    var response = await Dio().get(
        'https://YOUR_BACKEND/getTerminalToken');
    var token = jsonDecode(response.data);
    log(token['secret']);
    return token['secret'];
  }

  _connectReader() async {
    try {
      if (stripeTerminal != null && _readers.isNotEmpty) {
        await stripeTerminal!.connectMobileReader(_readers[0],
            locationId: "YOUR_LOCATION_ID");
      }
    } catch (e) {
      log(e.toString());
      setState(() {
        _error = e.toString();
      });
    }
  }

  void _pay() async {
    setState(() {
      _error = "";
      _isSuccess = false;
    });
    try {
      var pip = PaymentIntentParameters(
          amount: _amount * 100,
          currency: 'usd',
          captureMethod: CaptureMethod.automatic,
          paymentMethodTypes: [
            PaymentMethodType.card,
            PaymentMethodType.cardPresent
          ]);
      var pi = await stripeTerminal!.createPaymentIntent(pip);
      final processablePaymentIntent =
          await stripeTerminal!.collectPaymentMethod(pi);
      final capturablePaymentIntent =
          await stripeTerminal!.processPayment(processablePaymentIntent);
      setState(() {
        _isSuccess = true;
      });
    } on TerminalException catch (e) {
      print(e);
      setState(() {
        _error = e.message!;
      });
    }
  }
}

app bundle error..why ?

hi there

im getting error. but everything is ok.

Unhandled Exception: PlatformException(2900, Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid., Error Domain=com.stripe-terminal Code=2900 "Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid." UserInfo={com.stripe-terminal:ReaderMessage=Error usually caused by an entitlement issue, an invalid application bundle, a configuration issue, or a token issue., NSLocalizedDescription=Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid., com.stripe-terminal:Message=Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid.}, null)

Error on building the app in android emulator, when I add mek_stripe_terminal package.

I added the mek_stripe_terminal: ^3.4.0 on our app in pubspec.yaml, then in the android/app/build.gradle I upgrade the minSdkVersion to 26. But I don't why I'm facing an build failed on emulator but on the ios simulator doesn't have problem. I just follow the readme step on the pub.dev ref: https://pub.dev/packages/mek_stripe_terminal.

Hopefully anyone can answer my issue.

My Java version as of now is OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)

Flutter doctor
image

BUILD ISSUE ON EMULATOR:
image

cancel action

hi. when i start the collectionn on reader and then how can i cancel reader action..

StatementDescriptorSuffix

hi there..how are you..

how can i add StatementDescriptorSuffix on createpayment intent. do you have supportt this ? thankss.

Cancel payment

cancelPaymentIntent does not cancel the payment on the terminal
the device still shows a waiting card

mek_stripe_terminal/StripeTerminalPlugin.swift:255: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Getting fatal error and crash (version 3.0.0-dev.1) during accepting payment method with:

mek_stripe_terminal/StripeTerminalPlugin.swift:255: Fatal error: Unexpectedly found nil while unwrapping an Optional value
mek_stripe_terminal/StripeTerminalPlugin.swift:255: Fatal error: Unexpectedly found nil while unwrapping an Optional value
thread 9, queue = 'com.apple.root.user-initiated-qos.cooperative', stop reason = Fatal error: Unexpectedly found nil while unwrapping an Optional value
frame #0: 0x00000001a6d90818 libswiftCore.dylib_swift_runtime_on_report libswiftCore.dylib:
-> 0x1a6d90818 <+0>: ret
libswiftCore.dylib: 0x1a6d9081c <+0>: b 0x1a6d90818 ; _swift_runtime_on_report libswiftCore.dylib:
0x1a6d90820 <+0>: adrp x8, 376357
0x1a6d90824 <+4>: ldrb w0, [x8, #0x434]
Target 0: (Runner) stopped.

cancelling an active payment

using this mek_stripe_terminal, if you initialize a terminal, generate a payment intent and connect the card reader to usb so its ready for a payment, at this point you cannot call cancelPaymentIntent to stop a payment from going through. when you call cancelPaymentIntent with the paymentintent object, it gets stuck in a loop with an await call.

The operation couldn’t be completed. (mek_stripe_terminal.PlatformError error 1.) when using simulator or test card amounts on iOS.

Am I doing something wrong or is the package not handling simulated declines properly on iOS.

I'm getting the same results using Tap to Pay for all of the following on iOS:

  • Using a Terminal Test Card and physical device
  • Using a simulated device and simulated reader

I've been using the test card amounts listed here to simulate the failures: https://docs.stripe.com/terminal/references/testing#physical-test-cards for the following amounts I'm just seeing a generic failure when calling confirmPaymentIntent():

[log] PlatformException (PlatformException(mek_stripe_terminal.PlatformError:1, The operation couldn’t be completed. (mek_stripe_terminal.PlatformError error 1.), mek_stripe_terminal.PlatformError, null))
[log] #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:651:7)
      #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:334:18)
      <asynchronous suspension>
      #2      _$TerminalPlatform.confirmPaymentIntent (package:mek_stripe_terminal/src/platform/terminal_platform.api.dart:306:22)
      <asynchronous suspension>
      #3      Terminal.confirmPaymentIntent (package:mek_stripe_terminal/src/terminal.dart:368:7)
      <asynchronous suspension>
      #4      PaymentController.build.handlePayment (package:flutterdonate/controllers/payment_controller.dart:111:27)
      <asynchronous suspension>
      #5      _FutureBuilderState._subscribe.<anonymous closure> (package:flutter/src/widgets/async.dart:624:31)
      <asynchronous suspension>

All of these amounts give the error above:

  • 10.01, // Payment is declined with a 'call issuer' code
  • 10.02, // Offline pin required (use 1234)
  • 10.03, // Online/Offline pin required
  • 10.05, // Generic Decline
  • 10.55, // Incorrect Pin
  • 10.65, // Withdrawal amount limit exceeded
  • 10.75, // Pin try exceeded

However the following scenario amount is working as expecting (showing the PIN UI and then succeeding)

  • 10.60, // Online or Offline pin required

When I catch and swallow the PlatformException I can use the terminal to retrieve the the paymentIntent and successfully see that there is a failed charges on there in the charges list but this isn't ideal and doesn't behave like Android does. Android returns a proper TerminalExceptionCode.stripeApiError with a lovely apiError I can parse for a decline message to inform the user.

Essentially it looks like iOS isn't handling simulated scenarios properly with test values (either when simulated or using a physical test card). Is this something other people are finding? Can this be fixed in the package?

Hopefully the stack trace above will help you find the issue but if you need any more information let me know.

After `Terminal.getInstance` is called, subsequent calls do not override the fetch token method

When the Terminal.getInstance() method is called and passed a fetchToken method, subsequent calls to getInstance passing a new fetchToken method, to create new instances of a Terminal do not appear to override the fetchToken method passed in the first call. It appears that the fetchToken method is run a second time in the second getInstance call. However, the fetchToken method is the original method passed, not a new method.

MissingPluginExcepition - Andorid Embedded Board ZC-3566

Hi, i'm trying using this package with a flutter app on an andorid 11 device for TV monitors.
IMG_4660

I used the example and successfully run it on a mobile device (Tablet), now when i try it on this device it return the error No implementatio found for method init on channel mek_stripe_terminal:
IMG_4661

Any solution / workaround ?

Unhandled Exception if selected device is not Google Mobile Services certified

Hi, thanks for the great package!

When testing, I found my Android phone was behind on security updates and triggered this error:

10-05 11:27:50.911 15069 15118 E flutter : [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: TerminalException: localMobileDeviceTampered
10-05 11:27:50.911 15069 15118 E flutter : INTEGRATION_ERROR.LOCAL_MOBILE_DEVICE_TAMPERED: ATTESTATION_FAILURE (req_He0V1ayPubuPsZ): Device is not Google Mobile Services (GMS) certified. If this is incorrect, we recommend that you perform a factory reset or contact your device manufacturer.
10-05 11:27:50.911 15069 15118 E flutter : Message: ATTESTATION_FAILURE (req_He0V1ayPubuPsZ): Device is not Google Mobile Services (GMS) certified. If this is incorrect, we recommend that you perform a factory reset or contact your device manufacturer.
10-05 11:27:50.911 15069 15118 E flutter : com.stripe.stripeterminal.external.models.TerminalException: ATTESTATION_FAILURE (req_He0V1ayPubuPsZ): Device is not Google Mobile Services (GMS) certified. If this is incorrect, we recommend that you perform a factory reset or contact your device manufacturer.

As this error was unhandled I was unable to show any feedback in my app when it occurs. Are you able to update the error handling logic for connectMobileReader in stripe_terminal.dart?

Updating my phone with the latest security updates resolved this error, but without debugging the app, there was no way to see this error message to get an indication that something was wrong.

[PlatformException] "...required providing that Connected Account's ID in SCPLocalMobileConnectionConfiguration""

Hello folks,

Firstly thanks for the hard work on this library. We have it working on Android and soon to push to prod. While testing on iOS we noticed that calling the retrievePaymentIntent(clientSecret) method on the Terminal object returns a PaymentIntent object that omits certain required fields from the initial payment intent created via our backend service.

When attempting to pass that payment intent object to collectPaymentMethod(...) we get the following error:

A required parameter was invalid or missing. Collecting a PaymentMethod for a PaymentIntent on_bahalf_of a Connected Account required providing that Connected Account's ID in SCPLocalMobileConnectionConfiguration

I noticed while digging in this package's codebase I found that these fields have been set to nil in stripe_terminal/ios/Classes/Mappings/PaymentIntentMappings.swift

  • amountCapturable
  • amountReceived
  • applicationFeeAmount
  • clientSecret
  • onBehalfOf

I tried a workaround of instanting a PaymentIntent object while passing those missing values manually using the payment intent object returned from our backend:

PaymentIntent(
  amountCapturable: rawIntent['amount_capturable'),
  onBehalfOf: rawIntent['on_behalf_of'],
 ...
 ...
)

Sadly this did not resolve the issue. Your help including any suggestions would be appreciated.

Thanks so much

Terminal update

Hi @BreX900, thanks for this lib.
Can I ask you to make new methods for simulated updates of terminal and methods for nofying about update process like estimatedUpdateTime

FAILURE: Android Build failed Execution failed for task ':app:mergeDevDebugNativeLibs'

Hello,

Your lib looks really good. Congratulations for all your hard work. However, I have a problem with Android. when I install the lib. I can't compile my project. I keep getting this message. I found this article : but it does not work but i am not sure of the config. I tried to change my gradle version but noting.

Can you help me ?

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.22.3, on macOS 14.3.1 23D60 darwin-arm64, locale fr-FR)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.4)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2023.3)
[✓] VS Code (version 1.91.1)
[✓] Connected device (4 available)
[✓] Network resources

`

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:mergeDevDebugNativeLibs'.

Could not resolve all files for configuration ':app:devDebugRuntimeClasspath'.
Failed to transform jackson-core-2.16.1.jar (com.fasterxml.jackson.core:jackson-core:2.16.1) to match attributes {artifactType=android-jni, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-runtime}.
> Execution failed for JetifyTransform: /Users/vincentboulanger/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.16.1/9456bb3cdd0f79f91a5f730a1b1bb041a380c91f/jackson-core-2.16.1.jar.
> Failed to transform '/Users/vincentboulanger/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.16.1/9456bb3cdd0f79f91a5f730a1b1bb041a380c91f/jackson-core-2.16.1.jar' using Jetifier. Reason: IllegalArgumentException, message: Unsupported class file major version 65. (Run with --stacktrace for more details.)
Suggestions:
- Check out existing issues at https://issuetracker.google.com/issues?q=componentid:460323&s=modified_time:desc, it's possible that this issue has already been filed there.
- If this issue has not been filed, please report it at https://issuetracker.google.com/issues/new?component=460323 (run with --stacktrace and provide a stack trace if possible).

  • Try:

Run with --stacktrace option to get the stack trace.
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.

BUILD FAILED in 51s
`

In Simulated mode Transaction Fails

In Package version 3.1.0 the simualted sechnario for payment processsing is failing with following error

com.stripe.stripeterminal.external.models.TerminalException: This transaction requires a PIN. In testmode, using a physical test card with designated amount ending values produce specific decline responses. See https://stripe.com/docs/terminal/references/testing#physical-test-cards for details.

ApiError(error=InnerError(charge=ch_3O1pmCPx7XPnEVCK05rNOvvO, code=online_or_offline_pin_required, declineCode=online_or_offline_pin_required, docUrl=null, message=This transaction requires a PIN. In testmode, using a physical test card with designated amount ending values produce specific decline responses. See https://stripe.com/docs/terminal/references/testing#physical-test-cards for details., param=null, paymentIntent=PaymentIntent(id=pi_3O1pmCPx7XPnEVCK0P13G5Fk, amount=8103, amountCapturable=0, amountReceived=0, application=null, applicationFeeAmount=0, canceledAt=0, cancellationReason=null, captureMethod=manual, charges=ChargesList(data=[Charge(id=ch_3O1pmCPx7XPnEVCK05rNOvvO, amount=8103, amountRefunded=0, application=null, applicationFee=null, applicationFeeAmount=0, balanceTransaction=null, captured=false, created=1697458810, currency=usd, customer=null, description=null, dispute=null, failureCode=online_or_offline_pin_required, failureMessage=This transaction requires a PIN.

This works properly in an older version 2.1.4
I am connected to a Simulated Chipper2X reader and using isSimulated as true while discovering readers

incompatibleReader

hi mate..
im working your perfect package.. again thank you so much about it.
but when i change the connected reader then im getting incompatibleReader error.

for example. i have. 2 buttons on the widget
First button => Tap to Pay button
Second button => USB Reader button

first when i click the first button everything is ok. then after process when i click to second button then getting error.

every each buttons when click

  1. first disconnect reader
  2. discovery reader
  3. connect to reader

i hope i could explain..

gradle kotlin version error on android build

Hey when i add mek_stripe_terminal in my flutter project, this error is coming when i building it for android

I have tried updating gradle and kotlin but no success , i think i am doing any mistake

Please help it's bet urgent -
cc @kuamanet @ManuInNZ @BreX900 @GabM3 @jacopofranza

My flutter version is
Flutter (Channel stable, 3.22.3, on macOS 14.4.1 23E224 darwin-arm64, locale en-IN

Java version OpenJDK Runtime Environment (build 17.0.11+0-17.0.11b1207.24-11852314)

android/setting.gradle

Screenshot 2024-07-19 at 4 40 48 PM

Screenshot 2024-07-19 at 4 36 12 PM

tap to pay

hi mate.. im trying for tap to pay(iphone).. but im getting error.but every settings is true. can you help. me

Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid., Error Domain=com.stripe-terminal Code=2900 "Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid." UserInfo={com.stripe-terminal:ReaderMessage=Error usually caused by an entitlement issue, an invalid application bundle, a configuration issue, or a token issue., NSLocalizedDescription=Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid., com.stripe-terminal:Message=Operation not permitted. Verify the app has the necessary entitlements and that the application bundle is valid

Cancelling collectPaymentMethod results in an unhandled error and a black screen

I may be doing something wrong here but I am not sure how to handle cancelling the collectPaymentMethod screen that is shown.

Here is my log:

I/flutter (10941): Payment Status Changed: waitingForInput
W/ty.paymintyplus(10941): Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (unsupported, reflection, allowed)
W/ty.paymintyplus(10941): Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (unsupported, reflection, allowed)
I/StripeTerminal(10941): class=TerminalStatusManager message=endPaymentFlow.
D/StripeTerminal(10941): class=ProxyTerminalListener message=onPaymentStatusChange(READY)
E/StripeTerminal(10941): class=TerminalSession
E/StripeTerminal(10941): com.stripe.stripeterminal.external.models.TerminalException: Contactless transaction was canceled
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.adapter.CotsAdapter.collectPaymentMethodHandler(CotsAdapter.kt:172)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.adapter.CotsAdapter.collectPaymentMethod(CotsAdapter.kt:136)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.adapter.ProxyAdapter.collectPaymentMethod(ProxyAdapter.kt:144)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.terminalsession.TerminalSession$CollectPaymentMethodOperation.executeIfNotCanceled(TerminalSession.kt:1297)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.terminalsession.TerminalSession$CancelableOperation.execute(TerminalSession.kt:1058)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.terminalsession.TerminalSession$ExternalOperation.run$terminalsession_release(TerminalSession.kt:1016)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.terminalsession.TerminalSession.enqueueOperation$lambda$6(TerminalSession.kt:875)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.terminalsession.TerminalSession.$r8$lambda$6lM7341_XI6PEqXfOM-yc2U5tkQ(Unknown Source:0)
E/StripeTerminal(10941): 	at com.stripe.stripeterminal.internal.common.terminalsession.TerminalSession$$ExternalSyntheticLambda0.run(Unknown Source:4)
E/StripeTerminal(10941): 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:487)
E/StripeTerminal(10941): 	at java.util.concurrent.FutureTask.run(FutureTask.java:264)
E/StripeTerminal(10941): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
E/StripeTerminal(10941): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
E/StripeTerminal(10941): 	at java.lang.Thread.run(Thread.java:1012)
I/flutter (10941): Payment Status Changed: ready

Advice on how to handle this would be great, thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.