libecodsdk 提供的 C API,但 JSON-RPC API 会被 EMV Core 日志使用,在集成调试期间非常有用。
协议规则
语法规则
所有命令均遵循以下格式约定:- 所有命令和事件均使用带有命名参数的 JSON-RPC 2.0 协议。
- 所有命令和事件都需要响应,除了
log()和ReaderMessageEvent(),它们没有id。 - 消息格式:
- 为每个命令使用不同的
id(例如递增计数器)以帮助同步。 - 非法命令会收到 EMV Core 返回的
"Not existing command"响应。
发送和接收
发送消息:- 发送 JSON-RPC 消息。
- 等待 JSON-RPC 响应。
- 一旦开始接收到数据,请等待完整的 JSON(所有括号都闭合),或者等待 1 秒超时。
- 等待接收数据。
- 一旦数据开始到达,请等待 JSON 数据完整到达,或者等待 1 秒超时。
- 解析并处理 JSON-RPC 消息。
- 发送 JSON-RPC 响应(
ReaderMessageEvent无需响应;socket_data_received不发送响应)。
支付流程
典型的支付流程如下:- POS 发送
PreAuthorize。 - EMV Core(在轻触卡片和授权后)以
TransactionComplete响应。 - POS 发送
ConfirmTransaction(商品已交付)或VoidTransaction(否则)。 - POS 可随时发送
CancelTransaction;TransactionComplete将以Cancelled状态返回。
- 始终使用 Confirm 或 Void/Cancel 关闭
PreAuthorize会话。未关闭的会话在一段时间后会被处理机构撤销,这可能会产生更高的费用。 - 一旦 EMV Core 确认收到
ConfirmTransaction,请勿重新发送。 - 要强制同步处理,请设置
PAYMENT_SVC_SYNCHRONOUS=1。


闭环(CLP)流
对于预付卡,EMV Core 会通过TransactionComplete 立即将卡 UID 返回给主机应用程序,而不发送到 Nayax 服务器。

命令
PreAuthorize
通过支付处理机构对卡进行预授权。EMV Core 等待卡片,读取卡片,处理卡片,然后发送TransactionComplete。
示例:
ConfirmTransaction
确认预授权,以便完成付款结算。 示例:VoidTransaction
在以下两种情况下可以撤销交易:- 交易已获得预授权但尚未确认,以释放预留资金。
- 交易已完成,但需要撤销(例如,产品未售出)。
VoidTransaction 不返回事件。请在 TMS 中通过搜索 Cancel 和 Cancel Declined 状态来检查已撤销交易的状态。
CancelTransaction
取消由PreAuthorize 启动的最后一笔交易:
- 卡片尚未轻触: 停止读卡器轮询序列。显示屏显示 “Cancelling”(取消中);主机应用程序必须更新显示内容。
- 卡片已被轻触但尚未完成: 返回
CannotCancel。TransactionComplete会在联机授权结果返回后到达。 - 交易已完成: 返回
NoTransaction。 - 对于
CannotCancel或NoTransaction,请使用VoidTransaction撤销已成功的交易。 - 如果
TransactionComplete返回Decline,则无需VoidTransaction。
GetCardToken
返回卡令牌而不执行支付交易。返回CardTokenReceived 事件。
- 对于支付卡:返回 base64 卡片令牌。
- 对于 CLP(例如 Mifare)卡:返回卡 UID。
注意:
- 需要将标签
DFA155添加到读卡器的 Clear results 标签列表中。 - 仅当
CLP_MIFARE_ENABLED=2时才会返回 CLP 卡 UID。
GetStatus
返回当前 EMV Core 状态。 示例:{NotReady, Ready, PaymentTransaction, Update, NoReader, NoTerminalId}
ShowMessage
在 OTI Saturn 读卡器显示屏上显示一条消息。 示例:GetVersion
返回系统中组件的版本。 示例:GetKioskID
返回自助服务终端识别号码。 示例:GetAttribute
返回 EMV Core 配置属性的值。 示例:事件
TransactionComplete
EMV Core 在交易完成(成功或失败)时发送。包含生成收据和解决争议所需的所有数据。 注意: 如果未收到确认,EMV Core 最多会重新发送 2 次(共计 3 次)。如果仍然没有收到回复,则会假定消息已被接收,并且不会取消该交易。 示例(开环):
授权详情字段:
闭环卡类型:
CardTokenReceived
在GetCardToken 完成时发送。
示例:
ReaderMessageEvent
Saturn 读卡器上显示的消息发生变化时发送。使用此事件可将自助终端应用与读卡器状态同步。 注意: 需要将读卡器配置为发送外部显示消息事件(标签 DF 46,索引 04)。此事件不需要确认。 示例:网络协议
Socket API
socket_connect
打开与远程主机的 TCP 套接字。socket_send
以二进制形式发送数据。发送数据前会阻塞。hex_data 是十六进制编码字符串(每字节 2 个 ASCII 字符)。
socket_recv
从套接字接收数据。返回十六进制编码的数据。socket_close
socket_data_received(事件)
当打开的套接字上有数据可用时,主机发送此消息。设备无响应。网络管理 API
network_get_status
如果网络可用,则返回"on"。