Skip to content

Commit f4c20ac

Browse files
committed
PAYLSQUAD3-3458 - [SDK_ANDROID][3DS]: 4 - Paiement wallet et FrictionLess 3DS
- Ajout appel du ThreeDSManager pour le paiement Wallet - update TU
1 parent 86bc521 commit f4c20ac

File tree

7 files changed

+211
-49
lines changed

7 files changed

+211
-49
lines changed

.github/workflows/github-action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ jobs:
380380
},
381381
{
382382
"title": "Branch/Tag:",
383-
"value": "${{ github.HEAD_REF }}"
383+
"value": "${{ github.REF_NAME }}"
384384
},
385385
{
386386
"title": "Auteur:",

monext/src/main/kotlin/com/monext/sdk/internal/api/model/request/WalletPaymentRequest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ internal data class WalletPaymentRequest(
99
val index: Int,
1010
val isEmbeddedRedirectionAllowed: Boolean,
1111
val merchantReturnUrl: String,
12+
val paymentParams: PaymentParams,
1213
val securedPaymentParams: SecuredPaymentParams
1314
)

monext/src/main/kotlin/com/monext/sdk/internal/presentation/SessionStateViewModel.kt

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -160,31 +160,15 @@ internal class SessionStateViewModel(val sessionStateRepository: SessionStateRep
160160
val pmData = paymentMethod.data ?: return
161161

162162
val cardType = formData.cardNetwork?.network?.name ?: cardCode.name
163+
val paymentParams = formData.paymentParams()
163164

164-
// Si le 3DS est déjà initialisé, on le close pour le ré-init
165-
if(sessionStateRepository.threeDSManager.isInitialized) {
166-
sessionStateRepository.threeDSManager.closeTransaction()
167-
}
168-
169-
// A garder car doit etre executé dans une coroutine
170-
withContext(dispatcher) {
171-
// Blocking network request code
172-
sessionStateRepository.threeDSManager.startInitialize(
173-
sessionToken = sessionState.value!!.token,
174-
cardCode = cardType
175-
)
176-
}
177-
178-
val sdkContextData: SdkContextData =
179-
sessionStateRepository.threeDSManager.generateSDKContextData(cardType)
165+
paymentParams.sdkContextData = initializeAndGetThreeDSData(cardType)
180166

181167
val displayMetrics = context.resources.displayMetrics
182168
val timeZone = TimeZone.getDefault()
183169
val millisecondsOffset = timeZone.getOffset(Date().time)
184170
val minutesOffset = TimeUnit.MILLISECONDS.toSeconds(millisecondsOffset.toLong()).toInt()
185171

186-
val paymentParams = formData.paymentParams()
187-
paymentParams.sdkContextData = json.encodeToString(sdkContextData)
188172

189173
val params = SecuredPaymentRequest(
190174
cardCode = cardCode.name,
@@ -210,6 +194,29 @@ internal class SessionStateViewModel(val sessionStateRepository: SessionStateRep
210194
showOverlay(PaymentOverlayToggle.off())
211195
}
212196

197+
/**
198+
* Fonction qui permet de faire l'initialization du SDK 3DS et de récupérer les informations de context
199+
*/
200+
private suspend fun initializeAndGetThreeDSData(cardType: String): String {
201+
// Si le 3DS est déjà initialisé, on le close pour le ré-init
202+
if (sessionStateRepository.threeDSManager.isInitialized) {
203+
sessionStateRepository.threeDSManager.closeTransaction()
204+
}
205+
206+
// A garder car doit etre executé dans une coroutine
207+
withContext(dispatcher) {
208+
// Blocking network request code
209+
sessionStateRepository.threeDSManager.startInitialize(
210+
sessionToken = sessionState.value!!.token,
211+
cardCode = cardType
212+
)
213+
}
214+
215+
val sdkContextData: SdkContextData =
216+
sessionStateRepository.threeDSManager.generateSDKContextData(cardType)
217+
return json.encodeToString(sdkContextData)
218+
}
219+
213220
/**
214221
* Fonction qui permet de traiter les paiements (autre que Carte)
215222
*/
@@ -233,20 +240,25 @@ internal class SessionStateViewModel(val sessionStateRepository: SessionStateRep
233240
showOverlay(PaymentOverlayToggle.off())
234241
}
235242

236-
private suspend fun makeWalletPayment(selectedWallet: Wallet?, walletFormData: FormData.Wallet?, showOverlay: (PaymentOverlayToggle) -> Unit) {
237-
243+
internal suspend fun makeWalletPayment(selectedWallet: Wallet?, walletFormData: FormData.Wallet?, showOverlay: (PaymentOverlayToggle) -> Unit) {
238244
val selectedWallet = selectedWallet ?: return
239245
val walletData = walletFormData ?: return
246+
val walletCardType = selectedWallet.cardType
247+
248+
val paymentParams = walletFormData.paymentParams()
249+
// Récupération des données 3DS
250+
paymentParams.sdkContextData = initializeAndGetThreeDSData(walletCardType.name)
240251

241252
val params = WalletPaymentRequest(
242253
cardCode = selectedWallet.cardCode,
243254
index = selectedWallet.index,
244255
isEmbeddedRedirectionAllowed = true,
245256
merchantReturnUrl = sessionStateRepository.returnURLString,
257+
paymentParams = paymentParams,
246258
securedPaymentParams = walletData.securedPaymentParams()
247259
)
248260

249-
showOverlay(PaymentOverlayToggle.on(selectedWallet.cardType))
261+
showOverlay(PaymentOverlayToggle.on(walletCardType))
250262
sessionStateRepository.makeWalletPayment(params)
251263
showOverlay(PaymentOverlayToggle.off())
252264
}

monext/src/main/kotlin/com/monext/sdk/internal/presentation/card/FormFieldsSection.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import com.monext.sdk.internal.util.HolderAssistant
4242
internal fun FormFieldsSection(cards: PaymentMethod.Cards, onFormValidated: (FormData?) -> Unit) {
4343

4444
var cardNum by rememberSaveable { mutableStateOf("") }
45-
val cardLookupNum by remember { derivedStateOf<String?> {
45+
val cardLookupNum by remember { derivedStateOf {
4646
if (cardNum.length < 6) null
4747
else cardNum.take(10)
4848
} }

monext/src/test/kotlin/com/monext/sdk/SdkTestHelper.kt

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.monext.sdk
22

3+
import ThreeDSConfiguration
34
import com.monext.sdk.internal.api.AvailableCardNetworksRequest
45
import com.monext.sdk.internal.api.AvailableCardNetworksResponse
56
import com.monext.sdk.internal.api.HandledContract
@@ -13,8 +14,11 @@ import com.monext.sdk.internal.api.model.request.WalletPaymentRequest
1314
import com.monext.sdk.internal.data.CardNetwork
1415
import com.monext.sdk.internal.data.FormData
1516
import com.monext.sdk.internal.data.PaymentMethod
17+
import com.monext.sdk.internal.data.sessionstate.AdditionalData
18+
import com.monext.sdk.internal.data.sessionstate.FormOption
1619
import com.monext.sdk.internal.data.sessionstate.PaymentMethodCardCode
1720
import com.monext.sdk.internal.data.sessionstate.PaymentMethodData
21+
import com.monext.sdk.internal.data.sessionstate.Wallet
1822
import com.monext.sdk.internal.presentation.PaymentAttempt
1923
import com.monext.sdk.internal.service.CustomLogger
2024
import com.monext.sdk.internal.threeds.model.AuthenticationResponse
@@ -75,21 +79,58 @@ class SdkTestHelper {
7579
index = 1,
7680
isEmbeddedRedirectionAllowed = true,
7781
merchantReturnUrl = "http://merchant.com/return/url",
82+
paymentParams = createPaymentParams(),
7883
securedPaymentParams = createSecuredParams()
7984
)
8085
}
8186

87+
internal fun createWallet(): Wallet = Wallet(
88+
cardCode = PaymentMethodCardCode.CB,
89+
index = 2,
90+
cardType = PaymentMethodCardCode.CB,
91+
isDefault = false,
92+
isExpired = false,
93+
expiredMore6Months = false,
94+
hasCustomLogo = false,
95+
customLogoRatio = 0,
96+
hasCustomLogoUrl = false,
97+
hasCustomLogoBase64 = false,
98+
isPmAPI = false,
99+
hasSpecificDisplay = false,
100+
options = emptyList(),
101+
additionalData = AdditionalData(
102+
date = "1230",
103+
holder = "",
104+
pan = "***-XX07",
105+
merchantCapabilities = null,
106+
networks = null,
107+
applePayMerchantId = null,
108+
applePayMerchantName = null,
109+
savePaymentDataChecked = null,
110+
email = null
111+
),
112+
confirm = listOf(FormOption.CVV)
113+
)
114+
115+
internal fun createWalletFormData(): FormData.Wallet {
116+
return FormData.Wallet(
117+
cvv = "123"
118+
)
119+
}
120+
82121
internal fun createPaymentRequestCB(): PaymentRequest = PaymentRequest(
83122
cardCode = "CB",
84123
contractNumber = "CB_01",
85124
isEmbeddedRedirectionAllowed = false,
86125
merchantReturnUrl = "http://merchant.dev.com/return/url",
87-
paymentParams = PaymentParams(
88-
network = "2",
89-
expirationDate = "1228",
90-
savePaymentData = false,
91-
holderName = "Jean-Claude"
92-
)
126+
paymentParams = createPaymentParams()
127+
)
128+
129+
internal fun createPaymentParams(): PaymentParams = PaymentParams(
130+
network = "2",
131+
expirationDate = "1228",
132+
savePaymentData = false,
133+
holderName = "Jean-Claude"
93134
)
94135

95136
internal fun createPaymentRequestGooglePay(): PaymentRequest = PaymentRequest(
@@ -173,6 +214,15 @@ class SdkTestHelper {
173214
)
174215
}
175216

217+
internal fun createPaymentAttemptWalletCB(): PaymentAttempt {
218+
return PaymentAttempt(
219+
selectedPaymentMethod = null,
220+
paymentFormData = null,
221+
selectedWallet = createWallet(),
222+
walletFormData = createWalletFormData()
223+
)
224+
}
225+
176226
internal fun createPaymentMethodCB(): PaymentMethod.Cards = PaymentMethod.Cards(
177227
paymentMethods = mutableListOf(
178228
PaymentMethod.CB(createPaymentMethodDataCB())

0 commit comments

Comments
 (0)