# NationECCode.dll项目分析报告 ## 📋 目录 1. [NationECCode.dll核心功能分析](#nationeccodedll核心功能分析) 2. [项目文件关联关系分析](#项目文件关联关系分析) 3. [业务流程与API交互分析](#业务流程与api交互分析) 4. [配置参数与数据流向分析](#配置参数与数据流向分析) 5. [UI交互与测试功能分析](#ui交互与测试功能分析) --- ## NationECCode.dll核心功能分析 ### 📋 **P/Invoke函数声明** #### 🔹 **NationEcTrans函数** ```csharp [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] private extern static IntPtr NationEcTrans(string url, string pindata, ref byte outinfo); ``` **📊 函数参数分析:** - **url**:`string` - API接口地址(医保电子凭证服务URL) - **pindata**:`string` - JSON格式的请求数据 - **outinfo**:`ref byte` - 输出缓冲区(4096字节) - **返回值**:`IntPtr` - 指向返回状态码的指针 ### 📋 **支持的业务类型** #### 🔹 **电子凭证相关业务** | 业务类型 | transType | 描述 | 对应方法 | |----------|-----------|------|----------| | **电子凭证查询** | `ec.query` | 读取医保电子凭证二维码 | `ReadQrCode()` | | **电子凭证获取** | `cn.nhsa.qrcode.get` | 终端获取电子凭证 | `ReadQrCode2()` | | **电子凭证认证** | `cn.nhsa.ec.auth` | 刷脸电子凭证认证 | `ReadFace()` | #### 🔹 **身份认证相关业务** | 业务类型 | transType | 描述 | 对应方法 | |----------|-----------|------|----------| | **身份证获取** | `cn.nhsa.cert.get` | 终端读取身份证信息 | `ReadIdCard()` | | **认证检查** | `cn.nhsa.auth.check` | 验证认证结果 | `getUserInfoByAuthNo()` | --- ## 项目文件关联关系分析 ### 📋 **一级关联 - 直接调用NationECCode.dll的文件** #### 🔹 **1. NationalEcBusiness.cs** - 核心业务类 **与NationECCode.dll的直接映射关系:** ```csharp // 所有业务方法都调用同一个DLL函数 NationEcTrans(url, pindata, ref outinfo) → 5种不同的业务场景 ``` **📊 业务方法映射:** - `ReadQrCode()` → 电子凭证查询 → `ec.query` - `ReadQrCode2()` → 电子凭证获取 → `cn.nhsa.qrcode.get` - `ReadIdCard()` → 身份证获取 → `cn.nhsa.cert.get` - `ReadFace()` → 刷脸认证 → `cn.nhsa.ec.auth` - `getUserInfoByAuthNo()` → 认证检查 → `cn.nhsa.auth.check` ### 📋 **二级关联 - 配置和数据管理** #### 🔹 **2. SiBusinessAddress.cs** - 配置参数类 **与NationECCode.dll相关的配置参数:** ```csharp // NationECCode.dll专用配置参数 public string readQrEcTokenUrl { get; set; } // API接口地址 public string organizationId { get; set; } // 机构ID ``` #### 🔹 **3. ReadCardResult.cs** - 返回数据模型 **与NationECCode.dll返回格式的对应:** ```csharp // NationECCode.dll返回数据 → ReadCardResult属性 JSON.code → code (0成功/其他失败) JSON.message → message (错误信息或成功描述) JSON.data → data (具体业务数据) ``` #### 🔹 **4. FaceAuthData.cs** - 人脸认证数据 **专门用于NationECCode.dll人脸认证流程:** ```csharp public class FaceAuthData { public string authNo { get; set; } // 认证号,用于后续验证 } ``` ### 📋 **三级关联 - 业务调用层** #### 🔹 **5. EntryController.cs** - Web API入口 **路由到NationECCode.dll功能的映射:** ```csharp // Web请求 → 业务方法 → NationECCode.dll函数 GET /readcard/entry?param=qrcode_01101 → NationalEcBusiness.ReadQrCode() → NationEcTrans() GET /readcard/entry?param=qrcode2_01101 → NationalEcBusiness.ReadQrCode2() → NationEcTrans() GET /readcard/entry?param=face_01101 → NationalEcBusiness.ReadFace() → NationEcTrans() GET /readcard/entry?param=idcard2_01101 → NationalEcBusiness.ReadIdCard() → NationEcTrans() ``` #### 🔹 **6. MainForm.cs** - 主窗体管理 **配置初始化与NationECCode.dll的关系:** ```csharp // 配置获取与设置 GetSiBusinessAddress() → 远程获取配置 → 失败时使用默认配置 address.readQrEcTokenUrl = "https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery"; address.organizationId = "H43010500370"; // 测试按钮调用 TestQrCode() → NationalEcBusiness.ReadQrCode("01101") → NationEcTrans() TestQrCode2() → NationalEcBusiness.ReadQrCode2("01101") → NationEcTrans() TestFace() → NationalEcBusiness.ReadFace("01101") → NationEcTrans() TestIdCard2() → NationalEcBusiness.ReadIdCard("01101") → NationEcTrans() ``` #### 🔹 **7. MainForm.Designer.cs** - UI控件绑定 **UI与NationECCode.dll功能的绑定:** ```csharp // UI控件 → 事件处理 → NationECCode.dll功能 qrcode_test.Click → TestQrCode() → ReadQrCode() → NationEcTrans() qr_code_test2.Click → TestQrCode2() → ReadQrCode2() → NationEcTrans() face_test.Click → TestFace() → ReadFace() → NationEcTrans() id_card_test2.Click → TestIdCard2() → ReadIdCard() → NationEcTrans() ``` --- ## 业务流程与API交互分析 ### 🔄 **完整调用链路图** ``` 🌐 外部HTTP请求 ↓ 📡 RestService.cs (localhost:8321) ↓ ⚙️ Startup.cs (路由配置) ↓ 🎯 EntryController.cs (API入口) ↓ 📊 NationalEcBusiness.cs (业务逻辑) ↓ 🏗️ SiBusinessAddress.cs (配置参数) ↓ 💿 NationECCode.dll (医保电子凭证驱动) ↓ 🌐 湖南省医保平台API (dvs.hun.hsip.gov.cn) ↓ 📤 ReadCardResult.cs (返回数据) ↓ 🖥️ MainForm.cs (UI显示/测试) ``` ### 🔗 **业务流程详细分析** #### 🔹 **1. 电子凭证查询流程 (ReadQrCode)** ``` 用户扫码 → SimulateClick()模拟点击 → 构建JSON请求 ↓ pindata = { "data": { "businessType": "01101", "deviceType": "", "orgId": "H43010500370" }, "orgId": "H43010500370", "transType": "ec.query" } ↓ NationEcTrans(readQrEcTokenUrl, pindata, outinfo) ↓ 解析返回数据 → 转换为统一JSON格式 → 返回结果 ``` #### 🔹 **2. 刷脸认证流程 (ReadFace)** ``` 第一步:人脸识别认证 pindata.transType = "cn.nhsa.ec.auth" ↓ NationEcTrans() → 获取authNo ↓ 第二步:根据authNo获取用户信息 pindata.transType = "cn.nhsa.auth.check" pindata.authNo = "获取到的认证号" ↓ NationEcTrans() → 获取最终用户信息 ``` #### 🔹 **3. 身份证读取流程 (ReadIdCard)** ``` 构建身份证读取请求 pindata.transType = "cn.nhsa.cert.get" ↓ NationEcTrans() → 终端读取身份证 ↓ 返回身份证信息 ``` --- ## 配置参数与数据流向分析 ### 🔗 **配置参数完整流向** ``` 🌐 远程配置服务器 (172.16.32.167:8077) ↓ (HTTP请求) 🖥️ MainForm.GetSiBusinessAddress() ↓ (反序列化) 📊 SiBusinessAddress对象 ├── readQrEcTokenUrl → "https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery" └── organizationId → "H43010500370" ↓ (参数传递) 💿 NationECCode.dll.NationEcTrans(readQrEcTokenUrl, pindata, outinfo) ↓ (缓冲区分配) byte[] outinfo = new byte[4096]; ↓ (网络请求) 🌐 湖南省医保电子凭证平台 ``` ### 📊 **数据格式分析** #### 🔹 **输入数据格式 (pindata)** ```json { "data": { "businessType": "01101", // 业务类型 "deviceType": "", // 设备类型 "orgId": "H43010500370", // 机构ID "authNo": "认证号" // 仅在认证检查时使用 }, "orgId": "H43010500370", // 机构ID "transType": "业务交易类型" // ec.query, cn.nhsa.cert.get等 } ``` #### 🔹 **输出数据格式 (outinfo)** ```json { "code": 0, // 0=成功,其他=失败 "message": "成功描述", // 错误信息或成功描述 "data": { // 具体业务数据 "idCard": "身份证号", "name": "姓名", "authNo": "认证号" // 人脸认证时返回 } } ``` ### 🔄 **数据转换流程** ``` NationECCode.dll返回数据 ↓ IntPtr retPtr → Marshal.PtrToStringAnsi() → 状态码字符串 byte[] outinfo → Encoding.Default.GetString() → JSON字符串 ↓ JsonConvert.DeserializeObject() → 结构化数据 ↓ 转换为统一的JObject格式: { "code": 200/1001, // 200=成功,1001=失败 "message": "操作结果描述", "type": "qrcode/face/idcard", // 业务类型标识 "data": "原始数据", // 原始JSON数据 "sign": null // 签名(NationECCode.dll不使用) } ``` --- ## UI交互与测试功能分析 ### 🖥️ **UI控件与NationECCode.dll的映射关系** #### 🔹 **测试按钮功能映射** | UI控件 | 测试方法 | 业务方法 | transType | 描述 | |--------|----------|----------|-----------|------| | `qrcode_test` | `TestQrCode()` | `ReadQrCode()` | `ec.query` | 扫码墩电子凭证测试 | | `qr_code_test2` | `TestQrCode2()` | `ReadQrCode2()` | `cn.nhsa.qrcode.get` | 刷脸终端电子凭证测试 | | `face_test` | `TestFace()` | `ReadFace()` | `cn.nhsa.ec.auth` | 刷脸认证测试 | | `id_card_test2` | `TestIdCard2()` | `ReadIdCard()` | `cn.nhsa.cert.get` | 刷脸终端身份证测试 | #### 🔹 **UI分类设计** ```csharp // 扫码墩设备 (第一行按钮) label1.Text = "扫码墩:"; - sicard_test // 社保卡测试 (使用SSCard.dll) - idcard_test // 身份证测试 (使用SSCard.dll) - qrcode_test // 电子凭证测试 (使用NationECCode.dll) // 刷脸终端设备 (第二行按钮) label2.Text = "刷脸终端:"; - face_test // 刷脸测试 (使用NationECCode.dll) - id_card_test2 // 身份证测试 (使用NationECCode.dll) - qr_code_test2 // 电子凭证测试 (使用NationECCode.dll) ``` ### 🔧 **特殊功能分析** #### 🔹 **鼠标模拟点击功能** ```csharp // 仅在ReadQrCode()中使用 public static void SimulateClick() { // 等待窗口状态变化 while (count < 5 && p.MainWindowHandle == beginHandle) { Thread.Sleep(200); } // 模拟鼠标点击屏幕中央 SetCursorPos(Screen.Width / 2, Screen.Height / 2); mouse_event(LeftDown | LeftUp); } ``` **用途**:可能用于激活读卡器设备或触发硬件事件 #### 🔹 **二阶段认证流程** ```csharp // ReadFace()采用二阶段认证 第一阶段:cn.nhsa.ec.auth → 获取authNo 第二阶段:cn.nhsa.auth.check → 根据authNo获取用户信息 ``` --- ## ⚠️ **关键问题与风险分析** ### 🔹 **1. 缓冲区大小固定** ```csharp // 所有业务都使用相同的缓冲区大小 byte[] outinfo = new byte[4096]; // 风险:大数据量可能导致截断 ``` ### 🔹 **2. 字符编码处理** ```csharp // 使用系统默认编码 Encoding.Default.GetString(outinfo) // 风险:在不同系统环境下可能出现乱码 ``` ### 🔹 **3. 异常处理缺失** ```csharp // 没有try-catch保护DLL调用 IntPtr retPtr = NationEcTrans(address.readQrEcTokenUrl, pindata, ref outinfo[0]); // 风险:DLL调用失败可能导致程序崩溃 ``` ### 🔹 **4. 网络依赖** ```csharp // 强依赖外部API "https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery" // 风险:网络异常或API变更影响功能 ``` ### 🔹 **5. 硬编码业务参数** ```csharp // 测试时硬编码业务类型 NationalEcBusiness.ReadQrCode("01101"); // 风险:业务类型变更需要修改代码 ``` --- ## 🎯 **NationECCode.dll架构总结** ### 📊 **项目整体架构图** ``` ┌─────────────────────────────────────────────────────────────┐ │ NationECCode.dll 架构体系 │ ├─────────────────────────────────────────────────────────────┤ │ 配置层:SiBusinessAddress.cs (readQrEcTokenUrl, orgId) │ │ 服务层:RestService.cs → EntryController.cs │ │ 业务层:NationalEcBusiness.cs (5种业务方法) │ │ 驱动层:NationECCode.dll (NationEcTrans函数) │ │ 外部API:dvs.hun.hsip.gov.cn (湖南省医保电子凭证平台) │ │ 数据层:ReadCardResult.cs, FaceAuthData.cs │ │ 界面层:MainForm.cs (4个测试按钮) │ │ 辅助功能:SimulateClick (鼠标模拟) │ └─────────────────────────────────────────────────────────────┘ ``` ### 🎯 **功能特点总结** 1. **统一接口**:所有业务都通过`NationEcTrans()`一个函数实现 2. **JSON通信**:使用JSON格式进行数据交换 3. **多业务支持**:支持电子凭证、身份证、人脸识别等多种业务 4. **二阶段认证**:人脸识别采用两步验证机制 5. **设备分类**:区分扫码墩和刷脸终端两种设备类型 6. **网络依赖**:强依赖湖南省医保电子凭证平台 **NationECCode.dll是项目中电子凭证和现代化医保业务的核心组件,与传统的SSCard.dll形成互补,共同构建了完整的医保读卡解决方案。** --- **📅 文档生成时间:** $(date) **📝 分析范围:** NationECCode.dll完整架构与业务流程关系 **🎯 分析目的:** 为NationECCode.dll的功能理解和问题排查提供详细参考