NTP-21170 | PS | fix no token found error, added sdk params to cache repo (#14336)

This commit is contained in:
Prakhar Saxena
2024-12-26 19:00:52 +05:30
committed by GitHub
parent 8df4355a8f
commit a49771bc04
10 changed files with 103 additions and 56 deletions

View File

@@ -224,9 +224,14 @@ class NaviPaymentAnalytics private constructor() {
)
}
fun onUpiAppLaunched(selectedUpiApp: String, baseAttributes: Map<String, String>) {
fun onUpiAppLaunched(
selectedUpiApp: String,
intentUri: String,
baseAttributes: Map<String, String>
) {
val eventAttributes = buildMap {
put("selected_upi_app", selectedUpiApp)
put("intent_uri", intentUri)
putAll(baseAttributes)
}
NaviTrackEvent.trackEventOnClickStream(
@@ -380,9 +385,14 @@ class NaviPaymentAnalytics private constructor() {
)
}
fun onUpiAppLaunched(selectedUpiApp: String, baseAttributes: Map<String, String>) {
fun onUpiAppLaunched(
selectedUpiApp: String,
intentUri: String,
baseAttributes: Map<String, String>
) {
val eventAttributes = buildMap {
put("selected_upi_app", selectedUpiApp)
put("intent_uri", intentUri)
putAll(baseAttributes)
}
NaviTrackEvent.trackEventOnClickStream(

View File

@@ -7,8 +7,13 @@
package com.navi.payment.nativepayment.dataprovider
import com.google.gson.Gson
import com.navi.base.cache.model.NaviCacheEntity
import com.navi.base.cache.repository.NaviCacheRepository
import com.navi.common.utils.SoftRefLruCache
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.nativepayment.model.BasePaymentMethodResponse
import com.navi.payment.network.util.PaymentsSdkRetrofit
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.flow.MutableStateFlow
@@ -16,7 +21,12 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
@Singleton
class PaymentDataProvider @Inject constructor() {
class PaymentDataProvider
@Inject
constructor(
private val naviCacheRepository: NaviCacheRepository,
@PaymentsSdkRetrofit private val gson: Gson,
) {
private val cache: SoftRefLruCache<String, Any> = SoftRefLruCache(maxSize = 10)
private val analyticsEventParams = mutableMapOf<String, String>()
@@ -51,10 +61,11 @@ class PaymentDataProvider @Inject constructor() {
cache.remove(key)
}
fun clear() {
suspend fun clear() {
cache.clear()
analyticsEventParams.clear()
sourceEventProperties.clear()
naviCacheRepository.clear(SDK_PARAMS)
_paymentMethodResponse.update { null }
_isDiscountPreApplied.update { false }
}
@@ -86,6 +97,21 @@ class PaymentDataProvider @Inject constructor() {
_isDiscountPreApplied.update { isDiscountApplied }
}
suspend fun saveSdkInitParams(paymentSdkInitParams: PaymentSdkInitParams) {
naviCacheRepository.save(
NaviCacheEntity(
value = gson.toJson(paymentSdkInitParams),
version = 1,
key = SDK_PARAMS
)
)
}
suspend fun getSdkInitParams(): PaymentSdkInitParams? {
val sdkInitParams = naviCacheRepository.get(SDK_PARAMS)
return sdkInitParams?.let { gson.fromJson(it.value, PaymentSdkInitParams::class.java) }
}
companion object {
private const val MAX_CONSUMPTION_LIMIT = 100
private const val MAX_TTL = 60 * 60 * 1000L

View File

@@ -694,6 +694,7 @@ private fun EffectsHandler(
upiIntentResultLauncher.launch(intent)
naviPaymentAnalytics.onUpiAppLaunched(
selectedUpiApp = effect.payload.upiAppPackageName,
intentUri = effect.payload.intentUri,
baseAttributes = npsViewModel.getAnalyticsParams()
)
} catch (e: Exception) {

View File

@@ -299,8 +299,9 @@ private fun EffectsHandler(
}
is NPSBaseContract.Effect.StartUpiAppPayment -> {
naviPaymentAnalytics.onUpiAppLaunched(
effect.payload.upiAppPackageName,
upiIntentViewModel.getAnalyticsParams()
selectedUpiApp = effect.payload.upiAppPackageName,
intentUri = effect.payload.intentUri,
baseAttributes = upiIntentViewModel.getAnalyticsParams()
)
try {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(effect.payload.intentUri))

View File

@@ -21,12 +21,12 @@ import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.model.initiatesdk.PaymentPrefetchDetail
import com.navi.payment.model.initiatesdk.PaymentPrefetchMethodRequest
import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
import com.navi.payment.nativepayment.common.usecase.TransactionStatusUseCase
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ACTION_TYPE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ERROR_RESPONSE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_INITIATE_START_TIME
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SDK_PARAMS
import com.navi.payment.nativepayment.model.NaviPaymentScreenType
import com.navi.payment.nativepayment.model.NetBankingPaymentInstrument
import com.navi.payment.nativepayment.model.PaymentActionType
@@ -49,6 +49,7 @@ import com.navi.payment.utils.getPMSMetricInfo
import com.navi.paymentclients.model.thirdparty.UpiResultResponse
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import org.json.JSONObject
@@ -63,6 +64,7 @@ constructor(
@PaymentsSdkRetrofit private val deserializer: Gson,
private val netBankingUseCase: NetBankingUseCase,
private val pmsLinkedAccountUseCase: PmsLinkedAccountUseCase,
private val transactionStatusUseCase: TransactionStatusUseCase,
private val litmusExperimentsUseCase: LitmusExperimentsUseCase
) : NaviPaymentBaseVM(NaviPaymentAnalyticScreenName.CHECKOUT_SCREEN.screenName) {
@@ -132,7 +134,7 @@ constructor(
PaymentErrorData(error = error, errorReason = PMSErrorReason.GetMethodsError)
)
}
paymentDataProvider.add(SDK_PARAMS, paymentSdkInitParams)
paymentDataProvider.saveSdkInitParams(paymentSdkInitParams)
paymentDataProvider.add(
SCREEN_TYPE,
(response.data as? S2sPaymentMethodResponse)?.methodDetails?.paymentScreenType
@@ -147,6 +149,9 @@ constructor(
)
_paymentResponse.emit(true)
}
viewModelScope.safeLaunch(Dispatchers.IO) {
transactionStatusUseCase.postTransactionStatusRequest()
}
}
private fun fetchPmsExperimentsData(paymentSource: String) {
@@ -194,7 +199,7 @@ constructor(
}
}
private fun clearPaymentData() {
private suspend fun clearPaymentData() {
paymentDataProvider.clear()
pmsLinkedAccountUseCase.clear()
}

View File

@@ -39,7 +39,6 @@ import com.navi.payment.juspay.JusPayCardConstants.PAYMENT_METHOD
import com.navi.payment.juspay.JusPayCardConstants.RESP_ERROR
import com.navi.payment.juspay.JuspayCallbackWrapper
import com.navi.payment.model.clientmodels.juspay.JuspaySDKEvents
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.model.common.SignalPaymentData
import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
import com.navi.payment.nativepayment.NaviPaymentAnalytics
@@ -146,12 +145,7 @@ constructor(
init {
recordScreenLandTime(NaviPaymentAnalyticScreenName.CARD_SCREEN.screenName)
processPaymentMethodResponse()
updateInternalState(internalState.copy(paymentSdkInitParams = getSDKInitParams()))
baseAnalyticsParams.apply {
put(TOKEN, internalState.paymentSdkInitParams?.token.orEmpty())
put(SOURCE, internalState.paymentSdkInitParams?.paymentSource.orEmpty())
put(CATEGORY_ID, internalState.paymentSdkInitParams?.categoryId.orEmpty())
}
updateSDKInitParams()
isInteractionAllowed = true
}
@@ -298,8 +292,16 @@ constructor(
internalState = newState
}
private fun getSDKInitParams(): PaymentSdkInitParams? {
return (paymentDataProvider.get(PaymentDataProvider.SDK_PARAMS) as? PaymentSdkInitParams)
private fun updateSDKInitParams() {
viewModelScope.safeLaunch {
val sdkInitParams = paymentDataProvider.getSdkInitParams()
updateInternalState(internalState.copy(paymentSdkInitParams = sdkInitParams))
baseAnalyticsParams.apply {
put(TOKEN, sdkInitParams?.token.orEmpty())
put(SOURCE, sdkInitParams?.paymentSource.orEmpty())
put(CATEGORY_ID, sdkInitParams?.categoryId.orEmpty())
}
}
}
override fun onEvent(event: CardDetailScreenEvent) {

View File

@@ -45,7 +45,6 @@ import com.navi.payment.nativepayment.NaviPaymentAnalytics
import com.navi.payment.nativepayment.common.usecase.TransactionStatusUseCase
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_ORDER_REFERENCE_ID
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.TRANSACTION_REFERENCE_ID
import com.navi.payment.nativepayment.db.model.TransactionStatus
import com.navi.payment.nativepayment.db.model.TransactionStatusRequestEntity
@@ -82,7 +81,6 @@ import com.navi.payment.turbocheckout.ui.PayNowState
import com.navi.payment.utils.Constants
import com.navi.payment.utils.Constants.COIN_DISCOUNT_APPLY_DELAY
import com.navi.payment.utils.Constants.LINKED_ACCOUNT_SYNC_DELAY
import com.navi.payment.utils.Constants.MINI_PAYMENT_SCREEN
import com.navi.payment.utils.Constants.SCREEN_NAME
import com.navi.payment.utils.getPMSMetricInfo
import com.navi.payment.utils.roundTo
@@ -204,27 +202,14 @@ constructor(
init {
recordScreenLandTime(screenName)
recordApiStartTime(screenName)
initSdkInitParams()
getPaymentMethodData()
viewModelScope.launch {
updateSDKInitParams()
getPaymentMethodData()
}
viewModelScope.launch(Dispatchers.IO) { getNaviUpiConnectedAccounts() }
viewModelScope.safeLaunch { collectIsDiscountAlreadyApplied() }
}
private fun initSdkInitParams() {
paymentSdkInitParams = getSDKInitParams()
paymentDataProvider.updateAnalyticsParams(
mapOf(
SCREEN_NAME to NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName,
"source" to paymentSdkInitParams?.paymentSource.orEmpty(),
"category_id" to paymentSdkInitParams?.categoryId.orEmpty(),
"token" to paymentSdkInitParams?.token.orEmpty(),
"payment_method" to "UPI_LINKED_BANK_ACCOUNTS",
"payment_sdk_type" to "compose",
"is_navi_upi_onboarded" to naviPayManager.isUserOnboarded().toString()
)
)
}
private fun getPaymentMethodData() {
viewModelScope.launch {
val errorData =
@@ -471,8 +456,19 @@ constructor(
_payNowResponse.update { PayNowState.Nothing }
}
private fun getSDKInitParams(): PaymentSdkInitParams? {
return (paymentDataProvider.get(PaymentDataProvider.SDK_PARAMS) as? PaymentSdkInitParams)
private suspend fun updateSDKInitParams() {
paymentSdkInitParams = paymentDataProvider.getSdkInitParams()
paymentDataProvider.updateAnalyticsParams(
mapOf(
SCREEN_NAME to NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName,
"source" to paymentSdkInitParams?.paymentSource.orEmpty(),
"category_id" to paymentSdkInitParams?.categoryId.orEmpty(),
"token" to paymentSdkInitParams?.token.orEmpty(),
"payment_method" to "UPI_LINKED_BANK_ACCOUNTS",
"payment_sdk_type" to "compose",
"is_navi_upi_onboarded" to naviPayManager.isUserOnboarded().toString()
)
)
}
fun refreshMPSScreen() {

View File

@@ -75,9 +75,11 @@ abstract class NPSBaseViewModel(
init {
viewModelScope.launch(Dispatchers.IO) {
updateSdkInitParams()
launch(Dispatchers.IO) { getNaviUpiConnectedAccounts() }
launch(Dispatchers.IO) { processPaymentMethods() }
launch(Dispatchers.IO) {
updateSdkInitParams()
processPaymentMethods()
}
launch(Dispatchers.IO) { vpaHandleChangeObserver() }
}
}
@@ -98,9 +100,8 @@ abstract class NPSBaseViewModel(
abstract fun getMainCtaState(): PaymentsMainCtaState
private fun updateSdkInitParams() {
paymentSdkInitParams =
(paymentDataProvider.get(PaymentDataProvider.SDK_PARAMS) as? PaymentSdkInitParams)
private suspend fun updateSdkInitParams() {
paymentSdkInitParams = paymentDataProvider.getSdkInitParams()
}
private suspend fun getNaviUpiConnectedAccounts() {

View File

@@ -13,7 +13,6 @@ import com.navi.common.usecase.SyncLitmusExperimentUseCase
import com.navi.payment.analytics.NaviPaymentScreenAnalytics
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
import com.navi.payment.nativepayment.common.usecase.TransactionStatusUseCase
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_INITIATE_START_TIME
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE
@@ -21,7 +20,6 @@ import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion
import com.navi.payment.nativepayment.model.NaviPaymentScreenType
import com.navi.payment.nativepayment.model.PaymentActionType
import com.navi.payment.nativepayment.repository.PaymentRepository
import com.navi.payment.nativepayment.usecase.PmsLinkedAccountUseCase
import com.navi.payment.paymentscreen.model.PaymentFeedbackConfig
import com.navi.payment.paymentscreen.model.PaymentFeedbackRequest
import com.navi.payment.utils.Constants.LITMUS_EXPERIMENT_NAVI_PMT_NPS_MIGRATION
@@ -38,22 +36,19 @@ constructor(
private val paymentDataProvider: PaymentDataProvider,
private val paymentRepository: PaymentRepository,
private val syncLitmusExperimentsUseCase: SyncLitmusExperimentUseCase,
private val transactionStatusUseCase: TransactionStatusUseCase,
private val pmsLinkedAccountUseCase: PmsLinkedAccountUseCase,
) : NaviPaymentBaseVM(NaviPaymentAnalyticScreenName.PAYMENT_SCREEN.screenName) {
var paymentSdkInitParams: PaymentSdkInitParams? = null
private var paymentSdkInitParams: PaymentSdkInitParams? = null
init {
paymentSdkInitParams = getSDKInitParams()
viewModelScope.safeLaunch {
getSDKInitParams()
syncLitmusExperimentsUseCase.execute(experiments = PMS_LITMUS_EXPERIMENTS)
transactionStatusUseCase.postTransactionStatusRequest()
}
}
private fun getSDKInitParams(): PaymentSdkInitParams? {
return (paymentDataProvider.get(PaymentDataProvider.SDK_PARAMS) as? PaymentSdkInitParams)
private suspend fun getSDKInitParams() {
paymentSdkInitParams = paymentDataProvider.getSdkInitParams()
}
private val naviPayAnalytics: NaviPaymentScreenAnalytics.TurboCheckoutAnalytics =

View File

@@ -11,6 +11,9 @@ import androidx.lifecycle.viewModelScope
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.model.common.SignalPaymentData
import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
import com.navi.payment.nativepayment.NaviPaymentAnalytics.Companion.CATEGORY_ID
import com.navi.payment.nativepayment.NaviPaymentAnalytics.Companion.SOURCE
import com.navi.payment.nativepayment.NaviPaymentAnalytics.Companion.TOKEN
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider
import com.navi.payment.nativepayment.model.SdkPaymentMethodResponse
import com.navi.payment.nativepayment.presentation.reducer.SdkIntegrationEffect
@@ -57,7 +60,7 @@ constructor(
init {
processPaymentMethodResponse()
paymentSdkInitParams = getSDKInitParams()
updateSDKInitParams()
baseAnalyticsParams.apply {
put("token", paymentSdkInitParams?.token.orEmpty())
put("source", paymentSdkInitParams?.paymentSource.orEmpty())
@@ -65,8 +68,15 @@ constructor(
}
}
private fun getSDKInitParams(): PaymentSdkInitParams? {
return (paymentDataProvider.get(PaymentDataProvider.SDK_PARAMS) as? PaymentSdkInitParams)
private fun updateSDKInitParams() {
viewModelScope.safeLaunch {
paymentSdkInitParams = paymentDataProvider.getSdkInitParams()
baseAnalyticsParams.apply {
put(TOKEN, paymentSdkInitParams?.token.orEmpty())
put(SOURCE, paymentSdkInitParams?.paymentSource.orEmpty())
put(CATEGORY_ID, paymentSdkInitParams?.categoryId.orEmpty())
}
}
}
private fun processPaymentMethodResponse() {