Closed
Description
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.
- Using this method to force the SDK to 18.1.0
- Using this method to resolve bouncycastle conflicts
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
Labels
No labels