此 SDK 允许您从您的 iOS 应用程序内部轻松处理交易和退款,通过 Fortis 支付网关。它允许您使用手动输入和移动读卡器进行收款,并通过我们网关接收反馈以了解交易是否处理。SDK 包含对 ID Tech VP3300 的支持,并将很快支持 MagTek iDynamo。
要使用 Mobile SDK,您首先需要确保 Fortis 支持团队已将适当的凭证发送给您。然后在开始之前,分析您的代码库以确定处理交易流程的最佳位置。例如,您可能想添加一个新类来处理对 SDK 的调用和从 SDK 的回调。为了确定如何最佳地实现集成,请考虑以下步骤
创建一个 RestServiceClient 并设置 SDK 是否应连接到我们的沙盒服务器或真实服务器。
创建一个包含交易所需请求头参数的字典/HashMap,包括开发人员 ID、用户 ID 和用户 API 密钥。
使用在步骤 2 中创建的对象设置 RestServiceClient 的请求头。
传递 RestServiceClient 创建一个新的 EMVTransaction 对象。
搜索:通过调用 EMVTransaction 的 scanForDevices 方法开始搜索读卡器。确保您的读卡器已开启并等待连接。如果您使用 MagTek iDynamo,则读卡器应物理连接到您的设备。
连接:找到的任何 ID Tech VP3300 读卡器将生成来自 SDK 的 deviceScanResponse 回调。当您收到该回调时,采取措施记录读卡器的信息(名称和 ID)。一旦您准备好发起连接,调用 connectDeviceByName 或 connectDeviceByAddress 连接到设备。SDK 将发起连接,然后生成 deviceConnected 回调。 注意,对于 MagTek iDynamo 读卡器,deviceScanResponse 回调没有保证。由于读卡器已物理连接到设备,它将立即连接,并且您将收到 deviceConnected 回调。
开始交易:当您准备开始交易时,创建一个包含以下参数的交易字典/HashMap:action、payment_method、transaction_type、location_id 和 transaction_amount。调用 performEMVSale 以开始交易流程。
显示结果:transactionResponse 回调将指示交易的成功或失败,并提供其他可使用详细信息。
您可以通过以下说明轻松将 Fortis Payment SDK 导入到项目中
按照以下文档初始化您的项目 CocoaPods:https://guides.cocoapods.org.cn/using/using-cocoapods
在您的工作区中的 Pods 项目中打开 Podfile。将以下行添加到您希望建立 SDK 的目标的块中。
pod 'FortisPaymentSDK'
清理项目并构建它。
在您想使用 SDK 的类中,在顶部添加以下行
对于 Swift
import PaymentSDK
针对 Objective-C
#import <PaymentSDK/PaymentSDK.h>
// 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")
// Include header variables as necessary.
var transactionHeaderDict : [String : String]! = [:]
transactionHeaderDict["user-id"]="FortisAPIUserID"
transactionHeaderDict["user-api-key"]="FortisAPIUserAPIKey"
transactionHeaderDict["developer-id"]="FortisAPIDeveloperID"
// 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"
restClientService.setHTTPRequestHeaders(headerParams: transactionHeaderDict as NSDictionary)
// 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
}
})
}
// 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
}
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: []
)
}
}
emvTransaction.scanForDevices()
emvTransaction.PerformEMVSale(jsonPayload: transactionParamDict)
*注意:当前 SDK 支持两种 EMV 交易类型:SALE 和 REFUND;为了执行这两种交易,我们需要调用相同的 PerformEMVSale() 函数,并带有 payload,其中应包含动作字段,如 'sale' 或 'refund'。有效负载输入将与非 EMV 交易类似。有关应发送哪些参数的详细信息,请参阅上述链接的 Zeamster 交易 API 文档 (https://docs.zeamster.com/developers/api/endpoints/transactions)*)
emvTransaction.CancelEMVSale();
emvTransaction.DisconnectDevice();