Skip to content

Commit 6397b53

Browse files
committed
Draft CustomPaymentMethod API
1 parent 7ac1de6 commit 6397b53

16 files changed

+338
-1
lines changed

paymentsheet/api/paymentsheet.api

+32
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,30 @@ public final class com/stripe/android/lpmfoundations/paymentmethod/link/LinkInli
542542
public synthetic fun newArray (I)[Ljava/lang/Object;
543543
}
544544

545+
public final class com/stripe/android/paymentelement/CustomPaymentMethodResult$Canceled$Creator : android/os/Parcelable$Creator {
546+
public fun <init> ()V
547+
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/paymentelement/CustomPaymentMethodResult$Canceled;
548+
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
549+
public final fun newArray (I)[Lcom/stripe/android/paymentelement/CustomPaymentMethodResult$Canceled;
550+
public synthetic fun newArray (I)[Ljava/lang/Object;
551+
}
552+
553+
public final class com/stripe/android/paymentelement/CustomPaymentMethodResult$Completed$Creator : android/os/Parcelable$Creator {
554+
public fun <init> ()V
555+
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/paymentelement/CustomPaymentMethodResult$Completed;
556+
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
557+
public final fun newArray (I)[Lcom/stripe/android/paymentelement/CustomPaymentMethodResult$Completed;
558+
public synthetic fun newArray (I)[Ljava/lang/Object;
559+
}
560+
561+
public final class com/stripe/android/paymentelement/CustomPaymentMethodResult$Failed$Creator : android/os/Parcelable$Creator {
562+
public fun <init> ()V
563+
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/paymentelement/CustomPaymentMethodResult$Failed;
564+
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
565+
public final fun newArray (I)[Lcom/stripe/android/paymentelement/CustomPaymentMethodResult$Failed;
566+
public synthetic fun newArray (I)[Ljava/lang/Object;
567+
}
568+
545569
public final class com/stripe/android/paymentelement/EmbeddedPaymentElement$Configuration$Creator : android/os/Parcelable$Creator {
546570
public fun <init> ()V
547571
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/paymentelement/EmbeddedPaymentElement$Configuration;
@@ -1333,6 +1357,14 @@ public final class com/stripe/android/paymentsheet/PaymentSheet$Configuration$Cr
13331357
public synthetic fun newArray (I)[Ljava/lang/Object;
13341358
}
13351359

1360+
public final class com/stripe/android/paymentsheet/PaymentSheet$CustomPaymentMethodType$Creator : android/os/Parcelable$Creator {
1361+
public fun <init> ()V
1362+
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/paymentsheet/PaymentSheet$CustomPaymentMethodType;
1363+
public synthetic fun createFromParcel (Landroid/os/Parcel;)Ljava/lang/Object;
1364+
public final fun newArray (I)[Lcom/stripe/android/paymentsheet/PaymentSheet$CustomPaymentMethodType;
1365+
public synthetic fun newArray (I)[Ljava/lang/Object;
1366+
}
1367+
13361368
public final class com/stripe/android/paymentsheet/PaymentSheet$CustomerAccessType$CustomerSession$Creator : android/os/Parcelable$Creator {
13371369
public fun <init> ()V
13381370
public final fun createFromParcel (Landroid/os/Parcel;)Lcom/stripe/android/paymentsheet/PaymentSheet$CustomerAccessType$CustomerSession;

paymentsheet/src/main/java/com/stripe/android/common/configuration/ConfigurationDefaults.kt

+2
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,7 @@ internal object ConfigurationDefaults {
2626
val externalPaymentMethods: List<String> = emptyList()
2727
val paymentMethodLayout: PaymentMethodLayout = PaymentMethodLayout.Automatic
2828
val cardBrandAcceptance: PaymentSheet.CardBrandAcceptance = PaymentSheet.CardBrandAcceptance.All
29+
val customPaymentMethodTypes: List<PaymentSheet.CustomPaymentMethodType> = emptyList()
30+
2931
const val embeddedViewDisplaysMandateText: Boolean = true
3032
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.stripe.android.paymentelement
2+
3+
import androidx.annotation.RestrictTo
4+
import com.stripe.android.model.PaymentMethod
5+
import com.stripe.android.paymentsheet.PaymentSheet
6+
7+
/**
8+
* Handler to be used to confirm payment with a custom payment method.
9+
*
10+
* To learn more about custom payment methods, see "docs_url"
11+
*/
12+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
13+
internal fun interface CustomPaymentMethodConfirmHandler {
14+
15+
/**
16+
* Called when a user confirms payment or setup with a custom payment method.
17+
*
18+
* On completion, this should call [CustomPaymentMethodResultHandler.onCustomPaymentMethodResult] with the
19+
* result of the custom payment method's confirmation.
20+
*
21+
* @param customPaymentMethodType The custom payment method to confirm payment with
22+
* @param billingDetails Any billing details you've configured Payment Element to collect
23+
*/
24+
fun confirmCustomPaymentMethod(
25+
customPaymentMethodType: PaymentSheet.CustomPaymentMethodType,
26+
billingDetails: PaymentMethod.BillingDetails,
27+
)
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.stripe.android.paymentelement
2+
3+
import android.content.Context
4+
import android.os.Parcelable
5+
import androidx.annotation.RestrictTo
6+
import kotlinx.parcelize.Parcelize
7+
8+
/**
9+
* Handler used to respond to custom payment method confirm results.
10+
*/
11+
internal object CustomPaymentMethodResultHandler {
12+
13+
/**
14+
* Updates the Payment Element UI to reflect the result of confirming a custom payment method.
15+
*
16+
* Should be called when [CustomPaymentMethodConfirmHandler.confirmCustomPaymentMethod] completes.
17+
*/
18+
@JvmStatic
19+
fun onCustomPaymentMethodResult(context: Context, customPaymentMethodResult: CustomPaymentMethodResult) {
20+
error("Should not called with context from ${context.packageName} and $customPaymentMethodResult")
21+
}
22+
}
23+
24+
/**
25+
* The result of an attempt to confirm a custom payment method.
26+
*/
27+
internal sealed class CustomPaymentMethodResult : Parcelable {
28+
@Parcelize
29+
internal data object Completed : CustomPaymentMethodResult()
30+
31+
@Parcelize
32+
internal data object Canceled : CustomPaymentMethodResult()
33+
34+
@Parcelize
35+
internal data class Failed(
36+
val displayMessage: String?,
37+
) : CustomPaymentMethodResult()
38+
39+
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
40+
companion object {
41+
42+
/**
43+
* The customer successfully completed the payment or setup.
44+
*/
45+
@JvmStatic
46+
internal fun completed(): CustomPaymentMethodResult {
47+
return Completed
48+
}
49+
50+
/**
51+
* The customer canceled the payment or setup attempt.
52+
*/
53+
@JvmStatic
54+
internal fun canceled(): CustomPaymentMethodResult {
55+
return Canceled
56+
}
57+
58+
/**
59+
* The payment or setup attempt failed.
60+
*
61+
* @param displayMessage Message to display to the user on failure. If null, will display Stripe's default
62+
* error message.
63+
*/
64+
@JvmStatic
65+
@JvmOverloads
66+
internal fun failed(displayMessage: String? = null): CustomPaymentMethodResult {
67+
return Failed(displayMessage)
68+
}
69+
}
70+
}

paymentsheet/src/main/java/com/stripe/android/paymentelement/EmbeddedPaymentElement.kt

+25
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,22 @@ class EmbeddedPaymentElement @Inject internal constructor(
115115
internal var externalPaymentMethodConfirmHandler: ExternalPaymentMethodConfirmHandler? = null
116116
private set
117117

118+
internal var customPaymentMethodConfirmHandler: CustomPaymentMethodConfirmHandler? = null
119+
private set
120+
118121
/**
119122
* Called when a user confirms payment for an external payment method.
120123
*/
121124
fun externalPaymentMethodConfirmHandler(handler: ExternalPaymentMethodConfirmHandler) = apply {
122125
this.externalPaymentMethodConfirmHandler = handler
123126
}
127+
128+
/**
129+
* Called when a user confirms payment for a custom payment method.
130+
*/
131+
internal fun customPaymentMethodConfirmHandler(handler: CustomPaymentMethodConfirmHandler) = apply {
132+
this.customPaymentMethodConfirmHandler = handler
133+
}
124134
}
125135

126136
/** Configuration for [EmbeddedPaymentElement] **/
@@ -144,6 +154,7 @@ class EmbeddedPaymentElement @Inject internal constructor(
144154
internal val paymentMethodOrder: List<String>,
145155
internal val externalPaymentMethods: List<String>,
146156
internal val cardBrandAcceptance: PaymentSheet.CardBrandAcceptance,
157+
internal val customPaymentMethodTypes: List<PaymentSheet.CustomPaymentMethodType>,
147158
internal val embeddedViewDisplaysMandateText: Boolean,
148159
) : Parcelable {
149160
@Suppress("TooManyFunctions")
@@ -174,6 +185,8 @@ class EmbeddedPaymentElement @Inject internal constructor(
174185
private var cardBrandAcceptance: PaymentSheet.CardBrandAcceptance =
175186
ConfigurationDefaults.cardBrandAcceptance
176187
private var embeddedViewDisplaysMandateText: Boolean = ConfigurationDefaults.embeddedViewDisplaysMandateText
188+
private var customPaymentMethodTypes: List<PaymentSheet.CustomPaymentMethodType> =
189+
ConfigurationDefaults.customPaymentMethodTypes
177190

178191
/**
179192
* If set, the customer can select a previously saved payment method.
@@ -330,6 +343,17 @@ class EmbeddedPaymentElement @Inject internal constructor(
330343
this.cardBrandAcceptance = cardBrandAcceptance
331344
}
332345

346+
/**
347+
* Configuration related to custom payment methods.
348+
*
349+
* If set, Embedded Payment Element will display the defined list of custom payment methods in the UI.
350+
*/
351+
internal fun customPaymentMethodTypes(
352+
customPaymentMethodTypes: List<PaymentSheet.CustomPaymentMethodType>,
353+
) = apply {
354+
this.customPaymentMethodTypes = customPaymentMethodTypes
355+
}
356+
333357
/**
334358
* Controls whether the view displays mandate text at the bottom for payment methods that require it.
335359
*
@@ -360,6 +384,7 @@ class EmbeddedPaymentElement @Inject internal constructor(
360384
paymentMethodOrder = paymentMethodOrder,
361385
externalPaymentMethods = externalPaymentMethods,
362386
cardBrandAcceptance = cardBrandAcceptance,
387+
customPaymentMethodTypes = customPaymentMethodTypes,
363388
embeddedViewDisplaysMandateText = embeddedViewDisplaysMandateText,
364389
)
365390
}

paymentsheet/src/main/java/com/stripe/android/paymentelement/EmbeddedPaymentElementKtx.kt

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fun rememberEmbeddedPaymentElement(
3737
val callbacks = remember(builder) {
3838
PaymentElementCallbacks(
3939
createIntentCallback = builder.createIntentCallback,
40+
customPaymentMethodConfirmHandler = builder.customPaymentMethodConfirmHandler,
4041
externalPaymentMethodConfirmHandler = builder.externalPaymentMethodConfirmHandler,
4142
)
4243
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.stripe.android.paymentelement.callbacks
22

3+
import com.stripe.android.paymentelement.CustomPaymentMethodConfirmHandler
34
import com.stripe.android.paymentsheet.CreateIntentCallback
45
import com.stripe.android.paymentsheet.ExternalPaymentMethodConfirmHandler
56

67
internal class PaymentElementCallbacks(
78
val createIntentCallback: CreateIntentCallback?,
9+
val customPaymentMethodConfirmHandler: CustomPaymentMethodConfirmHandler?,
810
val externalPaymentMethodConfirmHandler: ExternalPaymentMethodConfirmHandler?,
911
)

paymentsheet/src/main/java/com/stripe/android/paymentsheet/FlowControllerCompose.kt

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
77
import androidx.lifecycle.compose.LocalLifecycleOwner
88
import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
99
import com.stripe.android.common.ui.UpdateCallbacks
10+
import com.stripe.android.paymentelement.CustomPaymentMethodConfirmHandler
1011
import com.stripe.android.paymentelement.callbacks.PaymentElementCallbacks
1112
import com.stripe.android.paymentsheet.flowcontroller.FlowControllerFactory
1213
import com.stripe.android.utils.rememberActivity
@@ -28,6 +29,7 @@ fun rememberPaymentSheetFlowController(
2829
return internalRememberPaymentSheetFlowController(
2930
paymentOptionCallback = paymentOptionCallback,
3031
paymentResultCallback = paymentResultCallback,
32+
customPaymentMethodConfirmHandler = null,
3133
createIntentCallback = null,
3234
externalPaymentMethodConfirmHandler = null,
3335
)
@@ -53,6 +55,7 @@ fun rememberPaymentSheetFlowController(
5355
return internalRememberPaymentSheetFlowController(
5456
paymentOptionCallback = paymentOptionCallback,
5557
paymentResultCallback = paymentResultCallback,
58+
customPaymentMethodConfirmHandler = null,
5659
createIntentCallback = createIntentCallback,
5760
externalPaymentMethodConfirmHandler = null,
5861
)
@@ -82,6 +85,7 @@ fun rememberPaymentSheetFlowController(
8285
return internalRememberPaymentSheetFlowController(
8386
paymentOptionCallback = paymentOptionCallback,
8487
paymentResultCallback = paymentResultCallback,
88+
customPaymentMethodConfirmHandler = null,
8589
createIntentCallback = createIntentCallback,
8690
externalPaymentMethodConfirmHandler = externalPaymentMethodConfirmHandler
8791
)
@@ -143,6 +147,7 @@ private fun internalRememberPaymentSheetFlowController(
143147
internal fun internalRememberPaymentSheetFlowController(
144148
createIntentCallback: CreateIntentCallback?,
145149
externalPaymentMethodConfirmHandler: ExternalPaymentMethodConfirmHandler?,
150+
customPaymentMethodConfirmHandler: CustomPaymentMethodConfirmHandler?,
146151
paymentOptionCallback: PaymentOptionCallback,
147152
paymentResultCallback: PaymentSheetResultCallback,
148153
): PaymentSheet.FlowController {
@@ -153,6 +158,7 @@ internal fun internalRememberPaymentSheetFlowController(
153158
val callbacks = remember(createIntentCallback, externalPaymentMethodConfirmHandler) {
154159
PaymentElementCallbacks(
155160
createIntentCallback = createIntentCallback,
161+
customPaymentMethodConfirmHandler = customPaymentMethodConfirmHandler,
156162
externalPaymentMethodConfirmHandler = externalPaymentMethodConfirmHandler,
157163
)
158164
}

0 commit comments

Comments
 (0)