基于MDB端口的Android TCN SDK向带读卡器售货机发起支付请求的技术问询
MDB协议结合Android TCN SDK支付流程实现指导
以下是针对你提出的三个核心问题的具体实现步骤和代码片段,基于MDB协议规范和TCN SDK的通用封装逻辑:
1. 通过MDB协议向读卡器请求支付信息
MDB协议中,读卡器的默认地址为0x03,请求支付信息(卡号、有效期等)需发送Get Data命令(命令码0x06),结合TCN SDK的MDB通信接口实现如下:
代码片段
// 初始化TCN SDK的MDB通信实例(需确保已完成MDB连接初始化) MdbCommunicator mdbComm = TcnSdk.getInstance().getMdbCommunicator(); final int READER_ADDRESS = 0x03; // MDB总线读卡器默认地址 // 构造请求支付信息的命令帧:子命令0x01表示请求卡片核心支付数据 byte[] requestFrame = new byte[]{ (byte) READER_ADDRESS, (byte) 0x06, // MDB命令码:Get Data (byte) 0x01, // 子命令:请求PAN、有效期等信息 (byte) 0x00 // CRC校验位(多数TCN SDK会自动计算填充,可省略手动设置) }; // 发送命令并接收响应 MdbResponse response = mdbComm.sendCommand(requestFrame); if (response.isSuccess()) { byte[] payload = response.getPayload(); // 解析响应payload中的支付信息(按MDB协议格式解析) String pan = extractPan(payload); // 提取卡号 String expiryDate = extractExpiry(payload); // 提取有效期(MMYY格式) } else { // 处理通信失败:如读卡器无响应、命令错误 }
解析逻辑说明
extractPan:从payload指定位置提取卡号,若返回加密PAN,需调用TCN SDK的解密接口:byte[] decryptedPan = TcnSdk.getInstance().getCryptoManager().decrypt(payload); String pan = new String(decryptedPan, StandardCharsets.US_ASCII).trim();extractExpiry:从payload中提取4位字符(MMYY格式),如1225代表2025年12月。
2. 验证用户输入与读卡器返回信息匹配
验证逻辑核心是对比用户输入的简化信息(卡号后四位、有效期)与读卡器返回的完整数据:
代码片段
// 从读卡器响应中提取的信息 String readerPan = "4111111111111111"; String readerExpiry = "1225"; // 用户输入的验证信息 String userInputLastFour = "1111"; String userInputExpiry = "12/25"; // 格式化用户输入的有效期为MDB标准格式(MMYY) String formattedUserExpiry = userInputExpiry.replace("/", "").trim(); // 执行匹配校验 boolean isPanMatch = readerPan.endsWith(userInputLastFour); boolean isExpiryMatch = readerExpiry.equals(formattedUserExpiry); if (isPanMatch && isExpiryMatch) { // 信息匹配,进入支付请求环节 } else { // 信息不匹配,提示用户重新输入 }
注意事项
- 若读卡器返回加密信息,需先解密再做匹配;
- 如需验证CVV,需在请求支付信息时使用子命令
0x02获取CVV数据。
3. 通过MDB协议发送支付请求
支付请求需发送Authorize Transaction命令(命令码0x07),携带交易金额、已验证的支付信息:
代码片段
int transactionAmount = 1000; // 交易金额(单位:分,10元=1000分) String pan = "4111111111111111"; String expiry = "1225"; // 构造支付授权命令帧 byte[] authFrame = new byte[]{ (byte) 0x03, // 读卡器地址 (byte) 0x07, // MDB命令码:Authorize Transaction (byte) (transactionAmount >> 8 & 0xFF), // 金额高字节 (byte) (transactionAmount & 0xFF), // 金额低字节 (byte) pan.length(), // PAN长度 (byte[]) pan.getBytes(StandardCharsets.US_ASCII), // PAN字节数组 (byte) expiry.length(), // 有效期长度 (byte[]) expiry.getBytes(StandardCharsets.US_ASCII) // 有效期字节数组 }; // 发送授权命令并处理响应 MdbResponse authResponse = mdbComm.sendCommand(authFrame); switch (authResponse.getResponseCode()) { case 0x00: // 支付授权成功,触发售货机出货 break; case 0x01: // 支付失败:余额不足、卡片无效等 break; case 0x02: // 通信超时或读卡器无响应 break; default: // 其他错误,参考MDB协议规范的响应码定义 break; }
关键说明
- 交易金额需转换为MDB要求的分单位,并按大端字节序存储;
- 部分读卡器要求携带交易ID、终端ID等额外参数,需对照读卡器的MDB手册调整命令帧;
- TCN SDK的
MdbResponse会自动解析响应码,无需手动处理CRC校验。
内容的提问来源于stack exchange,提问作者Pravin Suthar
相关产品推荐
相关产品推荐

