diff --git a/Spreedly.xcodeproj/project.pbxproj b/Spreedly.xcodeproj/project.pbxproj index 8723d52..10261f3 100644 --- a/Spreedly.xcodeproj/project.pbxproj +++ b/Spreedly.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1AA1E632A293186FBB3A16C6 /* BankAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA1E2FFD34847269F158BCF /* BankAccount.swift */; }; 46FCEDAC26B28251A5441524 /* Pods_Spreedly.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24EB07D12C3865F11DBE8AE0 /* Pods_Spreedly.framework */; }; 631723171BD67B81008EC5C2 /* Spreedly.h in Headers */ = {isa = PBXBuildFile; fileRef = 631723161BD67B81008EC5C2 /* Spreedly.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6337405A1BC967150091372A /* RequestSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 633740591BC967150091372A /* RequestSerializer.swift */; }; @@ -42,6 +43,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 1AA1E2FFD34847269F158BCF /* BankAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BankAccount.swift; sourceTree = ""; }; 24EB07D12C3865F11DBE8AE0 /* Pods_Spreedly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Spreedly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 40DE46959D75210E93E40E58 /* Pods_Spreedly_SpreedlyTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Spreedly_SpreedlyTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4D261846DD7FC52334D6DC32 /* Pods-SpreedlyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SpreedlyTests.release.xcconfig"; path = "Target Support Files/Pods-SpreedlyTests/Pods-SpreedlyTests.release.xcconfig"; sourceTree = ""; }; @@ -152,6 +154,7 @@ 635843D81BD9269F006A4F6B /* PaymentMethod.swift */, 635843DA1BD9361F006A4F6B /* SpreedlyError.swift */, 63E67F801BC6C4600023E846 /* Supporting Files */, + 1AA1E2FFD34847269F158BCF /* BankAccount.swift */, ); path = Spreedly; sourceTree = ""; @@ -410,6 +413,7 @@ B2C26B27230DD80300FACDFD /* TransactionLifecycle.swift in Sources */, 63E67F7C1BC6C1420023E846 /* SpreedlyAPIClient.swift in Sources */, 635843DB1BD9361F006A4F6B /* SpreedlyError.swift in Sources */, + 1AA1E632A293186FBB3A16C6 /* BankAccount.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Spreedly/BankAccount.swift b/Spreedly/BankAccount.swift new file mode 100644 index 0000000..ba0fc28 --- /dev/null +++ b/Spreedly/BankAccount.swift @@ -0,0 +1,13 @@ +// +// Created by Ray Harris on 4/25/18. +// Copyright (c) 2018 Spreedly Inc. All rights reserved. +// + +import Foundation + +open class BankAccount: NSObject { + open var firstName, lastName, routingNumber, accountNumber: String? + open var accountType, accountHolderType: String? + + public override init() {} +} \ No newline at end of file diff --git a/Spreedly/PaymentMethod.swift b/Spreedly/PaymentMethod.swift index 5c52150..8d0d2bc 100644 --- a/Spreedly/PaymentMethod.swift +++ b/Spreedly/PaymentMethod.swift @@ -15,7 +15,8 @@ open class PaymentMethod: NSObject { open var shippingState, shippingZip, shippingCountry, shippingPhoneNumber: String? open var verificationValue, number: String? open var month, year: Int? - + open var bankName, accountType, accountHolderType, routingNumberDisplayDigits, accountNumberDisplayDigits: String? + convenience init(attributes: [String: AnyObject]) { self.init() @@ -75,6 +76,16 @@ open class PaymentMethod: NSObject { self.verificationValue = value as? String case "number": self.number = value as? String + case "bank_name": + self.bankName = value as? String + case "account_type": + self.accountType = value as? String + case "account_holder_type": + self.accountHolderType = value as? String + case "routing_number_display_digits": + self.routingNumberDisplayDigits = value as? String + case "account_number_display_digits": + self.accountNumberDisplayDigits = value as? String default: break; } diff --git a/Spreedly/RequestSerializer.swift b/Spreedly/RequestSerializer.swift index 6f4b583..48c6ccb 100644 --- a/Spreedly/RequestSerializer.swift +++ b/Spreedly/RequestSerializer.swift @@ -79,4 +79,41 @@ open class RequestSerializer { return (nil, serializeError) } } + + open static func serialize(_ bankAccount: BankAccount) -> (data: Data?, error: NSError?) { + var dict = [String: String]() + + if let bankAccountFirstName = bankAccount.firstName { + dict["first_name"] = bankAccountFirstName + } + + if let bankAccountLastName = bankAccount.lastName { + dict["last_name"] = bankAccountLastName + } + + if let bankAccountRoutingNumber = bankAccount.routingNumber { + dict["bank_routing_number"] = bankAccountRoutingNumber + } + + if let bankAccountNumber = bankAccount.accountNumber { + dict["bank_account_number"] = bankAccountNumber + } + + if let bankAccountType = bankAccount.accountType { + dict["bank_account_type"] = bankAccountType + } + + if let bankAccountHolderType = bankAccount.accountHolderType { + dict["bank_account_holder_type"] = bankAccountHolderType + } + + let body = [ "payment_method": [ "bank_account": dict ]] + + do { + let data = try JSONSerialization.data(withJSONObject: body, options: []) + return (data, nil) + } catch let serializeError as NSError { + return (nil, serializeError) + } + } } diff --git a/Spreedly/SpreedlyAPIClient.swift b/Spreedly/SpreedlyAPIClient.swift index ae1441c..852170c 100644 --- a/Spreedly/SpreedlyAPIClient.swift +++ b/Spreedly/SpreedlyAPIClient.swift @@ -34,6 +34,16 @@ public class SpreedlyAPIClient: NSObject { } } } + + open func createPaymentMethodTokenWithBankAccount(_ bankAccount: BankAccount, completion: @escaping SpreedlyAPICompletionBlock) { + let serializedRequest = RequestSerializer.serialize(bankAccount) + + if serializedRequest.error == nil { + if let data = serializedRequest.data { + self.createPaymentMethodTokenWithData(data, completion: completion) + } + } + } public func createPaymentMethodTokenWithApplePay(_ payment: PKPayment, completion: @escaping tokenizeCompletion) { self.createPaymentMethodTokenWithData(RequestSerializer.serialize(payment.token.paymentData), completion: completion)