From 9b1fb411aea815655ab0695f23214f0ee072b76b Mon Sep 17 00:00:00 2001 From: Victoria Park Date: Fri, 6 Dec 2024 10:56:48 -0800 Subject: [PATCH 1/4] CardClient analytics audit Co-authored-by: Suraj Dhopati --- Sources/CardPayments/CardClient.swift | 34 +++++++++++++-------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Sources/CardPayments/CardClient.swift b/Sources/CardPayments/CardClient.swift index d9195a3d..65e475ca 100644 --- a/Sources/CardPayments/CardClient.swift +++ b/Sources/CardPayments/CardClient.swift @@ -45,7 +45,7 @@ public class CardClient: NSObject { /// if it fails, `CardVaultResult will be `nil` and `error` will describe the failure public func vault(_ vaultRequest: CardVaultRequest, completion: @escaping (CardVaultResult?, CoreSDKError?) -> Void) { analyticsService = AnalyticsService(coreConfig: config, setupToken: vaultRequest.setupTokenID) - analyticsService?.sendEvent("card-payments:vault-wo-purchase:started") + analyticsService?.sendEvent("card-payments:vault:started") Task { do { let result = try await vaultAPI.updateSetupToken(cardVaultRequest: vaultRequest).updateVaultSetupToken @@ -56,7 +56,7 @@ public class CardClient: NSObject { self.notifyVaultFailure(with: CardError.threeDSecureURLError, completion: completion) return } - analyticsService?.sendEvent("card-payments:vault-wo-purchase:challenge-required") + analyticsService?.sendEvent("card-payments:vault:challenge-required") startVaultThreeDSecureChallenge(url: url, setupTokenID: vaultRequest.setupTokenID, completion: completion) } else { let vaultResult = CardVaultResult(setupTokenID: result.id, status: result.status, didAttemptThreeDSecureAuthentication: false) @@ -99,7 +99,7 @@ public class CardClient: NSObject { /// if it fails, `CardResult will be `nil` and `error` will describe the failure public func approveOrder(request: CardRequest, completion: @escaping (CardResult?, CoreSDKError?) -> Void) { analyticsService = AnalyticsService(coreConfig: config, orderID: request.orderID) - analyticsService?.sendEvent("card-payments:3ds:started") + analyticsService?.sendEvent("card-payments:approve-order:started") Task { do { let result = try await checkoutOrdersAPI.confirmPaymentSource(cardRequest: request) @@ -113,19 +113,17 @@ public class CardClient: NSObject { return } - analyticsService?.sendEvent("card-payments:3ds:confirm-payment-source:challenge-required") + analyticsService?.sendEvent("card-payments:approve-order:challenge-required") startThreeDSecureChallenge(url: url, orderId: result.id, completion: completion) } else { - analyticsService?.sendEvent("card-payments:3ds:confirm-payment-source:succeeded") - let cardResult = CardResult(orderID: result.id, status: result.status, didAttemptThreeDSecureAuthentication: false) notifyCheckoutSuccess(for: cardResult, completion: completion) } } catch let error as CoreSDKError { - analyticsService?.sendEvent("card-payments:3ds:confirm-payment-source:failed") + analyticsService?.sendEvent("card-payments:confirm-payment-source:failed") notifyCheckoutFailure(with: error, completion: completion) } catch { - analyticsService?.sendEvent("card-payments:3ds:confirm-payment-source:failed") + analyticsService?.sendEvent("card-payments:confirm-payment-source:failed") notifyCheckoutFailure(with: CardError.unknownError, completion: completion) } } @@ -161,9 +159,9 @@ public class CardClient: NSObject { context: self, sessionDidDisplay: { [weak self] didDisplay in if didDisplay { - self?.analyticsService?.sendEvent("card-payments:3ds:challenge-presentation:succeeded") + self?.analyticsService?.sendEvent("card-payments:approve-order:auth-challenge-presentation:succeeded") } else { - self?.analyticsService?.sendEvent("card-payments:3ds:challenge-presentation:failed") + self?.analyticsService?.sendEvent("card-payments:approve-order:auth-challenge-presentation:failed") } }, sessionDidComplete: { _, error in @@ -201,9 +199,9 @@ public class CardClient: NSObject { sessionDidDisplay: { [weak self] didDisplay in if didDisplay { // TODO: analytics for card vault - self?.analyticsService?.sendEvent("card-payments:3ds:challenge-presentation:succeeded") + self?.analyticsService?.sendEvent("card-payments:vault:auth-challenge-presentation:succeeded") } else { - self?.analyticsService?.sendEvent("card-payments:3ds:challenge-presentation:failed") + self?.analyticsService?.sendEvent("card-payments:vault:auth-challenge-presentation:failed") } }, sessionDidComplete: { _, error in @@ -225,32 +223,32 @@ public class CardClient: NSObject { } private func notifyCheckoutSuccess(for result: CardResult, completion: (CardResult?, CoreSDKError?) -> Void) { - analyticsService?.sendEvent("card-payments:3ds:succeeded") + analyticsService?.sendEvent("card-payments:approve-order:succeeded") completion(result, nil) } private func notifyCheckoutFailure(with error: CoreSDKError, completion: (CardResult?, CoreSDKError?) -> Void) { - analyticsService?.sendEvent("card-payments:3ds:failed") + analyticsService?.sendEvent("card-payments:approve-order:failed") completion(nil, error) } private func notifyCheckoutCancelWithError(with error: CoreSDKError, completion: (CardResult?, CoreSDKError?) -> Void) { - analyticsService?.sendEvent("card-payments:3ds:challenge:user-canceled") + analyticsService?.sendEvent("card-payments:approve-order:auth-challenge:canceled") completion(nil, error) } private func notifyVaultSuccess(for vaultResult: CardVaultResult, completion: (CardVaultResult?, CoreSDKError?) -> Void) { - analyticsService?.sendEvent("card-payments:vault-wo-purchase:succeeded") + analyticsService?.sendEvent("card-payments:vault:succeeded") completion(vaultResult, nil) } private func notifyVaultFailure(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) { - analyticsService?.sendEvent("card-payments:vault-wo-purchase:failed") + analyticsService?.sendEvent("card-payments:vault:failed") completion(nil, vaultError) } private func notifyVaultCancelWithError(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) { - analyticsService?.sendEvent("card-payments:vault-wo-purchase:challenge:canceled") + analyticsService?.sendEvent("card-payments:vault:auth-challenge:canceled") completion(nil, vaultError) } } From 14896e1c5a0da3d6fee062f5cf5942a269cbbe72 Mon Sep 17 00:00:00 2001 From: Victoria Park Date: Fri, 6 Dec 2024 11:18:55 -0800 Subject: [PATCH 2/4] Remove confirm-payment-source analytics Co-authored-by: Suraj Dhopati --- Sources/CardPayments/CardClient.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Sources/CardPayments/CardClient.swift b/Sources/CardPayments/CardClient.swift index 65e475ca..9085ca65 100644 --- a/Sources/CardPayments/CardClient.swift +++ b/Sources/CardPayments/CardClient.swift @@ -120,10 +120,8 @@ public class CardClient: NSObject { notifyCheckoutSuccess(for: cardResult, completion: completion) } } catch let error as CoreSDKError { - analyticsService?.sendEvent("card-payments:confirm-payment-source:failed") notifyCheckoutFailure(with: error, completion: completion) } catch { - analyticsService?.sendEvent("card-payments:confirm-payment-source:failed") notifyCheckoutFailure(with: CardError.unknownError, completion: completion) } } From a11d2833331fd83a301016a5b843697df03f37cf Mon Sep 17 00:00:00 2001 From: Victoria Park Date: Fri, 6 Dec 2024 11:25:09 -0800 Subject: [PATCH 3/4] Typo on approve order challenge required Co-authored-by: Suraj Dhopati --- Sources/CardPayments/CardClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CardPayments/CardClient.swift b/Sources/CardPayments/CardClient.swift index 9085ca65..0be1dbde 100644 --- a/Sources/CardPayments/CardClient.swift +++ b/Sources/CardPayments/CardClient.swift @@ -113,7 +113,7 @@ public class CardClient: NSObject { return } - analyticsService?.sendEvent("card-payments:approve-order:challenge-required") + analyticsService?.sendEvent("card-payments:approve-order:auth-challenge-required") startThreeDSecureChallenge(url: url, orderId: result.id, completion: completion) } else { let cardResult = CardResult(orderID: result.id, status: result.status, didAttemptThreeDSecureAuthentication: false) From 182cd0c6547dcd82dbebd5510f09558701d6fe57 Mon Sep 17 00:00:00 2001 From: Victoria Park Date: Fri, 6 Dec 2024 12:38:14 -0800 Subject: [PATCH 4/4] Steven PR feedback: separate 3ds success/fail events --- Sources/CardPayments/CardClient.swift | 28 +++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Sources/CardPayments/CardClient.swift b/Sources/CardPayments/CardClient.swift index 0be1dbde..16c76580 100644 --- a/Sources/CardPayments/CardClient.swift +++ b/Sources/CardPayments/CardClient.swift @@ -169,13 +169,13 @@ public class CardClient: NSObject { self.notifyCheckoutCancelWithError(with: CardError.threeDSecureCanceledError, completion: completion) return default: - self.notifyCheckoutFailure(with: CardError.threeDSecureError(error), completion: completion) + self.notifyCheckout3dsFailure(with: CardError.threeDSecureError(error), completion: completion) return } } let cardResult = CardResult(orderID: orderId, status: nil, didAttemptThreeDSecureAuthentication: true) - self.notifyCheckoutSuccess(for: cardResult, completion: completion) + self.notifyCheckout3dsSuccess(for: cardResult, completion: completion) } ) } @@ -209,13 +209,13 @@ public class CardClient: NSObject { self.notifyVaultCancelWithError(with: CardError.threeDSecureCanceledError, completion: completion) return default: - self.notifyVaultFailure(with: CardError.threeDSecureError(error), completion: completion) + self.notifyVault3dsFailure(with: CardError.threeDSecureError(error), completion: completion) return } } let cardVaultResult = CardVaultResult(setupTokenID: setupTokenID, status: nil, didAttemptThreeDSecureAuthentication: true) - self.notifyVaultSuccess(for: cardVaultResult, completion: completion) + self.notifyVault3dsSuccess(for: cardVaultResult, completion: completion) } ) } @@ -225,11 +225,21 @@ public class CardClient: NSObject { completion(result, nil) } + private func notifyCheckout3dsSuccess(for result: CardResult, completion: (CardResult?, CoreSDKError?) -> Void) { + analyticsService?.sendEvent("card-payments:approve-order:auth-challenge:succeeded") + completion(result, nil) + } + private func notifyCheckoutFailure(with error: CoreSDKError, completion: (CardResult?, CoreSDKError?) -> Void) { analyticsService?.sendEvent("card-payments:approve-order:failed") completion(nil, error) } + private func notifyCheckout3dsFailure(with error: CoreSDKError, completion: (CardResult?, CoreSDKError?) -> Void) { + analyticsService?.sendEvent("card-payments:approve-order:auth-challenge:failed") + completion(nil, error) + } + private func notifyCheckoutCancelWithError(with error: CoreSDKError, completion: (CardResult?, CoreSDKError?) -> Void) { analyticsService?.sendEvent("card-payments:approve-order:auth-challenge:canceled") completion(nil, error) @@ -240,11 +250,21 @@ public class CardClient: NSObject { completion(vaultResult, nil) } + private func notifyVault3dsSuccess(for vaultResult: CardVaultResult, completion: (CardVaultResult?, CoreSDKError?) -> Void) { + analyticsService?.sendEvent("card-payments:vault:auth-challenge:succeeded") + completion(vaultResult, nil) + } + private func notifyVaultFailure(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) { analyticsService?.sendEvent("card-payments:vault:failed") completion(nil, vaultError) } + private func notifyVault3dsFailure(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) { + analyticsService?.sendEvent("card-payments:vault:auth-challenge:failed") + completion(nil, vaultError) + } + private func notifyVaultCancelWithError(with vaultError: CoreSDKError, completion: (CardVaultResult?, CoreSDKError?) -> Void) { analyticsService?.sendEvent("card-payments:vault:auth-challenge:canceled") completion(nil, vaultError)