Skip to content

Commit

Permalink
Enable adding mandate information to confirm params (#2112)
Browse files Browse the repository at this point in the history
Summary
- Update confirm params creation methods to take an
  optional mandate id or mandate data
- Remove `ConfirmPaymentIntentParams.Builder`
- Remove `ConfirmSetupIntentParams.Builder`

Motivation
Fixes #2103

Testing
Add unit tests
  • Loading branch information
mshafrir-stripe authored Jan 29, 2020
1 parent ee330b3 commit 0f78f1c
Show file tree
Hide file tree
Showing 5 changed files with 190 additions and 265 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.stripe.android.model

import androidx.annotation.VisibleForTesting
import com.stripe.android.ObjectBuilder
import com.stripe.android.model.ConfirmStripeIntentParams.Companion.PARAM_CLIENT_SECRET
import com.stripe.android.model.ConfirmStripeIntentParams.Companion.PARAM_MANDATE_DATA
import com.stripe.android.model.ConfirmStripeIntentParams.Companion.PARAM_MANDATE_ID
Expand Down Expand Up @@ -101,9 +99,7 @@ data class ConfirmPaymentIntentParams internal constructor(
}

override fun withShouldUseStripeSdk(shouldUseStripeSdk: Boolean): ConfirmPaymentIntentParams {
return toBuilder()
.setShouldUseSdk(shouldUseStripeSdk)
.build()
return copy(useStripeSdk = shouldUseStripeSdk)
}

/**
Expand Down Expand Up @@ -169,132 +165,6 @@ data class ConfirmPaymentIntentParams internal constructor(
}
}

@VisibleForTesting
internal fun toBuilder(): Builder {
return Builder(clientSecret)
.setReturnUrl(returnUrl)
.setSourceId(sourceId)
.setSavePaymentMethod(savePaymentMethod)
.setExtraParams(extraParams)
.setPaymentMethodOptions(paymentMethodOptions)
.also { builder ->
paymentMethodId?.let { builder.setPaymentMethodId(it) }
paymentMethodCreateParams?.let { builder.setPaymentMethodCreateParams(it) }
sourceParams?.let { builder.setSourceParams(sourceParams) }
}
}

/**
* Sets the client secret that is used to authenticate actions on this PaymentIntent
* @param clientSecret client secret associated with this PaymentIntent
*/
@VisibleForTesting
internal class Builder internal constructor(
internal val clientSecret: String
) : ObjectBuilder<ConfirmPaymentIntentParams> {
private var paymentMethodCreateParams: PaymentMethodCreateParams? = null
private var paymentMethodId: String? = null
private var sourceParams: SourceParams? = null
private var sourceId: String? = null

private var extraParams: Map<String, Any>? = null
private var returnUrl: String? = null

private var savePaymentMethod: Boolean = false
private var shouldUseSdk: Boolean = false
private var paymentMethodOptions: PaymentMethodOptionsParams? = null

/**
* Sets the PaymentMethod data that will be included with this PaymentIntent
*
* @param paymentMethodCreateParams Params for the PaymentMethod that will be attached to
* this PaymentIntent. Only one of PaymentMethodParam,
* PaymentMethodId, SourceParam, SourceId should be used
* at a time.
*/
internal fun setPaymentMethodCreateParams(
paymentMethodCreateParams: PaymentMethodCreateParams
): Builder = apply {
this.paymentMethodCreateParams = paymentMethodCreateParams
}

/**
* Sets a pre-existing PaymentMethod that will be attached to this PaymentIntent
*
* @param paymentMethodId The ID of the PaymentMethod that is being attached to this
* PaymentIntent. Only one of PaymentMethodParam, PaymentMethodId,
* SourceParam, SourceId should be used at a time.
*/
internal fun setPaymentMethodId(paymentMethodId: String): Builder = apply {
this.paymentMethodId = paymentMethodId
}

/**
* Sets the source data that will be included with this PaymentIntent
*
* @param sourceParams params for the source that will be attached to this PaymentIntent.
* Only one of SourceParam and SourceId should be used at at time.
*/
internal fun setSourceParams(sourceParams: SourceParams): Builder = apply {
this.sourceParams = sourceParams
}

/**
* Sets a pre-existing source that will be attached to this PaymentIntent
* @param sourceId the ID of an existing Source that is being attached to this
* PaymentIntent. Only one of SourceParam and SourceId should be used at a
* time.
*/
internal fun setSourceId(sourceId: String?): Builder = apply {
this.sourceId = sourceId
}

/**
* @param returnUrl the URL the customer should be redirected to after the authentication
* process
*/
internal fun setReturnUrl(returnUrl: String?): Builder = apply {
this.returnUrl = returnUrl
}

/**
* @param extraParams params that will be included in the request. Incorrect params may
* result in errors when connecting to Stripe's API.
*/
internal fun setExtraParams(extraParams: Map<String, Any>?): Builder = apply {
this.extraParams = extraParams
}

internal fun setSavePaymentMethod(savePaymentMethod: Boolean): Builder = apply {
this.savePaymentMethod = savePaymentMethod
}

internal fun setShouldUseSdk(shouldUseSdk: Boolean): Builder = apply {
this.shouldUseSdk = shouldUseSdk
}

internal fun setPaymentMethodOptions(
paymentMethodOptions: PaymentMethodOptionsParams?
): Builder = apply {
this.paymentMethodOptions = paymentMethodOptions
}

override fun build(): ConfirmPaymentIntentParams {
return ConfirmPaymentIntentParams(
clientSecret = clientSecret,
returnUrl = returnUrl,
paymentMethodId = paymentMethodId,
paymentMethodCreateParams = paymentMethodCreateParams,
sourceId = sourceId,
sourceParams = sourceParams,
savePaymentMethod = savePaymentMethod,
extraParams = extraParams,
useStripeSdk = shouldUseSdk,
paymentMethodOptions = paymentMethodOptions
)
}
}

companion object {
const val PARAM_SOURCE_DATA: String = "source_data"

Expand All @@ -312,10 +182,11 @@ data class ConfirmPaymentIntentParams internal constructor(
returnUrl: String? = null,
extraParams: Map<String, Any>? = null
): ConfirmPaymentIntentParams {
return Builder(clientSecret)
.setReturnUrl(returnUrl)
.setExtraParams(extraParams)
.build()
return ConfirmPaymentIntentParams(
clientSecret = clientSecret,
returnUrl = returnUrl,
extraParams = extraParams
)
}

/**
Expand All @@ -334,6 +205,8 @@ data class ConfirmPaymentIntentParams internal constructor(
* PaymentIntent and must be specified again if a new payment method is
* added.
* @param paymentMethodOptions Optional [PaymentMethodOptionsParams]
* @param mandateId optional ID of the Mandate to be used for this payment.
* @param mandateData optional details about the Mandate to create.
*/
@JvmOverloads
@JvmStatic
Expand All @@ -343,15 +216,19 @@ data class ConfirmPaymentIntentParams internal constructor(
returnUrl: String? = null,
savePaymentMethod: Boolean = false,
extraParams: Map<String, Any>? = null,
paymentMethodOptions: PaymentMethodOptionsParams? = null
paymentMethodOptions: PaymentMethodOptionsParams? = null,
mandateId: String? = null,
mandateData: MandateDataParams? = null
): ConfirmPaymentIntentParams {
return ConfirmPaymentIntentParams(
clientSecret = clientSecret,
paymentMethodId = paymentMethodId,
returnUrl = returnUrl,
savePaymentMethod = savePaymentMethod,
extraParams = extraParams,
paymentMethodOptions = paymentMethodOptions
paymentMethodOptions = paymentMethodOptions,
mandateId = mandateId,
mandateData = mandateData
)
}

Expand All @@ -370,6 +247,8 @@ data class ConfirmPaymentIntentParams internal constructor(
* in the same request or the current payment method attached to the
* PaymentIntent and must be specified again if a new payment method is
* added.
* @param mandateId optional ID of the Mandate to be used for this payment.
* @param mandateData optional details about the Mandate to create.
*/
@JvmOverloads
@JvmStatic
Expand All @@ -378,14 +257,18 @@ data class ConfirmPaymentIntentParams internal constructor(
clientSecret: String,
returnUrl: String? = null,
savePaymentMethod: Boolean = false,
extraParams: Map<String, Any>? = null
extraParams: Map<String, Any>? = null,
mandateId: String? = null,
mandateData: MandateDataParams? = null
): ConfirmPaymentIntentParams {
return ConfirmPaymentIntentParams(
clientSecret = clientSecret,
paymentMethodCreateParams = paymentMethodCreateParams,
returnUrl = returnUrl,
savePaymentMethod = savePaymentMethod,
extraParams = extraParams
extraParams = extraParams,
mandateId = mandateId,
mandateData = mandateData
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.stripe.android.model

import android.os.Parcelable
import androidx.annotation.VisibleForTesting
import com.stripe.android.ObjectBuilder
import com.stripe.android.model.ConfirmStripeIntentParams.Companion.PARAM_CLIENT_SECRET
import com.stripe.android.model.ConfirmStripeIntentParams.Companion.PARAM_MANDATE_DATA
import com.stripe.android.model.ConfirmStripeIntentParams.Companion.PARAM_MANDATE_ID
Expand All @@ -18,7 +16,7 @@ data class ConfirmSetupIntentParams internal constructor(
@get:JvmSynthetic internal val paymentMethodId: String? = null,
@get:JvmSynthetic internal val paymentMethodCreateParams: PaymentMethodCreateParams? = null,
private val returnUrl: String? = null,
private val useStripeSdk: Boolean,
private val useStripeSdk: Boolean = false,

/**
* ID of the mandate to be used for this payment.
Expand All @@ -38,9 +36,7 @@ data class ConfirmSetupIntentParams internal constructor(
}

override fun withShouldUseStripeSdk(shouldUseStripeSdk: Boolean): ConfirmSetupIntentParams {
return toBuilder()
.setShouldUseSdk(shouldUseStripeSdk)
.build()
return copy(useStripeSdk = shouldUseStripeSdk)
}

/**
Expand Down Expand Up @@ -96,55 +92,6 @@ data class ConfirmSetupIntentParams internal constructor(
}
}

@VisibleForTesting
internal fun toBuilder(): Builder {
val builder = Builder(clientSecret)
.setReturnUrl(returnUrl)
.setShouldUseSdk(useStripeSdk)

paymentMethodId?.let { builder.setPaymentMethodId(it) }
paymentMethodCreateParams?.let { builder.setPaymentMethodCreateParams(it) }

return builder
}

internal class Builder internal constructor(
private val clientSecret: String
) : ObjectBuilder<ConfirmSetupIntentParams> {
private var paymentMethodId: String? = null
private var paymentMethodCreateParams: PaymentMethodCreateParams? = null
private var returnUrl: String? = null
private var useStripeSdk: Boolean = false

internal fun setPaymentMethodId(paymentMethodId: String): Builder = apply {
this.paymentMethodId = paymentMethodId
}

internal fun setPaymentMethodCreateParams(
paymentMethodCreateParams: PaymentMethodCreateParams
): Builder = apply {
this.paymentMethodCreateParams = paymentMethodCreateParams
}

internal fun setReturnUrl(returnUrl: String?): Builder = apply {
this.returnUrl = returnUrl
}

internal fun setShouldUseSdk(useStripeSdk: Boolean): Builder = apply {
this.useStripeSdk = useStripeSdk
}

override fun build(): ConfirmSetupIntentParams {
return ConfirmSetupIntentParams(
clientSecret = clientSecret,
returnUrl = returnUrl,
paymentMethodId = paymentMethodId,
paymentMethodCreateParams = paymentMethodCreateParams,
useStripeSdk = useStripeSdk
)
}
}

companion object {
/**
* Create the parameters necessary for confirming a SetupIntent, without specifying a payment method
Expand All @@ -164,9 +111,10 @@ data class ConfirmSetupIntentParams internal constructor(
clientSecret: String,
returnUrl: String? = null
): ConfirmSetupIntentParams {
return Builder(clientSecret)
.setReturnUrl(returnUrl)
.build()
return ConfirmSetupIntentParams(
clientSecret = clientSecret,
returnUrl = returnUrl
)
}

/**
Expand All @@ -179,6 +127,8 @@ data class ConfirmSetupIntentParams internal constructor(
* @param returnUrl The URL to redirect your customer back to after they authenticate on the payment method’s app or site.
* If you’d prefer to redirect to a mobile application, you can alternatively supply an application URI scheme.
* This parameter is only used for cards and other redirect-based payment methods.
* @param mandateId optional ID of the Mandate to be used for this payment.
* @param mandateData optional details about the Mandate to create.
*
* @return params that can be use to confirm a SetupIntent
*/
Expand All @@ -187,12 +137,17 @@ data class ConfirmSetupIntentParams internal constructor(
fun create(
paymentMethodId: String,
clientSecret: String,
returnUrl: String? = null
returnUrl: String? = null,
mandateId: String? = null,
mandateData: MandateDataParams? = null
): ConfirmSetupIntentParams {
return Builder(clientSecret)
.setReturnUrl(returnUrl)
.setPaymentMethodId(paymentMethodId)
.build()
return ConfirmSetupIntentParams(
clientSecret = clientSecret,
paymentMethodId = paymentMethodId,
returnUrl = returnUrl,
mandateId = mandateId,
mandateData = mandateData
)
}

/**
Expand All @@ -204,6 +159,8 @@ data class ConfirmSetupIntentParams internal constructor(
* @param returnUrl The URL to redirect your customer back to after they authenticate on the payment method’s app or site.
* If you’d prefer to redirect to a mobile application, you can alternatively supply an application URI scheme.
* This parameter is only used for cards and other redirect-based payment methods.
* @param mandateId optional ID of the Mandate to be used for this payment.
* @param mandateData optional details about the Mandate to create.
*
* @return params that can be use to confirm a SetupIntent
*/
Expand All @@ -212,12 +169,17 @@ data class ConfirmSetupIntentParams internal constructor(
fun create(
paymentMethodCreateParams: PaymentMethodCreateParams,
clientSecret: String,
returnUrl: String? = null
returnUrl: String? = null,
mandateId: String? = null,
mandateData: MandateDataParams? = null
): ConfirmSetupIntentParams {
return Builder(clientSecret)
.setPaymentMethodCreateParams(paymentMethodCreateParams)
.setReturnUrl(returnUrl)
.build()
return ConfirmSetupIntentParams(
clientSecret = clientSecret,
paymentMethodCreateParams = paymentMethodCreateParams,
returnUrl = returnUrl,
mandateId = mandateId,
mandateData = mandateData
)
}
}
}
Loading

0 comments on commit 0f78f1c

Please sign in to comment.