# 业务代码URL处理修复说明 ## 📋 问题分析 ### 原始问题 在EntryController.cs中,当URL格式为 `huashi_01101` 或 `jiangsu_01101` 时,代码会将业务代码(如`01101`)误认为是操作动作(action),导致以下错误: ``` 华视读卡器操作【01101】错误!允许的操作为【init、readcard、continuous、status、close】 江苏医保操作【01101】错误!允许的操作为【init、readcard、readcard_pin、verifypin、changepin、status、reset、getpersoninfo、checkdll】 ``` ### 根本原因 ```csharp // 问题代码逻辑 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. 添加业务代码检测方法 ```csharp /// /// 判断字符串是否是业务代码格式(5位数字) /// /// 要检查的字符串 /// 是否是业务代码 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. 修改华视读卡器处理逻辑 ```csharp 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. 修改江苏医保处理逻辑 ```csharp 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. **其他功能测试**:验证不相关的功能保持正常 ### 测试用例 ```javascript // 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调用 ```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# 调用示例 ```csharp // 这些调用现在都能正常工作 var result1 = await CallApi("huashi_readcard"); var result2 = await CallApi("huashi_01101"); // ← 修复的,等效于上面 var result3 = await CallApi("jiangsu_01101"); // ← 修复的 ``` --- **总结**:本次修复通过智能识别5位数字业务代码,使华视读卡器和江苏医保功能能够正确处理标准的URL格式,提高了系统的兼容性和用户体验,同时保持了完全的向后兼容性。