业务代码URL处理修复说明.md 7.5 KB

业务代码URL处理修复说明

📋 问题分析

原始问题

在EntryController.cs中,当URL格式为 huashi_01101jiangsu_01101 时,代码会将业务代码(如01101)误认为是操作动作(action),导致以下错误:

华视读卡器操作【01101】错误!允许的操作为【init、readcard、continuous、status、close】
江苏医保操作【01101】错误!允许的操作为【init、readcard、readcard_pin、verifypin、changepin、status、reset、getpersoninfo、checkdll】

根本原因

// 问题代码逻辑
string[] temps = param.Split(new char[] { '_' });
string type = temps[0];
string action = temps.Length > 1 ? temps[1] : "readcard";

// 当param="huashi_01101"时:
// type = "huashi"
// action = "01101" ← 这里把业务代码当作了操作动作

URL调用模式分析

URL格式 期望行为 实际行为 问题
huashi_readcard ✅ 读取身份证 ✅ 正常工作
huashi_01101 ✅ 读取身份证(忽略业务代码) ❌ 报错"操作01101错误" 需要修复
jiangsu_readcard ✅ 读取社保卡 ✅ 正常工作
jiangsu_01101 ✅ 读取社保卡(忽略业务代码) ❌ 报错"操作01101错误" 需要修复
qrcode_01101 ✅ 电子凭证+业务代码 ✅ 正常工作
sicard ✅ 读取社保卡 ✅ 正常工作

🔧 修复方案

1. 添加业务代码检测方法

/// <summary>
/// 判断字符串是否是业务代码格式(5位数字)
/// </summary>
/// <param name="code">要检查的字符串</param>
/// <returns>是否是业务代码</returns>
private bool IsBusinessCode(string code)
{
    if (string.IsNullOrEmpty(code) || code.Length != 5)
    {
        return false;
    }
    
    // 检查是否是5位数字
    foreach (char c in code)
    {
        if (!char.IsDigit(c))
        {
            return false;
        }
    }
    
    return true;
}

2. 修改华视读卡器处理逻辑

else if (type.Equals("huashi"))
{
    // 华视读卡器调用
    string action = temps.Length > 1 ? temps[1] : "readcard";
    
    // 检查是否是业务代码格式(5位数字),如果是则默认为readcard操作
    if (temps.Length > 1 && IsBusinessCode(temps[1]))
    {
        action = "readcard"; // 业务代码不影响华视读卡器操作,默认读卡
    }
    
    // ... 其余逻辑保持不变
}

3. 修改江苏医保处理逻辑

else if (type.Equals("jiangsu"))
{
    // 江苏医保社保卡读取
    string action = temps.Length > 1 ? temps[1] : "readcard";
    
    // 检查是否是业务代码格式(5位数字),如果是则默认为readcard操作
    if (temps.Length > 1 && IsBusinessCode(temps[1]))
    {
        action = "readcard"; // 业务代码不影响江苏医保读卡操作,默认读卡
    }
    
    // ... 其余逻辑保持不变
}

✅ 修复效果

修复前 vs 修复后

URL 修复前 修复后
huashi_01101 ❌ 报错"操作01101错误" ✅ 等效于 huashi_readcard
huashi_01201 ❌ 报错"操作01201错误" ✅ 等效于 huashi_readcard
jiangsu_01101 ❌ 报错"操作01101错误" ✅ 等效于 jiangsu_readcard
jiangsu_01201 ❌ 报错"操作01201错误" ✅ 等效于 jiangsu_readcard

业务代码识别规则

输入 是否业务代码 处理方式
01101 ✅ 是(5位数字) 转为默认操作 readcard
01201 ✅ 是(5位数字) 转为默认操作 readcard
readcard ❌ 否(非5位数字) 作为操作动作处理
init ❌ 否(非5位数字) 作为操作动作处理
12345a ❌ 否(包含字母) 作为操作动作处理(会报错)
123456 ❌ 否(6位数字) 作为操作动作处理(会报错)

🛡️ 向后兼容性

✅ 保持正常的调用方式

  • huashi_readcard → 继续正常工作
  • huashi_init_1001 → 继续正常工作
  • jiangsu_readcard → 继续正常工作
  • jiangsu_status → 继续正常工作

✅ 保持其他功能不受影响

  • sicard → 继续正常工作
  • idcard → 继续正常工作
  • qrcode_01101 → 继续正常工作(电子凭证正确传递业务代码)
  • idcard2_01101 → 继续正常工作

✅ 错误处理仍然有效

  • huashi_invalid → 继续报错(友好的错误信息)
  • jiangsu_invalid → 继续报错(友好的错误信息)

🧪 测试验证

测试页面

创建了 test_businesscode_fix.html 测试页面,包含:

  1. 正常功能测试:验证现有功能没有被破坏
  2. 修复功能测试:验证业务代码URL现在可以正常工作
  3. 错误处理测试:验证无效操作仍然报错
  4. 其他功能测试:验证不相关的功能保持正常

测试用例

// 1. 华视读卡器
testUrl('huashi_readcard');  // ✅ 应该成功
testUrl('huashi_01101');     // ✅ 应该成功(修复的)
testUrl('huashi_invalid');   // ❌ 应该报错

// 2. 江苏医保
testUrl('jiangsu_readcard'); // ✅ 应该成功
testUrl('jiangsu_01101');    // ✅ 应该成功(修复的)
testUrl('jiangsu_invalid');  // ❌ 应该报错

// 3. 其他功能
testUrl('sicard');           // ✅ 应该成功
testUrl('qrcode_01101');     // ✅ 应该成功

📊 技术细节

修改的文件

  • ThCardReader/EntryController.cs

新增的方法

  • IsBusinessCode(string code) - 检测5位数字业务代码

修改的逻辑

  • 华视读卡器URL处理逻辑
  • 江苏医保URL处理逻辑

代码行数变化

  • 新增约 20 行代码
  • 主要是业务代码检测逻辑

🎯 业务价值

解决的问题

  1. API兼容性:支持标准的 {type}_{bizcode} URL格式
  2. 用户体验:减少因URL格式导致的错误
  3. 前端集成:简化前端调用逻辑,不需要区分不同类型的URL格式

带来的好处

  1. 统一的URL格式:所有读卡功能都支持 {type}_{bizcode} 格式
  2. 更好的容错性:业务代码参数不会导致系统报错
  3. 向后兼容:不影响现有的任何功能
  4. 代码健壮性:增强了系统的稳定性

🔍 使用示例

前端JavaScript调用

// 现在这些调用都能正常工作:

// 华视读卡器
fetch('http://localhost:8321/readcard/entry?param=huashi_readcard')
fetch('http://localhost:8321/readcard/entry?param=huashi_01101')  // ← 修复的
fetch('http://localhost:8321/readcard/entry?param=huashi_01201')  // ← 修复的

// 江苏医保
fetch('http://localhost:8321/readcard/entry?param=jiangsu_readcard')
fetch('http://localhost:8321/readcard/entry?param=jiangsu_01101') // ← 修复的
fetch('http://localhost:8321/readcard/entry?param=jiangsu_01201') // ← 修复的

// 电子凭证(业务代码正确传递,保持不变)
fetch('http://localhost:8321/readcard/entry?param=qrcode_01101')

C# 调用示例

// 这些调用现在都能正常工作
var result1 = await CallApi("huashi_readcard");
var result2 = await CallApi("huashi_01101");  // ← 修复的,等效于上面
var result3 = await CallApi("jiangsu_01101"); // ← 修复的

总结:本次修复通过智能识别5位数字业务代码,使华视读卡器和江苏医保功能能够正确处理标准的URL格式,提高了系统的兼容性和用户体验,同时保持了完全的向后兼容性。