ID TECH
全部技术文章

技术文章

EMV 开发实战(第一篇)

ID TECH 设计并销售种类丰富的支付设备,如今几乎所有产品都支持"芯片卡"(或称"智能卡")。使用芯片卡完成的支付通常统称为"接触式 EMV",有时也简称为"EMV"。(EMV 当然代表 Europay、MasterCard 和 Visa,即卡组织联盟。)

按照行业定义,EMV 交易是指符合以下四卷规范要求的交易: 《支付系统集成电路卡规范》(EMV Integrated Circuit Card Specifications for Payment Systems) (可从以下网址获取: https://www.emvco.com/)。要真正理解这份规范需要花费不少时间。整套规范共四卷,内容相当庞杂。不过,ID TECH 致力于让开发者更轻松地实现"EMV 合规"目标,为此提供了多种免费工具、SDK、示例程序和其他资源,帮助 POS 集成商以及其他需要快速实现 EMV 合规.

ID TECH 的新客户大多技术功底扎实。但即便如此,不同客户在启动新项目时所掌握的 EMV 知识也参差不齐。多数客户对 MSR(磁条读卡器)相关的支付系统非常熟悉。部分客户此前接触过 EMV,但不了解 非接触式 EMV。还有一些客户则是首次接触 EMV 本身。

作为入门参考,我们通常建议集成商先阅读 ID TECH 的免费白皮书: 《使用 Universal SDK 处理 EMV 交易》(EMV Transactions with the Universal SDK)。这份 25 页白皮书的前半部分回顾了 EMV 的事件流程。该流程的主要环节可归纳如下:

在该流程的每个阶段,读卡器都会按照 ISO-7816 定义的底层协议与智能卡上的芯片通信。读卡器中负责处理这些通信的绝大部分逻辑被封装在一个称为 EMV Level 2 内核的模块中。换言之,这部分对支付应用开发者是不可见的,开发者只需关心如何向 内核 发送命令(而无需直接与卡片交互)。严格来说,这种说法也不够准确。支付应用开发者实际上是将命令发送给 读卡器;再由读卡器处理与内核之间所需的底层交互,而内核则进一步与卡片进行通信。

与读卡器通信

如何向读卡器发送命令?有两种方式可选:

  1. 与读卡器建立连接(通常通过 USB 或 RS-232),然后直接向其发送固件命令;或者:
  2. 使用高级语言 SDK,借助合适的 ID TECH SDK 库编写代码(采用 C/C++、C#、Objective-C、Java 或 Swift),从而调用底层的固件命令。

第二种方式通常更简单,因为掌握 ID TECH Universal SDK 的高级语言 API 所需的时间相对较短(而且我们还提供大量示例代码可供参考)。第二种方式的 不利 之处在于,它会将您的应用绑定到某一种开发语言和操作系统。而采用第一种方式时,您可以自由选择开发语言(和操作系统),但必须自行学习设备的(字节级)固件命令 API,并自行处理所有连接相关的问题。

无论您选择直接与读卡器通信(通过串口连接发送原始固件命令),还是借助 Universal SDK 的内置连接能力和高级命令进行交互,都必须了解一点:EMV 交易(这里指传统的 接触式 EMV,而非非接触式)分为三个阶段完成。在 Universal SDK 的术语中,我们将这三个阶段称为:Start Transaction(启动交易)、Authenticate Transaction(认证交易)和 Complete Transaction(完成交易)。(USDK 中每个阶段都有对应的方法或函数。)从程序流程角度看,这意味着在交易过程中,内核会两次将控制权交还给调用方:一次是在 Start Transaction 返回之后;另一次是在 Authenticate Transaction 之后(但在 Complete Transaction 之前)。这些暂停点对数据流有重要意义,因为每个交易阶段结束后返回的 TLV(标签—长度—值三元组)各不相同,必须在所需 TLV 可用时及时获取,否则在后续阶段可能就拿不到了。一个典型例子是:Tag 57(Track 2 数据)只能在 Start Transaction 结束时获得(而 Complete Transaction 结束时则无法获取)。

EMV 中的密文(Cryptogram)

在任何 EMV 交易中,最重要的数据项之一就是通过以下标签返回的应用密文(Application Cryptogram): 9F26。一次接触式 EMV 交易通常会产生两个密文(9F26 会返回两次):一个在 Complete Transaction 之前生成,另一个在其之后生成。促使卡片生成密文的事件称为 Gen AC(Generate Application Cryptogram,生成应用密文)请求。

这些密文之所以重要,是因为它们构成了不可抵赖的证据,证明在某次交易中确实存在一张真实合法的芯片卡在场。(它们同时也证明了该次交易过程中产生的具体数据值。)在 Gen AC 阶段,L2 内核会向芯片卡提交一份 数据对象列表 (包含本次交易的相关数据),芯片卡随后使用其私钥(仅存于芯片内部)对该数据进行签名,生成一个不可伪造的数字凭证(8 字节的密文),用以证明卡片及数据的合法性。该密文的真伪可由最终授权(或拒绝)此次交易的在线授权机构进行验证。 这正是芯片卡发明的初衷,也是 EMV 存在的意义。磁条数据容易被伪造,而由芯片按需生成的密文则难以伪造。

在下一篇文章中,我们将继续探讨这一话题,重点介绍卡片可以生成哪些类型的密文(cryptogram)、它们各自代表什么含义、支付应用开发者需要如何处理这些密文,以及它们将如何影响交易的成败。敬请关注第二部分!

对 EMV 交易、读卡器、非接触式技术或数字钱包有疑问?欢迎联系我们的专家:

免费咨询电话
1-800-984-1010