Skip to content

Commit

Permalink
Upgrade 3DS2 SDK to 4.1.2 (#3083)
Browse files Browse the repository at this point in the history
Add `sdkTransactionId` and update tests

Fixes #3081
  • Loading branch information
mshafrir-stripe authored Nov 24, 2020
1 parent 9e9621a commit 82497ec
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 22 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* [#3046](https://github.com/stripe/stripe-android/pull/3046) Upgrade Gradle to `6.7.1`
* [#3056](https://github.com/stripe/stripe-android/pull/3056) Upgrade Kotlin to `1.4.20`
* [#3058](https://github.com/stripe/stripe-android/pull/3058) Migrate to Kotlin Parcelize plugin
* [#3083](https://github.com/stripe/stripe-android/pull/3083) Upgrade `stripe-3ds2-android` to `4.1.2`

## 16.1.0 - 2020-11-06
* [#2930](https://github.com/stripe/stripe-android/pull/2930) Upgrade Android Gradle Plugin to `4.1.0`
Expand Down
2 changes: 1 addition & 1 deletion stripe/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ dependencies {
// Api for this import because we use reflection to alter TextInputLayout
api "com.google.android.material:material:$materialVersion"

implementation "com.stripe:stripe-3ds2-android:4.1.1"
implementation "com.stripe:stripe-3ds2-android:4.1.2"

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutinesVersion"
Expand Down
15 changes: 10 additions & 5 deletions stripe/src/main/java/com/stripe/android/StripePaymentController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import com.stripe.android.stripe3ds2.transaction.CompletionEvent
import com.stripe.android.stripe3ds2.transaction.MessageVersionRegistry
import com.stripe.android.stripe3ds2.transaction.ProtocolErrorEvent
import com.stripe.android.stripe3ds2.transaction.RuntimeErrorEvent
import com.stripe.android.stripe3ds2.transaction.SdkTransactionId
import com.stripe.android.stripe3ds2.transaction.Stripe3ds2ActivityStarterHost
import com.stripe.android.stripe3ds2.transaction.StripeChallengeStatusReceiver
import com.stripe.android.stripe3ds2.transaction.Transaction
Expand Down Expand Up @@ -826,7 +827,8 @@ internal class StripePaymentController internal constructor(
activity,
stripe3ds2Fingerprint.directoryServerName,
false,
config.stripe3ds2Config.uiCustomization.uiCustomization
config.stripe3ds2Config.uiCustomization.uiCustomization,
transaction.sdkTransactionId
)

CoroutineScope(workContext).launch {
Expand All @@ -837,7 +839,7 @@ internal class StripePaymentController internal constructor(
stripe3ds2Fingerprint.source,
areqParams.sdkAppId,
areqParams.sdkReferenceNumber,
areqParams.sdkTransactionId,
areqParams.sdkTransactionId.value,
areqParams.deviceData,
areqParams.sdkEphemeralPublicKey,
areqParams.messageVersion,
Expand Down Expand Up @@ -1202,21 +1204,24 @@ internal class StripePaymentController internal constructor(
context: Context,
directoryServerName: String,
cancelable: Boolean,
uiCustomization: StripeUiCustomization
uiCustomization: StripeUiCustomization,
sdkTransactionId: SdkTransactionId
)

class Default : ChallengeProgressActivityStarter {
override fun start(
context: Context,
directoryServerName: String,
cancelable: Boolean,
uiCustomization: StripeUiCustomization
uiCustomization: StripeUiCustomization,
sdkTransactionId: SdkTransactionId
) {
ChallengeProgressActivity.show(
context,
directoryServerName,
cancelable,
uiCustomization
uiCustomization,
sdkTransactionId
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ internal class AnalyticsDataFactory @VisibleForTesting internal constructor(
val errorMessage = protocolErrorEvent.errorMessage
val errorData = mapOf(
"type" to "protocol_error_event",
"sdk_trans_id" to protocolErrorEvent.sdkTransactionId,
"sdk_trans_id" to protocolErrorEvent.sdkTransactionId?.value,
"error_code" to errorMessage.errorCode,
"error_description" to errorMessage.errorDescription,
"error_details" to errorMessage.errorDetails,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import com.stripe.android.stripe3ds2.transaction.ErrorMessage
import com.stripe.android.stripe3ds2.transaction.MessageVersionRegistry
import com.stripe.android.stripe3ds2.transaction.ProtocolErrorEvent
import com.stripe.android.stripe3ds2.transaction.RuntimeErrorEvent
import com.stripe.android.stripe3ds2.transaction.SdkTransactionId
import com.stripe.android.stripe3ds2.transaction.Stripe3ds2ActivityStarterHost
import com.stripe.android.stripe3ds2.transaction.Transaction
import com.stripe.android.utils.ParcelUtils
Expand All @@ -58,6 +59,7 @@ import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.setMain
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import java.util.UUID
import kotlin.test.BeforeTest
import kotlin.test.Test

Expand All @@ -67,7 +69,13 @@ internal class StripePaymentControllerTest {

private val activity: Activity = mock()
private val threeDs2Service: StripeThreeDs2Service = mock()
private val transaction: Transaction = mock()
private val sdkTransactionId = mock<SdkTransactionId>().also {
whenever(it.value).thenReturn(UUID.randomUUID().toString())
}
private val transaction: Transaction = mock<Transaction>().also {
whenever(it.sdkTransactionId)
.thenReturn(sdkTransactionId)
}
private val paymentAuthResultCallback: ApiResultCallback<PaymentIntentResult> = mock()
private val setupAuthResultCallback: ApiResultCallback<SetupIntentResult> = mock()
private val sourceCallback: ApiResultCallback<Source> = mock()
Expand Down Expand Up @@ -98,7 +106,7 @@ internal class StripePaymentControllerTest {
Dispatchers.setMain(testDispatcher)
runBlocking {
whenever(transaction.createAuthenticationRequestParameters())
.thenReturn(Stripe3ds2Fixtures.AREQ_PARAMS)
.thenReturn(Stripe3ds2Fixtures.createAreqParams(sdkTransactionId))
}
whenever(activity.applicationContext)
.thenReturn(context)
Expand Down Expand Up @@ -145,7 +153,8 @@ internal class StripePaymentControllerTest {
eq(activity),
eq("mastercard"),
eq(false),
any()
any(),
eq(sdkTransactionId)
)

verify(analyticsRequestExecutor)
Expand Down Expand Up @@ -198,7 +207,8 @@ internal class StripePaymentControllerTest {
eq(activity),
eq("american_express"),
eq(false),
any()
any(),
eq(sdkTransactionId)
)
}

Expand Down Expand Up @@ -312,7 +322,7 @@ internal class StripePaymentControllerTest {
@Test
fun test3ds2Receiver_whenCompleted_shouldFireAnalyticsRequest() {
val completionEvent = CompletionEvent(
sdkTransactionId = "8dd3413f-0b45-4234-bc45-6cc40fb1b0f1",
sdkTransactionId = sdkTransactionId,
transactionStatus = "C"
)

Expand Down Expand Up @@ -440,7 +450,7 @@ internal class StripePaymentControllerTest {
@Test
fun test3ds2Receiver_whenProtocolError_shouldFireAnalyticsRequest() {
val protocolErrorEvent = ProtocolErrorEvent(
sdkTransactionId = "8dd3413f-0b45-4234-bc45-6cc40fb1b0f1",
sdkTransactionId = sdkTransactionId,
errorMessage = ErrorMessage(
errorCode = "201",
errorDescription = "Required element missing",
Expand Down Expand Up @@ -475,7 +485,7 @@ internal class StripePaymentControllerTest {
mapOf(
"type" to "protocol_error_event",
"error_code" to "201",
"sdk_trans_id" to "8dd3413f-0b45-4234-bc45-6cc40fb1b0f1",
"sdk_trans_id" to sdkTransactionId.value,
"error_description" to "Required element missing",
"error_details" to "eci",
"trans_id" to "047f76a6-d1d4-48a2-aa65-786abb6f7f46"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.stripe.android.model

import com.stripe.android.stripe3ds2.transaction.AuthenticationRequestParameters
import com.stripe.android.stripe3ds2.transaction.SdkTransactionId
import java.util.UUID

internal object Stripe3ds2Fixtures {
Expand All @@ -12,12 +13,16 @@ internal object Stripe3ds2Fixtures {
private const val SDK_REFERENCE_NUMBER = "3DS_LOA_SDK_STIN_12345"
private const val SDK_EPHEMERAL_PUBLIC_KEY = "{\"kty\":\"EC\",\"use\":\"sig\",\"crv\":\"P-256\",\"kid\":\"b23da28b-d611-46a8-93af-44ad57ce9c9d\",\"x\":\"hSwyaaAp3ppSGkpt7d9G8wnp3aIXelsZVo05EPpqetg\",\"y\":\"OUVOv9xPh5RYWapla0oz3vCJWRRXlDmppy5BGNeSl-A\"}"

val AREQ_PARAMS = AuthenticationRequestParameters(
deviceData = DEVICE_DATA,
messageVersion = MESSAGE_VERSION,
sdkAppId = SDK_APP_ID,
sdkEphemeralPublicKey = SDK_EPHEMERAL_PUBLIC_KEY,
sdkReferenceNumber = SDK_REFERENCE_NUMBER,
sdkTransactionId = SDK_TRANSACTION_ID
)
fun createAreqParams(
sdkTransactionId: SdkTransactionId
): AuthenticationRequestParameters {
return AuthenticationRequestParameters(
deviceData = DEVICE_DATA,
messageVersion = MESSAGE_VERSION,
sdkAppId = SDK_APP_ID,
sdkEphemeralPublicKey = SDK_EPHEMERAL_PUBLIC_KEY,
sdkReferenceNumber = SDK_REFERENCE_NUMBER,
sdkTransactionId = sdkTransactionId
)
}
}

0 comments on commit 82497ec

Please sign in to comment.