技术文章
面向 EMV 的开发(第二部分)
在 本文第一部分,我们简要介绍了 EMV 交易及其结构。我们了解到:
- 与 MSR(磁条)交易不同,EMV 交易需要分多个阶段完成。
- 芯片卡与读卡器之间的大部分往返通信都发生在 内核 层级,超出应用程序逻辑的控制范围。
- 交易结果以 TLV(“标签”)形式返回。
- 一个 密文(cryptogram) (一段由卡片生成的、长度为 8 字节的唯一数据,使用仅卡片自身知晓的私钥生成)会在交易的完成(Completion)阶段之前生成;而第二个密文则会在 之后 调用完成交易的接口后生成。
- 该密文以标签 9F26(由 EMVCo 定义的标签,并非 ID TECH 专有标签)的形式由卡片返回。
通常情况下,您会将首个密文(以及后端处理方所需的任何其他 TLV 数据)打包,通过网络实时发送给处理方,以获取授权码(位于标签 89 中),然后再发起进入完成(Completion)阶段的调用。在线授权请求需由您自行完成(因为读卡器和我们的 SDK 都不会代为执行),需使用您所用网关的 Web API。大多数网关都提供自家的 SDK,使这一环节更加便捷。
网关(或称“后端处理方”)将以标签 89、8A、91 以及(可选的)71 或 72 响应您的授权请求。要完成交易,您需将这些 TLV 数据传入 Universal SDK 的 emv_completeTransaction() 方法。您的代码将通过回调收到结果通知。在回调中,您会获得交易数据的句柄,其中包含一组 TLV。这些 TLV 中包含上文提到的第二个、也是最终的密文——同样位于标签 9F26 中。
密文类型
标签 9F26 中返回的密文是不透明的,您无法通过直接检查其内容来判断属于哪种类型的密文。不过,您可以检查标签 9F27(该标签会与 9F26 一同返回),以判断所收到的密文类型。9F27 的高 4 位(高半字节)包含您所需的信息,可按以下方式解读(信息来源于 EMV Book 3):
一般而言,9F27 的(十六进制)值会是 80、40 或 00,分别对应 ARQC、TC 或 AAC,含义依次为“需联机处理”“批准”或“拒绝”。
请务必理解,这些数值仅代表卡片的 建议。该建议并非总具有约束力。例如,如果原始密文是 ARQC,但支付应用无法联机,那么卡片在完成阶段返回的第二个密文 必须 为 AAC。在这种情况下,AAC 并不会自动意味着您的交易被拒绝;最终决定权在联机授权方(即发卡方)。在一种被称为 Quick Chip(或 Faster EMV)的特殊 EMV 场景下,您将 始终 收到 AAC,因为联机请求会在更晚的阶段发起。这并无问题!您仍然可以提交交易进行清算。卡片的建议只是 建议。最终决定由联机授权方做出。
请注意,在美国(被视为纯联机市场),首个密文几乎总是 ARQC。例外情况是卡片已过期或存在其他必须直接拒绝交易的原因——此时(理论上)您可能在首次“Gen AC”请求后收到 AAC。
获取 TLV 数据
Universal SDK 会替您通过 USB、RS-232、Bluetooth、音频接口或以太网(视读卡器类型而定)与 ID TECH 读卡器进行通信。所有与交易相关的双向通信都是异步的,这意味着您需要向 SDK 注册一个或多个自定义回调例程,才能“收到”读卡器的响应。相关操作说明不仅在 SDK 文档中有所介绍,SDK 附带的示例代码中也有体现。使用回调并不神秘。建议您花些时间研究 SDK 的示例代码,以了解整体流程的样貌。
需要牢记的重要一点是:EMV 交易分阶段进行,每个阶段结束时您会收到不同的 TLV。一个常见的误解是认为您能够在完成阶段结束时一次性获得所有可能需要的标签。事实并非如此。您会发现,需要在 每个 阶段分别收集 TLV。
您可以在各阶段预期收到哪些标签?以下列出了交易各阶段最典型的标签:
启动交易(Start Transaction):
4F
50
57
5A
5F20
5F24
5F25
5F2D
5F34
84
9F20
DFEE12
DFEE23
Authenticate Transaction(认证交易):
95
9B
9F02
9F03
9F10
9F13
9F26
9F27
9F34
9F36
9F37
9F4D
9F4F
Complete Transaction(完成交易):
95
99
9B
9F02
9F03
9F10
9F13
9F26
9F27
9F34
9F36
9F37
9F4D
9F4F
9F5B
以上几乎所有标签均为行业标准的 EMVCo 定义标签。以 "DF" 开头的标签为 ID TECH 专有标签。如需获取 ID TECH 专有标签及其含义的完整清单,请参阅文档 80000503-001, ID TECH TLV 标签参考指南,可从我们的 知识库.
没有找到您需要的标签?没关系。您可以使用 Universal SDK 在交易时请求额外的标签。具体操作方法不仅在 SDK 文档中有说明,我们的白皮书中也有详细介绍,请参阅: 《使用 Universal SDK 处理 EMV 交易》(EMV Transactions with the Universal SDK).
哪些标签会被加密?
如果您的读卡器已注入密钥并开启了加密功能,那么包含敏感数据的标签内容将被加密。这显然包括所有包含磁道数据的标签(例如标签 57)或 PAN 数据标签(5A)。如需获取加密标签的完整列表,请参阅 文档 80000502-001-F, ID TECH 加密数据输出。如果您使用的是演示设备(注入了演示密钥),您可以使用我们的 在线工具手动解密数据。但一般而言,在 生产 代码中您无需自行解密数据,因为您只需将数据直接传递给您的支付处理机构即可。
加密是一个庞大的话题。我们现在不再深入讨论,但如果您对此感兴趣,请务必查阅我们之前发布的相关 往期文章 。
有疑问?
此时您可能有许多疑问。不必担心!我们为您提供了丰富的免费资源,请访问我们的 知识库,如果您仍有疑问,只需一通电话即可联系到我们的技术人员。
