Skip to content

Commit

Permalink
Send merchant_support_async flag to do server side filtering (#1367)
Browse files Browse the repository at this point in the history
  • Loading branch information
wooj-stripe authored Sep 9, 2022
1 parent f2f4e8e commit 8e45325
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 6 deletions.
9 changes: 9 additions & 0 deletions Stripe/AddPaymentMethodViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@ class AddPaymentMethodViewController: UIViewController {
PaymentSheet.supportedLinkPaymentMethods : PaymentSheet.supportedPaymentMethods
)
}

let serverFilteredPaymentMethods = PaymentSheet.PaymentMethodType.recommendedPaymentMethodTypes(from: intent).filter({$0 != .USBankAccount})
let paymentTypesFiltered = paymentTypes.filter({$0 != .USBankAccount})
if serverFilteredPaymentMethods != paymentTypesFiltered {
let result = serverFilteredPaymentMethods.symmetricDifference(paymentTypes)
STPAnalyticsClient.sharedClient.logClientFilteredPaymentMethods(clientFilteredPaymentMethods: result.stringList())
} else {
STPAnalyticsClient.sharedClient.logClientFilteredPaymentMethodsNone()
}
return paymentTypes
}()
var selectedPaymentMethodType: PaymentSheet.PaymentMethodType {
Expand Down
21 changes: 20 additions & 1 deletion Stripe/PaymentMethodType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import UIKit
@_spi(STP) import StripeCore
@_spi(STP) import StripeUICore
extension PaymentSheet {
public enum PaymentMethodType: Equatable {
public enum PaymentMethodType: Equatable, Hashable {

func supportsAddingRequirements() -> [PaymentMethodTypeRequirement] {
switch(self) {
Expand Down Expand Up @@ -232,3 +232,22 @@ extension STPPaymentMethodParams {
}
}
}

extension Array where Element == PaymentSheet.PaymentMethodType {
func stringList() -> String {
var stringList: [String] = []
for paymentType in self {
let type = PaymentSheet.PaymentMethodType.string(from: paymentType) ?? "unknown"
stringList.append(type)
}
guard let data = try? JSONSerialization.data(withJSONObject: stringList, options: []) else {
return "[]"
}
return String(data: data, encoding: .utf8) ?? "[]"
}
func symmetricDifference(_ other: Array) -> Array where Element == PaymentSheet.PaymentMethodType {
let set1 = Set(self)
let set2 = Set(other)
return Array(set1.symmetricDifference(set2))
}
}
6 changes: 4 additions & 2 deletions Stripe/PaymentSheet+API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,10 @@ extension PaymentSheet {
}
intentPromise.resolve(with: .paymentIntent(paymentIntent))
}

configuration.apiClient.retrievePaymentIntentWithPreferences(withClientSecret: clientSecret) { result in
let additionalParameters = ["merchant_support_async": configuration.allowsDelayedPaymentMethods]
configuration.apiClient.retrievePaymentIntentWithPreferences(
withClientSecret: clientSecret,
additionalParameters: additionalParameters) { result in
switch result {
case .success(let paymentIntent):
paymentIntentHandlerCompletionBlock(paymentIntent)
Expand Down
4 changes: 4 additions & 0 deletions Stripe/STPAPIClient+Payments.swift
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,7 @@ extension STPAPIClient {

func retrievePaymentIntentWithPreferences(
withClientSecret secret: String,
additionalParameters: [String: Any] = [:],
completion: @escaping STPPaymentIntentWithPreferencesCompletionBlock
) {
var parameters: [String: Any] = [:]
Expand All @@ -975,6 +976,9 @@ extension STPAPIClient {
parameters["client_secret"] = secret
parameters["type"] = "payment_intent"
parameters["expand"] = ["payment_method_preference.payment_intent.payment_method"]
for (apKey, apValue) in additionalParameters {
parameters[apKey] = apValue
}

if let languageCode = Locale.current.languageCode,
let regionCode = Locale.current.regionCode {
Expand Down
6 changes: 6 additions & 0 deletions Stripe/STPAnalyticsClient+LUXE.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,10 @@ extension STPAnalyticsClient {
func logLUXESerializeFailure() {
self.logPaymentSheetEvent(event: .luxeSerializeFailure)
}
func logClientFilteredPaymentMethods(clientFilteredPaymentMethods: String) {
self.logPaymentSheetEvent(event: .luxeClientFilteredPaymentMethods, params: ["client_filtered_payment_methods": clientFilteredPaymentMethods])
}
func logClientFilteredPaymentMethodsNone() {
self.logPaymentSheetEvent(event: .luxeClientFilteredPaymentMethodsNone)
}
}
7 changes: 5 additions & 2 deletions Stripe/STPAnalyticsClient+PaymentSheet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,8 @@ extension STPAnalyticsClient {
duration: TimeInterval? = nil,
linkEnabled: Bool? = nil,
activeLinkSession: Bool? = nil,
configuration: PaymentSheet.Configuration? = nil
configuration: PaymentSheet.Configuration? = nil,
params: [String: Any] = [:]
) {
var additionalParams = [:] as [String: Any]
if isSimulatorOrTest {
Expand All @@ -226,7 +227,9 @@ extension STPAnalyticsClient {
additionalParams["active_link_session"] = activeLinkSession
additionalParams["session_id"] = AnalyticsHelper.shared.sessionID
additionalParams["mpe_config"] = configuration?.analyticPayload

for (param, param_value) in params {
additionalParams[param] = param_value
}
let analytic = PaymentSheetAnalytic(event: event,
paymentConfiguration: nil,
productUsage: productUsage,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ import Foundation

// MARK: - LUXE
case luxeSerializeFailure = "luxe_serialize_failure"

case luxeClientFilteredPaymentMethods = "luxe_client_filtered_payment_methods"
case luxeClientFilteredPaymentMethodsNone = "luxe_client_filtered_payment_methods_none"

// MARK: Address Element
case adddressShow = "mc_address_show"
case addressCompleted = "mc_addres_completed"
Expand Down
47 changes: 47 additions & 0 deletions Tests/Tests/PaymentSheetPaymentMethodTypeTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,53 @@ class PaymentSheetPaymentMethodTypeTest: XCTestCase {
configuration: configuration,
intent: intent))
}
func testArrayToString() {
let paymentMethodTypes: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay")]

let strList = paymentMethodTypes.stringList()

XCTAssertEqual(strList, "[\"card\",\"llammaPay\"]")
}
func testArrayToString_empty() {
let paymentMethodTypes: [PaymentSheet.PaymentMethodType] = []

let strList = paymentMethodTypes.stringList()

XCTAssertEqual(strList, "[]")
}
func testSymmetricDifference_same() {
let paymentMethodTypes1: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay")]
let paymentMethodTypes2: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay")]

let result = paymentMethodTypes1.symmetricDifference(paymentMethodTypes2)

XCTAssertEqual(result, [])
}
func testSymmetricDifference_difference1() {
let paymentMethodTypes1: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay"), .dynamic("wechatpay")]
let paymentMethodTypes2: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay")]

let result = paymentMethodTypes1.symmetricDifference(paymentMethodTypes2)

XCTAssertEqual(result, [.dynamic("wechatpay")])
}
func testSymmetricDifference_difference2() {
let paymentMethodTypes1: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay")]
let paymentMethodTypes2: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay"), .dynamic("wechatpay")]

let result = paymentMethodTypes1.symmetricDifference(paymentMethodTypes2)

XCTAssertEqual(result, [.dynamic("wechatpay")])
}
func testSymmetricDifference_differenceInBoth() {
let paymentMethodTypes1: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay"), .dynamic("wechatpay")]
let paymentMethodTypes2: [PaymentSheet.PaymentMethodType] = [.card, .dynamic("llammaPay"), .dynamic("affirm")]

let result = paymentMethodTypes1.symmetricDifference(paymentMethodTypes2)

XCTAssertTrue(result == [.dynamic("wechatpay"), .dynamic("affirm")] ||
result == [.dynamic("affirm"), .dynamic("wechatpay")])
}


private func constructPI(paymentMethodTypes: [String],
Expand Down

0 comments on commit 8e45325

Please sign in to comment.