长沙泰和医院的NationECCode.dll项目分析报告.md 13 KB

NationECCode.dll项目分析报告

📋 目录

  1. NationECCode.dll核心功能分析
  2. 项目文件关联关系分析
  3. 业务流程与API交互分析
  4. 配置参数与数据流向分析
  5. UI交互与测试功能分析

NationECCode.dll核心功能分析

📋 P/Invoke函数声明

🔹 NationEcTrans函数

[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);

📊 函数参数分析:

  • urlstring - API接口地址(医保电子凭证服务URL)
  • pindatastring - JSON格式的请求数据
  • outinforef 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的直接映射关系:

// 所有业务方法都调用同一个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相关的配置参数:

// NationECCode.dll专用配置参数
public string readQrEcTokenUrl { get; set; }  // API接口地址
public string organizationId { get; set; }    // 机构ID

🔹 3. ReadCardResult.cs - 返回数据模型

与NationECCode.dll返回格式的对应:

// NationECCode.dll返回数据 → ReadCardResult属性
JSON.code → code (0成功/其他失败)
JSON.message → message (错误信息或成功描述)
JSON.data → data (具体业务数据)

🔹 4. FaceAuthData.cs - 人脸认证数据

专门用于NationECCode.dll人脸认证流程:

public class FaceAuthData
{
    public string authNo { get; set; }  // 认证号,用于后续验证
}

📋 三级关联 - 业务调用层

🔹 5. EntryController.cs - Web API入口

路由到NationECCode.dll功能的映射:

// 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的关系:

// 配置获取与设置
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功能的绑定:

// 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)

{
  "data": {
    "businessType": "01101",     // 业务类型
    "deviceType": "",            // 设备类型
    "orgId": "H43010500370",     // 机构ID
    "authNo": "认证号"           // 仅在认证检查时使用
  },
  "orgId": "H43010500370",       // 机构ID
  "transType": "业务交易类型"      // ec.query, cn.nhsa.cert.get等
}

🔹 输出数据格式 (outinfo)

{
  "code": 0,                     // 0=成功,其他=失败
  "message": "成功描述",          // 错误信息或成功描述
  "data": {                      // 具体业务数据
    "idCard": "身份证号",
    "name": "姓名",
    "authNo": "认证号"           // 人脸认证时返回
  }
}

🔄 数据转换流程

NationECCode.dll返回数据
    ↓
IntPtr retPtr → Marshal.PtrToStringAnsi() → 状态码字符串
byte[] outinfo → Encoding.Default.GetString() → JSON字符串
    ↓
JsonConvert.DeserializeObject<ReadCardResult>() → 结构化数据
    ↓
转换为统一的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分类设计

// 扫码墩设备 (第一行按钮)
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)

🔧 特殊功能分析

🔹 鼠标模拟点击功能

// 仅在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);
}

用途:可能用于激活读卡器设备或触发硬件事件

🔹 二阶段认证流程

// ReadFace()采用二阶段认证
第一阶段:cn.nhsa.ec.auth → 获取authNo
第二阶段:cn.nhsa.auth.check → 根据authNo获取用户信息

⚠️ 关键问题与风险分析

🔹 1. 缓冲区大小固定

// 所有业务都使用相同的缓冲区大小
byte[] outinfo = new byte[4096];
// 风险:大数据量可能导致截断

🔹 2. 字符编码处理

// 使用系统默认编码
Encoding.Default.GetString(outinfo)
// 风险:在不同系统环境下可能出现乱码

🔹 3. 异常处理缺失

// 没有try-catch保护DLL调用
IntPtr retPtr = NationEcTrans(address.readQrEcTokenUrl, pindata, ref outinfo[0]);
// 风险:DLL调用失败可能导致程序崩溃

🔹 4. 网络依赖

// 强依赖外部API
"https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery"
// 风险:网络异常或API变更影响功能

🔹 5. 硬编码业务参数

// 测试时硬编码业务类型
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的功能理解和问题排查提供详细参考