CloverConnector-Hackathon-2017 0.0.4

CloverConnector-Hackathon-2017 0.0.4

测试已测试
语言语言 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 Go

Clover 通用地板 SDK

概述

Clover 通用地板 iOS SDK 允许您的自定义移动销售点 (POS) 通过连接到符合 EMV 标准的 Clover Go 卡读卡器接收卡式交易。

Clover Go 支持两种类型的读卡器,一种是磁条读卡器,一种是 EMV 芯片签名卡读卡器,以及一种支持刷、EMV 插孔和 NFC 无线接洽支付的全方位读卡器。该 SDK 设计用于让商家在 iPhone 智能手机和 iPad 平板电脑上进行支付。

通过集成通用 SDK,商家可以利用 Clover 平台的低信用卡处理费率以及 Clover 提供的所有其他服务。

为黑客马拉松开发者的入门指南

系统要求

  • XCode 9 及以上
  • iOS 9.2 及以上
  • 注册期间提供的 Clover Go 无线接洽卡读卡器
  • 注册期间提供的信用卡或任何个人实时信用卡

XCode iOS 项目设置

在目标的 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

初次步骤

在您的应用程序中使用 Clover 通用 SDK

1. 在您的 AppDelegate.swift 文件中声明以下...

    public var cloverConnector:ICloverGoConnector?
    public var cloverConnectorListener:CloverGoConnectorListener?

2. 创建 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, 等。

3. 与 450 阅读器一起初始化 SDK

SDK 初始化所需的以下参数

  • apiKey - 在注册时提供给开发者
  • secret - 在注册时提供给开发者
  • accessToken - 在注册时提供给开发者
  • allowDuplicateTransaction - 为了黑客马拉松目的设置为 true
  • allowAutoConnect - 为了黑客马拉松目的设置为 true
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()   
    }

4. 执行销售交易

销售交易所需的必要参数

  1. amount – 这是您想进行的交易的总金额
  2. externalId: 为此交易生成的随机唯一编号

其他可选参数在黑客马拉松中可以忽略

@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
    }

4. 执行 auth 交易

auth 交易所需的必要参数

  1. amount – 这是您想进行的交易的总金额
  2. externalId: 为此交易生成的随机唯一编号

其他可选参数在黑客马拉松中可以忽略

@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
    }

5. 处理重复和 AVS 交易错误

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)
            }
        }
    }