FortisPaymentSDK 1.4.6

FortisPaymentSDK 1.4.6

Daniel Stricklandmaiconhellmann 维护。



  • FortisPay 和 Daniel Strickland

Fortis Payment SDK

此 SDK 允许您从您的 iOS 应用程序内部轻松处理交易和退款,通过 Fortis 支付网关。它允许您使用手动输入和移动读卡器进行收款,并通过我们网关接收反馈以了解交易是否处理。SDK 包含对 ID Tech VP3300 的支持,并将很快支持 MagTek iDynamo。

移动 SDK 流程

要使用 Mobile SDK,您首先需要确保 Fortis 支持团队已将适当的凭证发送给您。然后在开始之前,分析您的代码库以确定处理交易流程的最佳位置。例如,您可能想添加一个新类来处理对 SDK 的调用和从 SDK 的回调。为了确定如何最佳地实现集成,请考虑以下步骤

  1. 初始化:确定实现功能的类或模块。在该类的初始化例程中
  • 创建一个 RestServiceClient 并设置 SDK 是否应连接到我们的沙盒服务器或真实服务器。

  • 创建一个包含交易所需请求头参数的字典/HashMap,包括开发人员 ID、用户 ID 和用户 API 密钥。

  • 使用在步骤 2 中创建的对象设置 RestServiceClient 的请求头。

  • 传递 RestServiceClient 创建一个新的 EMVTransaction 对象。

  1. 搜索:通过调用 EMVTransaction 的 scanForDevices 方法开始搜索读卡器。确保您的读卡器已开启并等待连接。如果您使用 MagTek iDynamo,则读卡器应物理连接到您的设备。

  2. 连接:找到的任何 ID Tech VP3300 读卡器将生成来自 SDK 的 deviceScanResponse 回调。当您收到该回调时,采取措施记录读卡器的信息(名称和 ID)。一旦您准备好发起连接,调用 connectDeviceByName 或 connectDeviceByAddress 连接到设备。SDK 将发起连接,然后生成 deviceConnected 回调。 注意,对于 MagTek iDynamo 读卡器,deviceScanResponse 回调没有保证。由于读卡器已物理连接到设备,它将立即连接,并且您将收到 deviceConnected 回调。

  3. 开始交易:当您准备开始交易时,创建一个包含以下参数的交易字典/HashMap:action、payment_method、transaction_type、location_id 和 transaction_amount。调用 performEMVSale 以开始交易流程。

  4. 显示结果:transactionResponse 回调将指示交易的成功或失败,并提供其他可使用详细信息。

使用 Fortis Payment SDK

您可以通过以下说明轻松将 Fortis Payment SDK 导入到项目中

  1. 按照以下文档初始化您的项目 CocoaPods:https://guides.cocoapods.org.cn/using/using-cocoapods

  2. 在您的工作区中的 Pods 项目中打开 Podfile。将以下行添加到您希望建立 SDK 的目标的块中。

pod 'FortisPaymentSDK'
  1. 清理项目并构建它。

  2. 在您想使用 SDK 的类中,在顶部添加以下行

对于 Swift

      import PaymentSDK

针对 Objective-C

      #import <PaymentSDK/PaymentSDK.h>
  1. 确定你要实现的函数所在的类,并创建一个类型为 RestServiceClient 的对象。
// apiHostname = either api.zeamster.com or api.sandbox.zeamster.com
// apiEndpointPath = /v2/transactions - full endpoint of the API
let restServiceClient = RestServiceClient(apiProtocol:"https", apiHostName:"api.sandbox.zeamster.com", apiEndpointPath:"/v2/transactions")
  1. 使用 Fortis 提供的开发者凭据创建一个字典,以供 API 访问,然后调用 setRequestHeader 方法使用此字典。如果需要其他头部信息,也请将其添加到此字典中。
// Include header variables as necessary.  
var transactionHeaderDict : [String : String]!  = [:]
transactionHeaderDict["user-id"]="FortisAPIUserID"
transactionHeaderDict["user-api-key"]="FortisAPIUserAPIKey"
transactionHeaderDict["developer-id"]="FortisAPIDeveloperID"
  1. 创建另一个字典,包含所有需要 POST 到 API 的字段。这些字段将包含在 POST 主体中。请确保包含合适的 Fortis 位置 ID、操作和交易金额。
// Include all relevant transaction parameters
var transactionParamDict : [String : String]!  = [:]
transactionParamDict["action"]="sale"   // or "refund"
transactionParamDict["payment_method"]="cc"
transactionParamDict["transaction_type"]="sale"
transactionParamDict["location_id"]="FortisLocationID"
transactionParamDict["transaction_amount"]="155.99"
  1. 确定你想支持哪种类型的交易。该 SDK 支持非 EMV 交易(卡面不可见)和 EMV 交易,包括刷卡、触碰或插卡。

非 EMV 交易

  • 设置 restServiceClient 对象的 HTTP 请求头部信息。
restClientService.setHTTPRequestHeaders(headerParams: transactionHeaderDict as NSDictionary)
  • 通过传递之前创建的 restServiceClient 对象实例化 TransactionService 类。然后,调用 processTransaction 方法并传递以下参数。
// transactionAction = one of the actions of TransactionAction Enum class as per requirement.
// paramMap = input parameters required by Transaction API for a type of action to be performed.
// transactionId = required, when the action is to be performed on an existing transaction such as a refund.
        let transactionService = TransactionService(restClient: restClientService)
        let transactionActionType = TransactionAction.Sale
        transactionService.processTransaction(transactionAction: transactionActionType, paramMap: (transactionParamDict as NSDictionary).mutableCopy() as! NSMutableDictionary,
                        transactionId: transactionId)
                        { (responseJSON) in
                            DispatchQueue.global().async(execute: {
                                DispatchQueue.main.sync {
                                    // Update the UI using  responseJSON
                                }
                            })
                        }
  • 交易成功或失败完成后,processTransaction 完成块将返回响应。

EMV 交易

  • 使用适当的参数创建 RestClientService 对象,并设置请求头部信息。
  • 通过传递之前创建的 restServiceClient 对象实例化 EMVTransaction 类,并确保指定正确的阅读器类型。
// apiHostname = either api.zeamster.com or api.sandbox.zeamster.com
// apiEndpointPath = /v2/transactions - full endpoint of the API
let restServiceClient = RestServiceClient(apiProtocol:"https", apiHostName:"api.sandbox.zeamster.com", apiEndpointPath:"/v2/transactions")
if (restClientService.setHTTPRequestHeaders(headerParams: transactionHeaderDict as NSDictionary)) {
            emvTransaction = EMVTransaction(restClient: restServiceClient, device: DeviceType.IDTECH_VP3300BT)
            emvTransaction.delegate = self
        }
  • 创建 EMVTransaction 对象后,将其代理设置为 self,然后设置设备类型,如下所示。
  • 为了执行 EMV 交易,请实现你正在处理的 EMV 交易类中的 EMVUIDelegate 方法。
    func deviceMessage(message: String!) {
        DispatchQueue.main.async {
                //Add code to show reader LCD message
        }
    }
    func deviceScanResponse(deviceID: String!, deviceName: String!) {
        // Add code to hold the device that was found.

        // If you'd like to immediately connect, then you may do so here:
        emvTransaction.connectDeviceByName(name: deviceName)
    }
    func deviceConnected() {
        DispatchQueue.main.async {
            //Add code to show the device is connected.
        }
    }
    func deviceDisconnected() {
        DispatchQueue.main.async {
            //Add code to show device is disconnected.
        }
    }
    func outputLogs(logs: String!) {
        DispatchQueue.main.async {
            // Add code to show transaction output logs
        }
    }
    func transactionResponse(data: String!) {
        DispatchQueue.main.async {
            //Add code to show the transaction response.
            let jsonDictData = data.data(using: .utf8)!
            let txResponse = try? JSONSerialization.jsonObject(
                with: jsonDictData,
                options: []
            )
        }
    }
  • 接下来调用 scanForDevices() 方法开始设备扫描。
emvTransaction.scanForDevices()
  • 设备扫描响应将返回到 deviceScanResponse() 回调方法。此方法接收设备名称和 ID,你可以使用其他方法通过设备名称连接到特定的设备。对于每个找到的设备,此方法将多次调用,但对于每个独特的阅读器,只会调用一次。
  • 找到你的卡读卡器后,使用 emvTransaction 实例的 connectDeviceByName() 方法连接设备。你也可以使用另一个方法通过设备的 ID 连接,如果你不想通过名称连接。
  • 读卡器连接成功后,会向你实现的 deviceConnected() 方法发送响应。
  • 如果读卡器断开连接,deviceDisconnected() 方法将被调用。
  • 通过调用 PerformEMVSale 并传递你之前组装的合适的有效负载来启动交易。
emvTransaction.PerformEMVSale(jsonPayload: transactionParamDict)

*注意:当前 SDK 支持两种 EMV 交易类型:SALE 和 REFUND;为了执行这两种交易,我们需要调用相同的 PerformEMVSale() 函数,并带有 payload,其中应包含动作字段,如 'sale' 或 'refund'。有效负载输入将与非 EMV 交易类似。有关应发送哪些参数的详细信息,请参阅上述链接的 Zeamster 交易 API 文档 (https://docs.zeamster.com/developers/api/endpoints/transactions)*)

  • 交易当前的��态将报告到 deviceMessage() 回调。
  • 处理交易的所有日志都将报告到 outputLogs() 回调。
  • 如果您想取消正在进行的交易,请调用
emvTransaction.CancelEMVSale();
  • 如果您想断开已连接的读卡器,请调用
emvTransaction.DisconnectDevice();
  • 一旦从交易处理接收响应,请解析传递的 json 字符串以确定交易状态。有关更多信息,请参阅上述链接的 Zeamster 文档。