// // PKPaymentToken+Serializable.swift // PSCB-OOS-iOS // // Created by OA on 17.10.2020. // import Foundation import PassKit // MARK: - Comfront to serializable extension PKPaymentToken: Serializable { // Serializes token to a JSONLike dictionary public func serializeToJSON() -> JSONDict { let paymentJson: JSONDict? = try? JSONSerialization.jsonObject( with: self.paymentData, options: .mutableContainers ) as? JSONDict var paymentType: String = "debit" var methodAndNetwork: JSONDict = [ "network": "", "type": paymentType, "displayName": "" ] if #available(iOS 9.0, *) { methodAndNetwork = [ "network": self.paymentMethod.network?.rawValue ?? "", "type": paymentType, "displayName": self.paymentMethod.displayName ?? "" ] switch self.paymentMethod.type { case .debit: paymentType = "debit" case .credit: paymentType = "credit" case .store: paymentType = "store" case .prepaid: paymentType = "prepaid" default: paymentType = "unknown" } } return [ "paymentData": paymentJson, "transactionIdentifier": self.transactionIdentifier, "paymentMethod": methodAndNetwork ] as JSONDict } } // MARK: - To string cryptogram extension PKPaymentToken { private func paymentJSONData() -> JSONDict? { let json = self.serializeToJSON() let data = json["paymentData"] as! JSONDict? return data } /// Creates a Base64 encoded cryptogram string accepted by PSCB OOS protocol /// May throw JSON serialization errors if token could not be converted to JSON string before writing a cryptogram. /// /// - Returns: Base64 encoded string public func toCryptogramString() throws -> String { let json = self.paymentJSONData() let data = try JSONSerialization.data(withJSONObject: json!, options: []) // let string = String(data: data, encoding: .utf8)! return data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) } }