测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | 自定义 |
发布最后发布 | 2017年10月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
维护者 Rajan Veeramani。
依赖项 | |
ObjectMapper | = 3.0.0 |
Starscream | = 2.1.1 |
SwiftyJSON | = 3.1.4 |
CLVGoSDK | = 3.0.0.8 |
Clover 通用地板 iOS SDK 允许您的自定义移动销售点 (POS) 通过连接到符合 EMV 标准的 Clover Go 卡读卡器接收卡式交易。
Clover Go 支持两种类型的读卡器,一种是磁条读卡器,一种是 EMV 芯片签名卡读卡器,以及一种支持刷、EMV 插孔和 NFC 无线接洽支付的全方位读卡器。该 SDK 设计用于让商家在 iPhone 智能手机和 iPad 平板电脑上进行支付。
通过集成通用 SDK,商家可以利用 Clover 平台的低信用卡处理费率以及 Clover 提供的所有其他服务。
在目标的 PODFILE 中添加 pod 'CloverConnector-Hackathon-2017', '~> 0.0.2'
例如 -
platform :ios, '9.0'
use_frameworks!
target 'CloverConnector_Example' do
pod 'CloverConnector-Hackathon-2017', '~> 0.0.2'
end
AppDelegate.swift
文件中声明以下... public var cloverConnector:ICloverGoConnector?
public var cloverConnectorListener:CloverGoConnectorListener?
CloverGoConnectorListener.swift
继承自 ICloverGoConnectorListener
import CloverConnector_Hackathon_2017
weak var cloverConnector:ICloverGoConnector?
public init(cloverConnector:ICloverGoConnector){
self.cloverConnector = cloverConnector;
}
以下是在此类中添加的有用的方法
在此处实现所有的 CardReaderDelegate
方法...
func onDevicesDiscovered(devices: [CLVModels.Device.GoDeviceInfo])
- 此委托方法在检测到读卡器并从读卡器列表中选择时调用func onDeviceReady(merchantInfo: MerchantInfo)
- 当设备准备进行通信时调用func onDeviceConnected () -> Void
- 当设备最初连接时调用func onDeviceDisconnected () -> Void
- 当设备断开连接或未响应时调用func onDeviceError( _ deviceErrorEvent: CloverDeviceErrorEvent ) -> Void
– 当连接到读卡器时出错时调用在此处实现所有 TransactionDelegate
方法...
func onTransactionProgress(event: CLVModels.Payments.GoTransactionEvent) -> Void
- 当交易开始后,卡片读卡器上发生任何事件时调用参数 event: 提供有关交易期间卡片读卡器事件的详细信息
switch event
{
case .EMV_CARD_INSERTED,.CARD_SWIPED,.CARD_TAPPED:
break
case .EMV_CARD_REMOVED:
break
case .EMV_CARD_DIP_FAILED:
break
case .EMV_CARD_SWIPED_ERROR:
break
case .EMV_DIP_FAILED_PROCEED_WITH_SWIPE:
break
case .SWIPE_FAILED:
break
case .CONTACTLESS_FAILED_TRY_AGAIN:
break
case .SWIPE_DIP_OR_TAP_CARD:
break
default:
break;
}
func onSaleResponse(response: SaleResponse)
– 当销售请求完成时(无论是有付款还是已取消状态)调用
func onAuthResponse(response: AuthResponse)
– 在 auth 请求完成且状态为付款或取消时调用
sale - 收取最终销售款项
auth - 收取可以调整小费的支付款项
注意:还需要在此处添加 ICloverConnectorListener
类的其他方法,但可以留空,例如 onRetrieveDeviceStatusResponse, onMessageFromActivity,
等。
SDK 初始化所需的以下参数
func connectToCloverGoReader() {
let config : CloverGoDeviceConfiguration = CloverGoDeviceConfiguration.Builder(apiKey: "", secret: "", env: .live).accessToken(accessToken: "").deviceType(deviceType: .RP450).allowDuplicateTransaction(allowDuplicateTransaction: true).allowAutoConnect(allowAutoConnect: true).build()
cloverConnector = CloverGoConnector(config: config)
cloverConnectorListener = CloverGoConnectorListener(cloverConnector: cloverConnector!)
cloverConnectorListener?.viewController = self.window?.rootViewController
(cloverConnector as? CloverGoConnector)?.addCloverGoConnectorListener(cloverConnectorListener: (cloverConnectorListener as? ICloverGoConnectorListener)!)
cloverConnector!.initializeConnection()
}
销售交易所需的必要参数
其他可选参数在黑客马拉松中可以忽略
@IBAction func doSaleTransaction(sender: AnyObject) {
let totalInInt = Int(totalAmount * 100) -- amount should be in cents
let saleReq = SaleRequest(amount:totalInInt, externalId:"\(arc4random())") – pass total amount in cents and random external Id
(UIApplication.sharedApplication().delegate as! AppDelegate).cloverConnector?.sale(saleReq) – make sale request
}
auth 交易所需的必要参数
其他可选参数在黑客马拉松中可以忽略
@IBAction func doAuthTransaction(sender: AnyObject) {
let totalInInt = Int(totalAmount * 100) -- amount should be in cents
let authReq = AuthRequest(amount:totalInInt, externalId:"\(arc4random())") – pass total amount in cents and random external Id
(UIApplication.sharedApplication().delegate as! AppDelegate).cloverConnector?.auth(authReq) – make auth request
}
public func onConfirmPaymentRequest(_ request: ConfirmPaymentRequest)
-- 如果设备需要确认支付(重复验证),则会调用
处理重复交易的示例代码
如果返回重复交易,将会弹出一个提示用户是否继续或取消的窗口(即有 2 个选项“接受”或“拒绝”)
strongSelf.cloverConnector?.acceptPayment(payment)
strongSelf.cloverConnector?.rejectPayment(payment)
public func onConfirmPaymentRequest(_ request: ConfirmPaymentRequest) {
if let payment = request.payment,
let challenges = request.challenges {
confirmPaymentRequest(payment: payment, challenges: challenges)
} else {
showMessage("No payment in request..")
}
}
func confirmPaymentRequest(payment:CLVModels.Payments.Payment, challenges: [Challenge]) {
DispatchQueue.main.async { [weak self] in
guard let strongSelf = self else { return }
if challenges.count == 0 {
print("accepting")
strongSelf.cloverConnector?.acceptPayment(payment)
} else {
print("showing verify payment message")
var challenges = challenges
let challenge = challenges.removeFirst()
var alertActions = [UIAlertAction]()
alertActions.append(UIAlertAction(title: "Accept", style: .default, handler: { [weak self] action in
guard let strongSelf = self else { return }
strongSelf.confirmPaymentRequest(payment: payment, challenges: challenges)
}))
alertActions.append(UIAlertAction(title: "Reject", style: .cancel, handler: { [weak self] action in
guard let strongSelf = self else { return }
strongSelf.cloverConnector?.rejectPayment(payment, challenge: challenge)
}))
strongSelf.showMessageWithOptions(title: "Verify Payment", message: challenge.message ?? "", alertActions: alertActions)
}
}
}