Skip to content

Commit 72ff6a5

Browse files
Add missing FPX bank support
1 parent 1802a88 commit 72ff6a5

6 files changed

Lines changed: 199 additions & 310 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
The next release's version bump will so far be:
2-
PATCH
2+
MINOR
33

44
## X.Y.Z - changes pending release
5+
### Payments
6+
* [Added] Added support for the following FPX banks: Agrobank, Bank of China, Deutsche Bank, Public Bank Enterprise, MBSB Bank, BNP Paribas, and Citibank.
57

68
## 26.5.0 2026-08-03
79
### CryptoOnramp (Alpha)

Stripe/StripeiOSTests/STPFPXBankBrandTest.swift

Lines changed: 33 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,73 +10,46 @@
1010
@_spi(STP) import StripePayments
1111

1212
class STPFPXBankBrandTest: XCTestCase {
13+
/// Expected API identifier and display name for every bank brand.
14+
private static let expectedValues: [STPFPXBankBrand: (id: String, name: String)] = [
15+
.affinBank: (id: "affin_bank", name: "Affin Bank"),
16+
.allianceBank: (id: "alliance_bank", name: "Alliance Bank"),
17+
.ambank: (id: "ambank", name: "AmBank"),
18+
.bankIslam: (id: "bank_islam", name: "Bank Islam"),
19+
.bankMuamalat: (id: "bank_muamalat", name: "Bank Muamalat"),
20+
.bankRakyat: (id: "bank_rakyat", name: "Bank Rakyat"),
21+
.BSN: (id: "bsn", name: "BSN"),
22+
.CIMB: (id: "cimb", name: "CIMB Clicks"),
23+
.hongLeongBank: (id: "hong_leong_bank", name: "Hong Leong Bank"),
24+
.HSBC: (id: "hsbc", name: "HSBC BANK"),
25+
.KFH: (id: "kfh", name: "KFH"),
26+
.maybank2E: (id: "maybank2e", name: "Maybank2E"),
27+
.maybank2U: (id: "maybank2u", name: "Maybank2U"),
28+
.ocbc: (id: "ocbc", name: "OCBC Bank"),
29+
.publicBank: (id: "public_bank", name: "Public Bank"),
30+
.RHB: (id: "rhb", name: "RHB Bank"),
31+
.standardChartered: (id: "standard_chartered", name: "Standard Chartered"),
32+
.UOB: (id: "uob", name: "UOB Bank"),
33+
.agrobank: (id: "agrobank", name: "Agrobank"),
34+
.bankOfChina: (id: "bank_of_china", name: "Bank of China"),
35+
.deutscheBank: (id: "deutsche_bank", name: "Deutsche Bank"),
36+
.publicBankEnterprise: (id: "pb_enterprise", name: "Public Bank Enterprise"),
37+
.mbsb_bank: (id: "mbsb_bank", name: "MBSB Bank"),
38+
.bnp_paribas: (id: "bnp_paribas", name: "BNP Paribas"),
39+
.citibank: (id: "citibank", name: "Citibank"),
40+
.unknown: (id: "unknown", name: "Unknown"),
41+
]
42+
1343
func testStringFromBrand() {
1444
for brand in STPFPXBankBrand.allCases {
1545
let brandName = STPFPXBank.stringFrom(brand)
1646
let brandID = STPFPXBank.identifierFrom(brand)
1747
let reverseTransformedBrand = STPFPXBank.brandFrom(brandID)
1848
XCTAssertEqual(reverseTransformedBrand, brand)
1949

20-
switch brand {
21-
case .affinBank:
22-
XCTAssertEqual(brandID, "affin_bank")
23-
XCTAssertEqual(brandName, "Affin Bank")
24-
case .allianceBank:
25-
XCTAssertEqual(brandID, "alliance_bank")
26-
XCTAssertEqual(brandName, "Alliance Bank")
27-
case .ambank:
28-
XCTAssertEqual(brandID, "ambank")
29-
XCTAssertEqual(brandName, "AmBank")
30-
case .bankIslam:
31-
XCTAssertEqual(brandID, "bank_islam")
32-
XCTAssertEqual(brandName, "Bank Islam")
33-
case .bankMuamalat:
34-
XCTAssertEqual(brandID, "bank_muamalat")
35-
XCTAssertEqual(brandName, "Bank Muamalat")
36-
case .bankRakyat:
37-
XCTAssertEqual(brandID, "bank_rakyat")
38-
XCTAssertEqual(brandName, "Bank Rakyat")
39-
case .BSN:
40-
XCTAssertEqual(brandID, "bsn")
41-
XCTAssertEqual(brandName, "BSN")
42-
case .CIMB:
43-
XCTAssertEqual(brandID, "cimb")
44-
XCTAssertEqual(brandName, "CIMB Clicks")
45-
case .hongLeongBank:
46-
XCTAssertEqual(brandID, "hong_leong_bank")
47-
XCTAssertEqual(brandName, "Hong Leong Bank")
48-
case .HSBC:
49-
XCTAssertEqual(brandID, "hsbc")
50-
XCTAssertEqual(brandName, "HSBC BANK")
51-
case .KFH:
52-
XCTAssertEqual(brandID, "kfh")
53-
XCTAssertEqual(brandName, "KFH")
54-
case .maybank2E:
55-
XCTAssertEqual(brandID, "maybank2e")
56-
XCTAssertEqual(brandName, "Maybank2E")
57-
case .maybank2U:
58-
XCTAssertEqual(brandID, "maybank2u")
59-
XCTAssertEqual(brandName, "Maybank2U")
60-
case .ocbc:
61-
XCTAssertEqual(brandID, "ocbc")
62-
XCTAssertEqual(brandName, "OCBC Bank")
63-
case .publicBank:
64-
XCTAssertEqual(brandID, "public_bank")
65-
XCTAssertEqual(brandName, "Public Bank")
66-
case .RHB:
67-
XCTAssertEqual(brandID, "rhb")
68-
XCTAssertEqual(brandName, "RHB Bank")
69-
case .standardChartered:
70-
XCTAssertEqual(brandID, "standard_chartered")
71-
XCTAssertEqual(brandName, "Standard Chartered")
72-
case .UOB:
73-
XCTAssertEqual(brandID, "uob")
74-
XCTAssertEqual(brandName, "UOB Bank")
75-
case .unknown:
76-
XCTAssertEqual(brandID, "unknown")
77-
XCTAssertEqual(brandName, "Unknown")
78-
@unknown default:
79-
break
50+
if let expected = Self.expectedValues[brand] {
51+
XCTAssertEqual(brandID, expected.id)
52+
XCTAssertEqual(brandName, expected.name)
8053
}
8154
}
8255
}

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/PaymentSheetFormFactory/PaymentSheetFormFactory+BankDebits.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,5 +207,6 @@ private enum BankDropdown {
207207
}
208208
return (name, value)
209209
}
210-
.sorted { $0.value < $1.value }
210+
// FPX requires banks to be displayed in ascending alphabetical order by name.
211+
.sorted { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending }
211212
}

StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/ExpectedFormHierarchies.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ enum ExpectedFormHierarchy {
200200
static var paymentIntent: FormHierarchyNode {
201201
FormHierarchyNode(type: "FormElement", children: [
202202
FormHierarchyNode(type: "SectionElement", children: [
203-
FormHierarchyNode(type: "DropdownFieldElement", properties: ["itemCount": "18", "label": "FPX Bank"])
203+
FormHierarchyNode(type: "DropdownFieldElement", properties: ["itemCount": "25", "label": "FPX Bank"])
204204
]),
205205
])
206206
}

0 commit comments

Comments
 (0)