[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);
📊 函数参数分析:
string
- API接口地址(医保电子凭证服务URL)string
- JSON格式的请求数据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的直接映射关系:
// 所有业务方法都调用同一个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
与NationECCode.dll相关的配置参数:
// NationECCode.dll专用配置参数
public string readQrEcTokenUrl { get; set; } // API接口地址
public string organizationId { get; set; } // 机构ID
与NationECCode.dll返回格式的对应:
// NationECCode.dll返回数据 → ReadCardResult属性
JSON.code → code (0成功/其他失败)
JSON.message → message (错误信息或成功描述)
JSON.data → data (具体业务数据)
专门用于NationECCode.dll人脸认证流程:
public class FaceAuthData
{
public string authNo { get; set; } // 认证号,用于后续验证
}
路由到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()
配置初始化与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()
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()
🌐 外部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显示/测试)
用户扫码 → SimulateClick()模拟点击 → 构建JSON请求
↓
pindata = {
"data": {
"businessType": "01101",
"deviceType": "",
"orgId": "H43010500370"
},
"orgId": "H43010500370",
"transType": "ec.query"
}
↓
NationEcTrans(readQrEcTokenUrl, pindata, outinfo)
↓
解析返回数据 → 转换为统一JSON格式 → 返回结果
第一步:人脸识别认证
pindata.transType = "cn.nhsa.ec.auth"
↓
NationEcTrans() → 获取authNo
↓
第二步:根据authNo获取用户信息
pindata.transType = "cn.nhsa.auth.check"
pindata.authNo = "获取到的认证号"
↓
NationEcTrans() → 获取最终用户信息
构建身份证读取请求
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];
↓ (网络请求)
🌐 湖南省医保电子凭证平台
{
"data": {
"businessType": "01101", // 业务类型
"deviceType": "", // 设备类型
"orgId": "H43010500370", // 机构ID
"authNo": "认证号" // 仅在认证检查时使用
},
"orgId": "H43010500370", // 机构ID
"transType": "业务交易类型" // ec.query, cn.nhsa.cert.get等
}
{
"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控件 | 测试方法 | 业务方法 | 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 |
刷脸终端身份证测试 |
// 扫码墩设备 (第一行按钮)
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获取用户信息
// 所有业务都使用相同的缓冲区大小
byte[] outinfo = new byte[4096];
// 风险:大数据量可能导致截断
// 使用系统默认编码
Encoding.Default.GetString(outinfo)
// 风险:在不同系统环境下可能出现乱码
// 没有try-catch保护DLL调用
IntPtr retPtr = NationEcTrans(address.readQrEcTokenUrl, pindata, ref outinfo[0]);
// 风险:DLL调用失败可能导致程序崩溃
// 强依赖外部API
"https://dvs.hun.hsip.gov.cn/localcfc/api/hsecfc/localQrCodeQuery"
// 风险:网络异常或API变更影响功能
// 测试时硬编码业务类型
NationalEcBusiness.ReadQrCode("01101");
// 风险:业务类型变更需要修改代码
┌─────────────────────────────────────────────────────────────┐
│ 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 (鼠标模拟) │
└─────────────────────────────────────────────────────────────┘
NationEcTrans()
一个函数实现NationECCode.dll是项目中电子凭证和现代化医保业务的核心组件,与传统的SSCard.dll形成互补,共同构建了完整的医保读卡解决方案。
📅 文档生成时间: $(date)
📝 分析范围: NationECCode.dll完整架构与业务流程关系
🎯 分析目的: 为NationECCode.dll的功能理解和问题排查提供详细参考