Skip to content
Merged
Show file tree
Hide file tree
Changes from 67 commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
85ae993
Initial attempt at the CARFD integration
Twigz Apr 23, 2026
9703c20
Renaming
Twigz Apr 27, 2026
dcf4d3d
Simplied Identifiers
Twigz Apr 27, 2026
6d5c19d
linting
Twigz Apr 27, 2026
8c25f8e
Update OnrampActivity example
Twigz Apr 27, 2026
939b6d4
Adds in some KYC collection fields to the example app
Twigz Apr 27, 2026
e1121b0
Changes to API spec
Twigz Apr 28, 2026
d829457
linting
Twigz Apr 28, 2026
d63da71
Updating example app with identifier submission
Twigz Apr 28, 2026
98108df
linting
Twigz Apr 28, 2026
5e1d27c
Update for new identifier type
Twigz Apr 28, 2026
bbf08df
linting
Twigz Apr 28, 2026
73e9650
Merge branch 'master' into twigz/carfd-integration
Twigz Apr 28, 2026
2eee7c3
Reworked the new format from the API review
Twigz May 4, 2026
4525702
Further api review updates
Twigz May 4, 2026
5bba36f
Match naming / process to what's on iOS better
Twigz May 4, 2026
d63aa0b
Make sure to include filtering out nationalities
Twigz May 4, 2026
c0abbca
Update CryptoApiRepositoryTest.kt
Twigz May 4, 2026
6aa7088
Refactor
Twigz May 4, 2026
7f1b374
Fixed missing imports
Twigz May 4, 2026
fe68fa2
Adds backend / model code
Twigz May 4, 2026
d052ed7
linting
Twigz May 4, 2026
64c4f15
Update crypto-onramp.api
Twigz May 4, 2026
130851d
linting
Twigz May 4, 2026
075827e
Update CHANGELOG.md
Twigz May 4, 2026
e6f803f
Merge branch 'twigz/onramp-eu-backend-models' into twigz/carfd-integr…
Twigz May 5, 2026
6dc9df7
Merge branch 'master' into twigz/onramp-eu-backend-models
Twigz May 5, 2026
2f93a31
Merge branch 'twigz/onramp-eu-backend-models' into twigz/carfd-integr…
Twigz May 5, 2026
60339f5
Merge branch 'master' into twigz/onramp-eu-backend-models
Twigz May 5, 2026
b900318
Match iOS behavior better
Twigz May 6, 2026
67a854f
Merge branch 'twigz/onramp-eu-backend-models' into twigz/carfd-integr…
Twigz May 6, 2026
0a86fc1
Adds public api functionality for eu suppport
Twigz May 6, 2026
882d719
Update CHANGELOG.md
Twigz May 6, 2026
e4cd47c
fix dependencies
Twigz May 7, 2026
b57f4da
Match analytics to iOS
Twigz May 7, 2026
c64ca8e
Merge branch 'twigz/onramp-eui-api-changes' into twigz/carfd-integration
Twigz May 7, 2026
e1fce7a
linting
Twigz May 7, 2026
f4ab295
Merge branch 'master' into twigz/carfd-integration
Twigz May 12, 2026
ad49ec2
Update CHANGELOG.md
Twigz May 12, 2026
e49e834
Merge branch 'master' into twigz/carfd-integration
Twigz May 13, 2026
50ed805
Merge branch 'master' into twigz/carfd-integration
Twigz May 18, 2026
cf93155
Initial error api attempt
Twigz May 19, 2026
0f0f541
Merge branch 'master' into twigz/crypto-onramp-errors
Twigz May 20, 2026
7bb4c68
Updates error mapper to be a little more robust
Twigz May 21, 2026
d2b7f2e
Remove type from stripe error
Twigz May 21, 2026
43640af
Merge branch 'master' into twigz/crypto-onramp-errors
Twigz May 21, 2026
58463a5
Adding in an UncategorizedApiErrorException, changing display message
Twigz May 21, 2026
043596f
Remove display message
Twigz May 21, 2026
5fdbc17
Removed userMessageResId
Twigz May 21, 2026
3c40f79
Remove not real URL
Twigz May 21, 2026
a586dbc
Removed a large number of fallback messages
Twigz May 21, 2026
b96a7d3
Cleanup
Twigz May 21, 2026
d04a9f7
Added in missing apiErrorType
Twigz May 26, 2026
436a8a6
Merge branch 'master' into twigz/crypto-onramp-errors
Twigz May 26, 2026
c6c4482
Remove rawStripeError and restrict analyticsValue
Twigz May 26, 2026
09431d8
Fix missing error mapping
Twigz May 26, 2026
b590421
Merge branch 'master' into twigz/crypto-onramp-errors
Twigz May 26, 2026
35d8e73
Update CHANGELOG.md
Twigz May 26, 2026
900e86b
Break exceptions up
Twigz May 26, 2026
7b9a1eb
Update CHANGELOG.md
Twigz May 26, 2026
d0d3536
Fix linting errors
Twigz May 27, 2026
483d8c5
Switch to an APIErrorContext to match iOS better and reduce duplication
Twigz May 27, 2026
640e5a3
Merge branch 'master' into twigz/crypto-onramp-errors
Twigz May 27, 2026
d465fc2
Removing unnecessary lazy string loading
Twigz May 27, 2026
a58f7f4
Minor changes to make casting less onerous for api exceptions
Twigz May 28, 2026
f86e872
Make cause more clear as a StripeException
Twigz May 28, 2026
374c41f
Switch to a CryptoOnrampErrorRenderer
Twigz Jun 1, 2026
88699ae
Implement a new StripeCryptoOnrampError protocol
Twigz Jun 2, 2026
05b01f6
Switched from CryptoOnrampException to CryptoOnrampApiException
Twigz Jun 2, 2026
9b1eb9a
Merge branch 'master' into twigz/crypto-onramp-errors
Twigz Jun 4, 2026
b92bd3c
Matching iOS changes for sdk versioning
Twigz Jun 4, 2026
fdd1789
Update crypto-onramp.api
Twigz Jun 4, 2026
b27bd27
Make code non-optional, prefer userMessage to apiUserMessage
Twigz Jun 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ NEXT_VERSION_BUMP: PATCH
### Payments
* [CHANGED][13144](https://github.com/stripe/stripe-android/pull/13144) On payment or setup confirmation failure, we now include error code, decline code, and error type in the exception thrown.

### CryptoOnramp
* [ADDED][13156](https://github.com/stripe/stripe-android/pull/13156) Added `CryptoOnrampException`, `AppAttestationException`, and `UncategorizedApiErrorException` to expose richer developer-facing diagnostics and preserved backend API error context for Crypto Onramp failures.
* [CHANGED][13156](https://github.com/stripe/stripe-android/pull/13156) Improved Crypto Onramp API error handling with localized fallback user messaging and more consistent error mapping across attestation, payment collection, and checkout flows.


## 23.9.1 - 2026-05-26

### Payments
Expand Down
55 changes: 55 additions & 0 deletions crypto-onramp/api/crypto-onramp.api
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,56 @@ public final class com/stripe/android/crypto/onramp/OnrampCoordinator$Presenter
public static synthetic fun verifyKycInfo$default (Lcom/stripe/android/crypto/onramp/OnrampCoordinator$Presenter;Lcom/stripe/android/paymentsheet/PaymentSheet$Address;ILjava/lang/Object;)V
}

public final class com/stripe/android/crypto/onramp/exception/APIErrorContext {
public static final field $stable I
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/stripe/android/core/exception/StripeException;)V
public final fun component1 ()Ljava/lang/String;
public final fun component10 ()Ljava/lang/String;
public final fun component11 ()Lcom/stripe/android/core/exception/StripeException;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun component7 ()Ljava/lang/String;
public final fun component8 ()Ljava/lang/String;
public final fun component9 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/stripe/android/core/exception/StripeException;)Lcom/stripe/android/crypto/onramp/exception/APIErrorContext;
public static synthetic fun copy$default (Lcom/stripe/android/crypto/onramp/exception/APIErrorContext;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/stripe/android/core/exception/StripeException;ILjava/lang/Object;)Lcom/stripe/android/crypto/onramp/exception/APIErrorContext;
public fun equals (Ljava/lang/Object;)Z
public final fun getApiErrorCode ()Ljava/lang/String;
public final fun getApiErrorMessage ()Ljava/lang/String;
public final fun getApiErrorType ()Ljava/lang/String;
public final fun getApiUserMessage ()Ljava/lang/String;
public final fun getAppPackageName ()Ljava/lang/String;
public final fun getDocUrl ()Ljava/lang/String;
public final fun getMode ()Ljava/lang/String;
public final fun getOperation ()Ljava/lang/String;
public final fun getReason ()Ljava/lang/String;
public final fun getRequestId ()Ljava/lang/String;
public final fun getSdkVersion ()Ljava/lang/String;
public final fun getUnderlyingError ()Lcom/stripe/android/core/exception/StripeException;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/stripe/android/crypto/onramp/exception/AppAttestationException : com/stripe/android/crypto/onramp/exception/CryptoOnrampApiException {
public static final field $stable I
public fun getUserMessage ()Ljava/lang/String;
}

public abstract class com/stripe/android/crypto/onramp/exception/CryptoOnrampApiException : com/stripe/android/crypto/onramp/exception/CryptoOnrampException {
public static final field $stable I
public final fun getContext ()Lcom/stripe/android/crypto/onramp/exception/APIErrorContext;
}

public abstract class com/stripe/android/crypto/onramp/exception/CryptoOnrampException : com/stripe/android/core/exception/StripeException {
public static final field $stable I
public final fun getDeveloperMessage ()Ljava/lang/String;
public final fun getStripeException ()Lcom/stripe/android/core/exception/StripeException;
public abstract fun getUserMessage ()Ljava/lang/String;
}

public final class com/stripe/android/crypto/onramp/exception/MissingConsumerSecretException : java/lang/IllegalStateException {
public static final field $stable I
}
Expand All @@ -55,6 +105,11 @@ public final class com/stripe/android/crypto/onramp/exception/PaymentFailedExcep
public static final field $stable I
}

public final class com/stripe/android/crypto/onramp/exception/UncategorizedApiErrorException : com/stripe/android/crypto/onramp/exception/CryptoOnrampApiException {
public static final field $stable I
public fun getUserMessage ()Ljava/lang/String;
}

public final class com/stripe/android/crypto/onramp/model/CryptoNetwork : java/lang/Enum {
public static final field Aptos Lcom/stripe/android/crypto/onramp/model/CryptoNetwork;
public static final field Arbitrum Lcom/stripe/android/crypto/onramp/model/CryptoNetwork;
Expand Down
7 changes: 7 additions & 0 deletions crypto-onramp/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Fallback app-user message for Crypto Onramp app attestation failures. -->
<string name="stripe_onramp_app_attestation_default_user_message">This app couldn\'t be verified due to an attestation error. Please try again later or contact the developer if the issue persists.</string>
<!-- Fallback app-user message for uncategorized Crypto Onramp API failures. -->
<string name="stripe_onramp_default_api_error_user_message">Something went wrong. Please try again later.</string>
</resources>
Loading
Loading