braintree / braintree-android-drop-in

Braintree Drop-In SDK for Android
https://developers.braintreepayments.com/guides/drop-in/android/v2
MIT License
124 stars 79 forks source link

Nonce is already consumed #455

Closed levinzonr closed 3 months ago

levinzonr commented 6 months ago

Braintree SDK Version

6.14.0

Environment

Sandbox

Android Version & Device

Android 14

Braintree dependencies

implementation("com.braintreepayments.api:drop-in:6.14.0")

Describe the bug

When using 3DSecure V2 and Cancelling the Verification flow for a saved card, and choosing the card again, instead of the Verification flow, the SDK responds with the error.

Stacktrace:

ErrorWithResponse (422): Nonce is already consumed
[]
at com.braintreepayments.api.ErrorWithResponse$Companion$CREATOR$1.createFromParcel(ErrorWithResponse.kt:157)
at com.braintreepayments.api.ErrorWithResponse$Companion$CREATOR$1.createFromParcel(ErrorWithResponse.kt:156)
at android.os.Parcel.readParcelableInternal(Parcel.java:4813)
at android.os.Parcel.readValue(Parcel.java:4564)
at android.os.Parcel.readValue(Parcel.java:4347)
at android.os.Parcel.-$$Nest$mreadValue(Unknown Source:0)
at android.os.Parcel$LazyValue.apply(Parcel.java:4442)
at android.os.Parcel$LazyValue.apply(Parcel.java:4401)
at android.os.BaseBundle.getValueAt(BaseBundle.java:394)
at android.os.BaseBundle.getValue(BaseBundle.java:374)
at android.os.BaseBundle.getValue(BaseBundle.java:357)
at android.os.BaseBundle.getValue(BaseBundle.java:350)
at android.os.BaseBundle.getSerializable(BaseBundle.java:1451)
at android.os.Bundle.getSerializable(Bundle.java:1171)
at android.content.Intent.getSerializableExtra(Intent.java:9027)
at com.braintreepayments.api.DropInActivityResultContract.parseResult(DropInActivityResultContract.java:44)
at com.braintreepayments.api.DropInActivityResultContract.parseResult(DropInActivityResultContract.java:18)
at androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:414)
at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:371)
at androidx.activity.ComponentActivity.onActivityResult(ComponentActivity.java:845)
at androidx.fragment.app.FragmentActivity.onActivityResult(FragmentActivity.java:151)
at android.app.Activity.dispatchActivityResult(Activity.java:8628)
at android.app.ActivityThread.deliverResults(ActivityThread.java:5316)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5362)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:67)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

To reproduce

  1. Pay with some card so it is added to the Vault
  2. Launch DropIn flow again
  3. Choose the Saved card
  4. Cancel the 3ds verification
  5. Select the card again
  6. Failure returned

Expected behavior

After cancelling 3ds verification, user still should be able to finish the flow successfully

Screenshots

No response

sarahkoop commented 6 months ago

Hi @levinzonr - Thanks for reporting this issue. We were able to reproduce it on our end with the steps provided. We will investigate this further and post here when we have an update!

sshropshire commented 3 months ago

Hey @levinzonr this was fixed in version 6.15.0. Thank you for your patience.