NTP-55511 | PS | removed card details from clickstream and added additional logging (#15755)

This commit is contained in:
Prakhar Saxena
2025-04-11 17:02:46 +05:30
committed by GitHub
parent 81fb98e046
commit d90ce4b12f
6 changed files with 101 additions and 5 deletions

View File

@@ -26,6 +26,7 @@ import com.navi.payment.nativepayment.presentation.reducer.ImageSource
import com.navi.payment.nativepayment.utils.NaviPaymentErrorConfig
import com.navi.payment.nativepayment.viewmodel.ScanCardResult
import com.navi.payment.paymentscreen.model.ErrorReason
import com.navi.payment.paymentscreen.model.NaviUpiTransactionInfo
import com.navi.payment.utils.putIfNotNullAndNotEmpty
import com.navi.payment.utils.usecases.CardValidator
import com.navi.payment.utils.usecases.ExpiryDateValidator
@@ -822,7 +823,10 @@ class NaviPaymentAnalytics private constructor() {
payload?.optString("bankErrorMessage", EMPTY),
)
putIfNotNullAndNotEmpty("juspayOrderId", payload?.optString("orderId", EMPTY))
put("response", response.toString())
put(
"response",
if (response.toString().contains("card")) "cardTxn" else response.toString(),
)
}
NaviTrackEvent.trackEventOnClickStream(
eventName = "NaviPMT_Juspay_ProcessSdkResponse",
@@ -833,7 +837,11 @@ class NaviPaymentAnalytics private constructor() {
fun onJuspaySdkLogs(log: String, logPayload: String) {
NaviTrackEvent.trackEventOnClickStream(
eventName = "NaviPMT_Juspay_SdkLogs",
eventValues = mapOf("log" to log, "log_payload" to logPayload),
eventValues =
mapOf(
"log" to log,
"log_payload" to if (logPayload.contains("card")) "cardTxn" else logPayload,
),
)
}
}
@@ -1984,6 +1992,47 @@ class NaviPaymentAnalytics private constructor() {
}
inner class SendMoneyErrorBottomSheet {
fun onSendMoneyError(
code: String,
localError: ErrorMessage? = null,
networkError: GenericErrorResponse? = null,
naviUpiTransactionInfo: NaviUpiTransactionInfo,
sourceDestination: String,
) {
val eventAttributes = buildMap {
put("error_code", code)
put("local_error", localError.toString())
put("network_error", networkError.toString())
put("navi_upi_transaction_info", naviUpiTransactionInfo.toString())
put("source_destination", sourceDestination)
}
NaviTrackEvent.trackEventOnClickStream(
eventName = "NaviPMT_SendMoneyErrorBottomSheet_ErrorReceivedDuringSendMoney",
eventValues = eventAttributes,
)
}
fun sendMoneyFailedRetryBottomSheetTriggered(
screenName: String,
errorCode: String,
isRetryExperienceEnabled: String,
upiRequestId: String,
isAmountReadOnly: Boolean = true,
baseAttributes: Map<String, String> = emptyMap(),
) {
val eventAttributes = buildMap {
put("error_code", errorCode)
put("upi_request_id", upiRequestId)
put("is_amount_read_only", isAmountReadOnly.toString())
put("is_retry_experience_enabled", isRetryExperienceEnabled)
putAll(baseAttributes)
}
NaviTrackEvent.trackEventOnClickStream(
eventName = "NaviPMT_${screenName}_SendMoneyFailedRetryBottomSheetTriggered",
eventValues = eventAttributes,
)
}
fun bottomSheetShown(
screenName: String,
errorCode: String,
@@ -2000,7 +2049,7 @@ class NaviPaymentAnalytics private constructor() {
putAll(baseAttributes)
}
NaviTrackEvent.trackEventOnClickStream(
eventName = "NaviPMT_${screenName}_SendMoneyErrorBottomSheet_Shown",
eventName = "NaviPMT_${screenName}_SendMoneyErrorBottomSheetShown",
eventValues = eventAttributes,
)
}

View File

@@ -759,6 +759,7 @@ fun MPSScreen(
)
onBackClick(PaymentCancelSource.ERROR_CANCEL_BTN_CLICKED)
},
showPayButtonLoader = showPayNowLoader,
onPayViaOtherMethodsClicked = {
sendMoneyErrorAnalytics.onPayViaOtherMethodsClicked(
screenName =
@@ -789,6 +790,16 @@ fun MPSScreen(
)
onResetUpiPinClick()
},
onPayButtonClick = {
sendMoneyErrorAnalytics.onPayButtonClicked(
screenName =
NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName,
isRetryExperienceEnabled = true,
selectedBankAccountId = selectedBankAccount?.accountId.orEmpty(),
baseAttributes = mpsViewModel.getAnalyticsParams(),
)
mpsViewModel.startPayAmount()
},
)
}
}

View File

@@ -384,11 +384,18 @@ constructor(
sendMoneyErrorAnalytics.bottomSheetShown(
screenName = NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName,
errorCode = errorCode,
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.toString(),
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(),
baseAttributes = getAnalyticsParams(),
upiRequestId = event.response.data?.upiRequestId.orEmpty(),
)
if (shouldShowPaymentRetryExperienceBottomSheet(errorBucket = errorBucket)) {
sendMoneyErrorAnalytics.sendMoneyFailedRetryBottomSheetTriggered(
screenName = NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName,
errorCode = errorCode,
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(),
baseAttributes = getAnalyticsParams(),
upiRequestId = event.response.data?.upiRequestId.orEmpty(),
)
updateBottomSheetUIState(
showBottomSheet = true,
bottomSheetUIState =

View File

@@ -348,6 +348,13 @@ constructor(
)
if (shouldShowPaymentRetryExperienceBottomSheet(errorBucket = errorBucket)) {
delay(SCREEN_TRANSITION_DURATION_IN_MILLIS.toLong())
sendMoneyErrorAnalytics.sendMoneyFailedRetryBottomSheetTriggered(
screenName = NaviPaymentAnalyticScreenName.FULL_PAYMENT_SCREEN.screenName,
errorCode = errorCode,
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.toString(),
baseAttributes = getAnalyticsParams(),
upiRequestId = event.response.data?.upiRequestId.orEmpty(),
)
updateBottomSheetUIState(
showBottomSheet = true,
bottomSheetStateChange = true,

View File

@@ -67,10 +67,12 @@ import com.navi.payment.utils.Constants.COINS_AMOUNT
import com.navi.payment.utils.Constants.COINS_CURRENCY
import com.navi.payment.utils.Constants.COINS_VALUE
import com.navi.payment.utils.Constants.IS_AMOUNT_READ_ONLY
import com.navi.payment.utils.Constants.SCREEN_TRANSITION_DURATION_IN_MILLIS
import com.navi.payment.utils.getPMSMetricInfo
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
@@ -153,11 +155,21 @@ constructor(
screenName = NaviPaymentAnalyticScreenName.ONE_CLICK_CHECKOUT_SCREEN.screenName,
errorCode = errorCode,
isAmountReadOnly = isAmountReadOnly,
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.toString(),
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(),
baseAttributes = getAnalyticsParams(),
upiRequestId = event.response.data?.upiRequestId.orEmpty(),
)
if (shouldShowPaymentRetryExperienceBottomSheet(errorBucket = errorBucket)) {
delay(SCREEN_TRANSITION_DURATION_IN_MILLIS.toLong())
sendMoneyErrorAnalytics.sendMoneyFailedRetryBottomSheetTriggered(
screenName =
NaviPaymentAnalyticScreenName.ONE_CLICK_CHECKOUT_SCREEN.screenName,
errorCode = errorCode,
isAmountReadOnly = isAmountReadOnly,
isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(),
baseAttributes = getAnalyticsParams(),
upiRequestId = event.response.data?.upiRequestId.orEmpty(),
)
updateBottomSheetUIState(
showBottomSheet = true,
bottomSheetUIState =

View File

@@ -35,6 +35,7 @@ import com.navi.pay.utils.isAccountIdOfTypeUpiLite
import com.navi.payment.model.common.SignalPaymentData
import com.navi.payment.model.paymentmethod.Amount
import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
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.ERROR_RESPONSE
@@ -134,6 +135,7 @@ constructor(
val paymentTransactionStatus = _paymentTransactionStatus.asStateFlow()
private val pollingStartTime = System.currentTimeMillis()
private val naviPaymentAnalytics = NaviPaymentAnalytics.INSTANCE.SendMoneyErrorBottomSheet()
init {
if (naviUpiTransactionInfo.isNull()) pollTransactionStatus() else executeSendMoney()
@@ -221,6 +223,14 @@ constructor(
.orEmpty(),
)
val errorCode = sendMoneyResponse.errors?.firstOrNull()?.code.orEmpty()
naviPaymentAnalytics.onSendMoneyError(
code = errorCode,
localError = sendMoneyResponse.error,
networkError = sendMoneyResponse.errors?.firstOrNull(),
naviUpiTransactionInfo = naviUpiTransactionInfo,
sourceDestination = sourceDestination,
)
eventHandler
.get()
.postSendMoneyErrorEvent(