Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CardClient/ PayPalWebCheckout Analytics Audit #312

Closed
wants to merge 4 commits into from
Closed
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 14 additions & 18 deletions Sources/CardPayments/CardClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -113,19 +113,15 @@ public class CardClient: NSObject {
return
}

analyticsService?.sendEvent("card-payments:3ds:confirm-payment-source:challenge-required")
analyticsService?.sendEvent("card-payments:approve-order:auth-challenge-required")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
analyticsService?.sendEvent("card-payments:approve-order:auth-challenge-required")
analyticsService?.sendEvent("card-payments:approve-order:payer-action-required")

I wonder if we should start aligning our naming conventions with PPaaS more? I've been back and forth for a while, but it may be helpful for migrating merchants with direct integrations to our SDK since they'll be familiar with the terminology.

It may be out of scope for this PR, but it applies throughout the SDK e.g. we could rename CardClient.approveOrder() to CardClient.confirmPaymentSource() etc. Does that sound worthwhile?

Copy link
Collaborator Author

@KunJeongPark KunJeongPark Dec 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a bit confusing. For some reason we had both in iOS, confirm-payment-source events and approve-order final events. So we simplified it to just approve-order, following Android implementation.

I thought about the naming and it'd be a bit confusing to have convention of API name because for instance, PayPal web module just presents the pages. I think following function name as you did makes sense.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right yeah it's the same for us on Android. PayPal always shows an auth challenge. On the other hand, for Android Card we have a 2-step process since not all payment source confirmations require 3DS. They may succeed on the first CardClient.approveOrder(). It's also a 2-step process on Android mostly because of process kill.

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")
notifyCheckoutFailure(with: error, completion: completion)
} catch {
analyticsService?.sendEvent("card-payments:3ds:confirm-payment-source:failed")
notifyCheckoutFailure(with: CardError.unknownError, completion: completion)
}
}
Expand Down Expand Up @@ -161,9 +157,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
Expand Down Expand Up @@ -201,9 +197,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
Expand All @@ -225,32 +221,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)
}
}
Expand Down