Skip to content

[Android] confirmSetupIntent causes app crash #860

Closed
@abedolinger

Description

@abedolinger

Describe the bug
Using confirmSetupIntent (from the useStripe hook) works on iOS but crashes on Android. On iOS, confirming fails because I'm using a payment sheet (see #859), in case that's relevant. Android crashes on invoking the method.

To Reproduce
Steps to reproduce the behavior:

// initialize payment sheet after receiving setup intent from backend
    const paymentSheetOptions = {
      customerID,
      setupIntentClientSecret,
      allowsDelayedPaymentMethods: true,
      merchantDisplayName: 'merchant',
      style: 'alwaysLight',
      customFlow: true,
    }

    try {
      const initResult = await initPaymentSheet(paymentSheetOptions);

      if (initResult.error) throw initResult.error as unknown;
    } catch (error) {
      console.error('payment sheet init error:', error);
    }

// after getting payment details in the payment sheet
  const { confirmSetupIntent } = useStripe();
  ...
  confirmSetupIntent(setupIntentSecret, { type: 'Card' })
        .then((result) => {
          if (result.error) throw result.error as unknown;
          console.log('setup intent confirmed:', result.setupIntent);
          setSetupIntentConfirmed(true);
        })
        .catch((err) => {
          console.error('setup intent error:', JSON.stringify(err));
          setSetupIntentConfirmed(false);
        });

produces

E/unknown:ReactNative: Exception in native call
    java.lang.RuntimeException: Could not invoke StripeSdk.confirmSetupIntent
        at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:383)
        at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
        at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
        at android.os.Looper.loop(Looper.java:246)
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
        at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151) 
        at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27) 
        at android.os.Looper.loop(Looper.java:246) 
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226) 
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/stripe/android/core/exception/InvalidRequestException;
        at com.reactnativestripesdk.ErrorsKt.createError(Errors.kt:75)
        at com.reactnativestripesdk.StripeSdkModule.confirmSetupIntent(StripeSdkModule.kt:602)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372) 
        at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151) 
        at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27) 
        at android.os.Looper.loop(Looper.java:246) 
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.stripe.android.core.exception.InvalidRequestException" on path: DexPathList[[zip file "/data/app/~~RbEGsoKdRrtuNQmsF3SPjQ==/org.xxxxxxxx.app.development-sLpmCI14MsLml3Frj6RR7Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~RbEGsoKdRrtuNQmsF3SPjQ==/org.xxxxxxxx.app.development-sLpmCI14MsLml3Frj6RR7Q==/lib/arm64, /data/app/~~RbEGsoKdRrtuNQmsF3SPjQ==/org.xxxxxxxx.app.development-sLpmCI14MsLml3Frj6RR7Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.reactnativestripesdk.ErrorsKt.createError(Errors.kt:75) 
        at com.reactnativestripesdk.StripeSdkModule.confirmSetupIntent(StripeSdkModule.kt:602) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372) 
        at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151) 
        at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27) 
        at android.os.Looper.loop(Looper.java:246) 
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226) 

It does not hit the catch block in JS before crashing.

Expected behavior
The setup intent should be confirmed successfully.

Screenshots
n/a

Smartphone (please complete the following information):

  • Device: Samsung Galaxy S10
  • OS: Android 11
  • React Native: 0.64.2
  • Stripe React Native SDK 0.3.0, but with the following mods, as we are not ready for Android 12.

Additional context
After reviewing the code in #859, I'm not sure if the payment sheet will work at all with setup intents. It would be great to know if that's possible.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions