技术文章
EMV 开发实战(第三部分)
在 本系列第一部分中,我们介绍了芯片卡交易与磁条卡交易的不同之处。我们看到,读卡器与卡片之间存在着大量的来回通信。但(好消息!)我们也了解到,其中很多通信是由读卡器自动处理的——也就是说,支付应用开发者无需介入——这一切都依赖于读卡器的 EMV 内核。
在 第二部分中,我们简要介绍了在 EMV 交易过程中可能返回的各种标签(即 TLV 数据),以及其中部分标签的含义。我们还提到,EMV 交易是分阶段进行的(各阶段名称如 Start、Authenticate 和 Complete)。我们也看到, 不同的 TLV 会在不同阶段返回。
我们也曾多次提到,虽然你完全可以通过直接向读卡器(经由 USB 或 RS-232)发送原始固件命令来完成 EMV 交易,但通常使用 ID TECH 的 Universal SDK 与读卡器交互会更加便捷。(前往 此处 下载,请准备好指定平台:Windows、Linux、MacOS、iOS 或 Android。)
为什么使用 SDK 更便捷?首先,它会自动处理与读卡器的串行通信(USB、RS-232 或蓝牙)的建立工作。它还能让你免去深入了解
设备级固件命令及相关底层协议的麻烦。此外,你还可以获得现成的代码库,帮助处理错误代码解读和数据解析。
Universal SDK 的另一大亮点是,它附带了 示例代码 ,演示如何使用各类代码库来简化这些工作。(请继续阅读。)
那么,如何开始使用 SDK?让我们来看看几个主要步骤。
步骤 1:安装 SDK
如果你已确定将面向哪种操作系统进行开发,请前往 开发 — 首页 (位于知识库) ,并找到对应的下载项。Windows、Linux、MacOS、iOS 和 Android 各有独立的构建版本。
解压压缩包,并尝试在你常用的 IDE 中加载示例项目(请查看 Source Code 文件夹)。在连接好 ID TECH 读卡器的情况下,编译并运行示例应用,验证应用能否与读卡器正常通信。
步骤 2:配置读卡器
请不要指望开箱即可运行 EMV 交易! 如果你没有花时间配置读卡器,第一笔交易就会失败。 至少需要向读卡器加载以下内容:
- 终端设置
- AID
- CAPK(证书颁发机构公钥)
ID TECH 提供了这些项目的示例值(仅供测试使用),但 你仍需运行相应命令来加载这些示例值。在你运行命令之前,这些值不会被加载!(好在,一旦读卡器加载了这些项目,每次启动时无需再次加载。这些值是持久保存的。配置只需完成一次。)请查看 SDK 中的示例代码,了解具体操作方法。
EMV 配置是一个相当庞大的话题,本文不可能面面俱到。如需了解相关内容的入门介绍,请参阅我们 此前关于终端设置的文章,并阅读 EMV 白皮书 (PDF:免费下载)中的配置章节。
步骤 3:运行交易
示例应用中包含了实现该功能的代码。请逐步运行示例应用,了解其工作原理。除此之外,你至少需要设置一个自定义回调函数(一个会在适当时机由 SDK 自动调用的函数),然后调用 emv_startTransaction() 自己进行。
与读卡器的通信以异步方式进行,这意味着当您调用诸如 emv_startTransaction()之类的方法时,SDK 会与读卡器建立连接,触发一连串事件,但您的程序在这些事件发生期间不会被阻塞。相反,控制权会立即返回给您的应用程序(同时附带成功/错误代码)。SDK 代码会持续监控读卡器是否有任何更新。例如,当读卡器完成 EMV 交易的 Start 阶段时,它会将 TLV 数据发送到主机(通常通过 USB)。SDK 将拦截该数据,调用您的自定义回调,并将数据传递给回调函数。
归根结底,如果您希望从读卡器收到反馈,就必须设置自定义回调!
回调函数是什么样的?
在 Windows 版本的 Universal SDK 中,您的自定义回调应具有类似如下的 C# 签名:
为了确保您的回调确实被 使用,您需要在运行时将其注册到 SDK,如下所示:
本示例假定您使用 VP3300 作为读卡器,但显然 SDK 支持您所使用的任何 ID TECH 支付读卡器。毕竟,这是一个 通用 SDK。
交易代码是什么样的?
当您要启动一笔交易时,需要执行类似以下的代码:
对 emv_startTransaction() 的调用会通过 USB 或串口向读卡器发送请求。读卡器将执行 ATR(即与卡上的芯片建立通信),并促使 EMV 内核开始运行。
假设 Start Transaction 调用成功(未超时,未出错),并且您已按前述方式注册了回调,那么您的回调将在一到两秒后被执行。您的回调代码中应包含一个相当庞大的 “switch” 语句,使用大量 case 来处理各种类型的结果。当然,您所期望的结果是一笔成功的、带有 TLV 数据的 EMV 交易。因此,您的代码可能会类似于以下示例,该代码将(在您的回调中)在 Start 阶段结束时执行:
此代码假定您已对偏好设置进行了配置,以自动执行 Authenticate Transaction 阶段,从而可以直接从 Start 跳到 Complete。(当然,不一定必须这样做,这完全取决于您的需求。)在实际的支付应用中,您的应用会在此 ‘case’ 中暂停,以便上线连接到网关或收单机构。然后,您需要将标签 8A(可能还包括其他标签)传递给 emv_completeTransaction().
要了解如何解析交易各阶段结束后返回的交易数据(TLV),请在示例代码中搜索 “displayCardData(IDTTransactionData cardData)”。您将看到多种解析数据的示例。
有疑问?
在开始使用 SDK 时,您可能会有一些问题。请注意,SDK 附带了大量文档(包括 HTML 和 PDF 格式)。但如果您的问题还需要进一步的解答,我们随时为您服务!请联系我们的专家:
