江苏医保社保卡控制器.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Web.Http;
  4. namespace ThCardReader
  5. {
  6. /// <summary>
  7. /// 江苏医保社保卡读取API控制器
  8. /// 参考华视读卡器控制器设计,独立于现有医保业务
  9. /// </summary>
  10. public class JiangSuSocialCardController : ApiController
  11. {
  12. /// <summary>
  13. /// 初始化江苏医保社保卡系统
  14. /// </summary>
  15. /// <param name="request">配置参数</param>
  16. /// <returns>初始化结果</returns>
  17. [HttpPost]
  18. [Route("api/jiangsu/init")]
  19. public IHttpActionResult InitJiangSuSystem([FromBody] dynamic request)
  20. {
  21. try
  22. {
  23. JiangSuSocialCardBusiness.JiangSuConfig config = null;
  24. // 解析配置参数
  25. if (request != null)
  26. {
  27. config = new JiangSuSocialCardBusiness.JiangSuConfig();
  28. if (request.IP != null) config.IP = (string)request.IP;
  29. if (request.PORT != null) config.PORT = (int)request.PORT;
  30. if (request.TIMEOUT != null) config.TIMEOUT = (int)request.TIMEOUT;
  31. if (request.LOG_PATH != null) config.LOG_PATH = (string)request.LOG_PATH;
  32. if (request.CARD_PASSTYPE != null) config.CARD_PASSTYPE = (string)request.CARD_PASSTYPE;
  33. if (request.EC_URL != null) config.EC_URL = (string)request.EC_URL;
  34. if (request.API_NAME != null) config.API_NAME = (string)request.API_NAME;
  35. if (request.API_VERSION != null) config.API_VERSION = (string)request.API_VERSION;
  36. if (request.ACCESS_KEY != null) config.ACCESS_KEY = (string)request.ACCESS_KEY;
  37. if (request.SECRETKEY != null) config.SECRETKEY = (string)request.SECRETKEY;
  38. if (request.ORG_ID != null) config.ORG_ID = (string)request.ORG_ID;
  39. if (request.AREA_CODE != null) config.AREA_CODE = (string)request.AREA_CODE;
  40. if (request.EXT != null) config.EXT = (string)request.EXT;
  41. }
  42. var result = JiangSuSocialCardBusiness.Initialize(config);
  43. if ((int)result["code"] == 200)
  44. {
  45. return Ok(result);
  46. }
  47. else
  48. {
  49. return BadRequest(result.ToString());
  50. }
  51. }
  52. catch (Exception ex)
  53. {
  54. var errorResult = new JObject
  55. {
  56. ["code"] = 1001,
  57. ["message"] = $"江苏医保系统初始化异常: {ex.Message}",
  58. ["device"] = "江苏医保社保卡读卡器",
  59. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  60. };
  61. return BadRequest(errorResult.ToString());
  62. }
  63. }
  64. /// <summary>
  65. /// 读取社保卡基本信息
  66. /// </summary>
  67. /// <param name="request">读卡参数</param>
  68. /// <returns>社保卡信息</returns>
  69. [HttpPost]
  70. [Route("api/jiangsu/readcard")]
  71. public IHttpActionResult ReadSocialCard([FromBody] dynamic request)
  72. {
  73. try
  74. {
  75. bool autoVerifyPIN = false;
  76. if (request != null && request.autoVerifyPIN != null)
  77. {
  78. autoVerifyPIN = (bool)request.autoVerifyPIN;
  79. }
  80. var result = JiangSuSocialCardBusiness.ReadSocialCard(autoVerifyPIN);
  81. if ((int)result["code"] == 200)
  82. {
  83. return Ok(result);
  84. }
  85. else
  86. {
  87. return BadRequest(result.ToString());
  88. }
  89. }
  90. catch (Exception ex)
  91. {
  92. var errorResult = new JObject
  93. {
  94. ["code"] = 2001,
  95. ["message"] = $"江苏医保读卡异常: {ex.Message}",
  96. ["device"] = "江苏医保社保卡读卡器",
  97. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  98. };
  99. return BadRequest(errorResult.ToString());
  100. }
  101. }
  102. /// <summary>
  103. /// 验证社保卡PIN码
  104. /// </summary>
  105. /// <returns>验证结果</returns>
  106. [HttpPost]
  107. [Route("api/jiangsu/verifypin")]
  108. public IHttpActionResult VerifyCardPIN()
  109. {
  110. try
  111. {
  112. var result = JiangSuSocialCardBusiness.VerifyCardPIN();
  113. if ((int)result["code"] == 200)
  114. {
  115. return Ok(result);
  116. }
  117. else
  118. {
  119. return BadRequest(result.ToString());
  120. }
  121. }
  122. catch (Exception ex)
  123. {
  124. var errorResult = new JObject
  125. {
  126. ["code"] = 3001,
  127. ["message"] = $"江苏医保PIN验证异常: {ex.Message}",
  128. ["device"] = "江苏医保社保卡读卡器",
  129. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  130. };
  131. return BadRequest(errorResult.ToString());
  132. }
  133. }
  134. /// <summary>
  135. /// 修改社保卡PIN码
  136. /// </summary>
  137. /// <returns>修改结果</returns>
  138. [HttpPost]
  139. [Route("api/jiangsu/changepin")]
  140. public IHttpActionResult ChangeCardPIN()
  141. {
  142. try
  143. {
  144. var result = JiangSuSocialCardBusiness.ChangeCardPIN();
  145. if ((int)result["code"] == 200)
  146. {
  147. return Ok(result);
  148. }
  149. else
  150. {
  151. return BadRequest(result.ToString());
  152. }
  153. }
  154. catch (Exception ex)
  155. {
  156. var errorResult = new JObject
  157. {
  158. ["code"] = 4001,
  159. ["message"] = $"江苏医保PIN修改异常: {ex.Message}",
  160. ["device"] = "江苏医保社保卡读卡器",
  161. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  162. };
  163. return BadRequest(errorResult.ToString());
  164. }
  165. }
  166. /// <summary>
  167. /// 四合一介质支持 - 获取个人信息
  168. /// </summary>
  169. /// <param name="request">介质类型和输入数据</param>
  170. /// <returns>个人信息</returns>
  171. [HttpPost]
  172. [Route("api/jiangsu/getpersoninfo")]
  173. public IHttpActionResult GetPersonInfo([FromBody] dynamic request)
  174. {
  175. try
  176. {
  177. string mediaType = "socialcard";
  178. string inputData = "";
  179. if (request != null)
  180. {
  181. if (request.mediaType != null) mediaType = (string)request.mediaType;
  182. if (request.inputData != null) inputData = (string)request.inputData;
  183. }
  184. var result = JiangSuSocialCardBusiness.GetPersonInfo(mediaType, inputData);
  185. if ((int)result["code"] == 200)
  186. {
  187. return Ok(result);
  188. }
  189. else
  190. {
  191. return BadRequest(result.ToString());
  192. }
  193. }
  194. catch (Exception ex)
  195. {
  196. var errorResult = new JObject
  197. {
  198. ["code"] = 5001,
  199. ["message"] = $"江苏医保个人信息获取异常: {ex.Message}",
  200. ["device"] = "江苏医保社保卡读卡器",
  201. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  202. };
  203. return BadRequest(errorResult.ToString());
  204. }
  205. }
  206. /// <summary>
  207. /// 获取设备状态
  208. /// </summary>
  209. /// <returns>设备状态</returns>
  210. [HttpGet]
  211. [Route("api/jiangsu/status")]
  212. public IHttpActionResult GetDeviceStatus()
  213. {
  214. try
  215. {
  216. var result = JiangSuSocialCardBusiness.GetDeviceStatus();
  217. return Ok(result);
  218. }
  219. catch (Exception ex)
  220. {
  221. var errorResult = new JObject
  222. {
  223. ["code"] = 7001,
  224. ["message"] = $"获取江苏医保设备状态异常: {ex.Message}",
  225. ["device"] = "江苏医保社保卡读卡器",
  226. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  227. };
  228. return BadRequest(errorResult.ToString());
  229. }
  230. }
  231. /// <summary>
  232. /// 重置系统内部状态
  233. /// </summary>
  234. /// <returns>重置结果</returns>
  235. [HttpPost]
  236. [Route("api/jiangsu/reset")]
  237. public IHttpActionResult ResetSystemState()
  238. {
  239. try
  240. {
  241. var result = JiangSuSocialCardBusiness.ResetSystemState();
  242. return Ok(result);
  243. }
  244. catch (Exception ex)
  245. {
  246. var errorResult = new JObject
  247. {
  248. ["code"] = 6001,
  249. ["message"] = $"江苏医保系统状态重置异常: {ex.Message}",
  250. ["device"] = "江苏医保社保卡读卡器",
  251. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
  252. };
  253. return BadRequest(errorResult.ToString());
  254. }
  255. }
  256. /// <summary>
  257. /// 简化调用接口 - 快速读卡
  258. /// </summary>
  259. /// <param name="action">操作类型:readcard、verifypin、status、reset</param>
  260. /// <param name="autoVerifyPIN">是否自动验证PIN</param>
  261. /// <returns>操作结果</returns>
  262. [HttpGet]
  263. [Route("api/jiangsu/simple")]
  264. public IHttpActionResult SimpleCall(string action = "readcard", bool autoVerifyPIN = false)
  265. {
  266. try
  267. {
  268. switch (action.ToLower())
  269. {
  270. case "readcard":
  271. var readResult = JiangSuSocialCardBusiness.ReadSocialCard(autoVerifyPIN);
  272. return readResult["code"].Value<int>() == 200 ? Ok(readResult) : BadRequest(readResult.ToString());
  273. case "verifypin":
  274. var pinResult = JiangSuSocialCardBusiness.VerifyCardPIN();
  275. return pinResult["code"].Value<int>() == 200 ? Ok(pinResult) : BadRequest(pinResult.ToString());
  276. case "status":
  277. var statusResult = JiangSuSocialCardBusiness.GetDeviceStatus();
  278. return Ok(statusResult);
  279. case "reset":
  280. var resetResult = JiangSuSocialCardBusiness.ResetSystemState();
  281. return Ok(resetResult);
  282. default:
  283. var errorResult = new JObject
  284. {
  285. ["code"] = 8001,
  286. ["message"] = $"不支持的操作类型: {action}",
  287. ["device"] = "江苏医保社保卡读卡器",
  288. ["supportedActions"] = new JArray { "readcard", "verifypin", "status", "reset" }
  289. };
  290. return BadRequest(errorResult.ToString());
  291. }
  292. }
  293. catch (Exception ex)
  294. {
  295. var errorResult = new JObject
  296. {
  297. ["code"] = 8002,
  298. ["message"] = $"简化调用异常: {ex.Message}",
  299. ["device"] = "江苏医保社保卡读卡器",
  300. ["action"] = action
  301. };
  302. return BadRequest(errorResult.ToString());
  303. }
  304. }
  305. /// <summary>
  306. /// 健康检查接口
  307. /// </summary>
  308. /// <returns>系统健康状态</returns>
  309. [HttpGet]
  310. [Route("api/jiangsu/health")]
  311. public IHttpActionResult HealthCheck()
  312. {
  313. try
  314. {
  315. var result = new JObject
  316. {
  317. ["code"] = 200,
  318. ["message"] = "江苏医保社保卡系统运行正常",
  319. ["device"] = "江苏医保社保卡读卡器",
  320. ["version"] = "1.0.0",
  321. ["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  322. ["status"] = JiangSuSocialCardBusiness.GetDeviceStatus()["status"]
  323. };
  324. return Ok(result);
  325. }
  326. catch (Exception ex)
  327. {
  328. var errorResult = new JObject
  329. {
  330. ["code"] = 9001,
  331. ["message"] = $"健康检查异常: {ex.Message}",
  332. ["device"] = "江苏医保社保卡读卡器"
  333. };
  334. return BadRequest(errorResult.ToString());
  335. }
  336. }
  337. /// <summary>
  338. /// API帮助文档
  339. /// </summary>
  340. /// <returns>API使用说明</returns>
  341. [HttpGet]
  342. [Route("api/jiangsu/help")]
  343. public IHttpActionResult GetApiHelp()
  344. {
  345. var helpInfo = new JObject
  346. {
  347. ["title"] = "江苏医保社保卡读取API接口文档",
  348. ["version"] = "1.0.0",
  349. ["device"] = "江苏医保社保卡读卡器",
  350. ["baseUrl"] = "http://localhost:8321/api/jiangsu",
  351. ["endpoints"] = new JObject
  352. {
  353. ["初始化系统"] = new JObject
  354. {
  355. ["method"] = "POST",
  356. ["url"] = "/init",
  357. ["description"] = "初始化江苏医保社保卡系统",
  358. ["parameters"] = new JObject
  359. {
  360. ["IP"] = "医保平台IP地址",
  361. ["PORT"] = "医保平台端口",
  362. ["TIMEOUT"] = "超时时间(秒)",
  363. ["ORG_ID"] = "定点编号",
  364. ["ACCESS_KEY"] = "访问密钥",
  365. ["SECRETKEY"] = "秘钥"
  366. }
  367. },
  368. ["读取社保卡"] = new JObject
  369. {
  370. ["method"] = "POST",
  371. ["url"] = "/readcard",
  372. ["description"] = "读取社保卡基本信息(38号文格式)",
  373. ["parameters"] = new JObject
  374. {
  375. ["autoVerifyPIN"] = "是否自动验证PIN码"
  376. }
  377. },
  378. ["验证PIN码"] = new JObject
  379. {
  380. ["method"] = "POST",
  381. ["url"] = "/verifypin",
  382. ["description"] = "验证社保卡PIN码"
  383. },
  384. ["修改PIN码"] = new JObject
  385. {
  386. ["method"] = "POST",
  387. ["url"] = "/changepin",
  388. ["description"] = "修改社保卡PIN码"
  389. },
  390. ["四合一读取"] = new JObject
  391. {
  392. ["method"] = "POST",
  393. ["url"] = "/getpersoninfo",
  394. ["description"] = "四合一介质个人信息获取",
  395. ["parameters"] = new JObject
  396. {
  397. ["mediaType"] = "介质类型: socialcard/electronicvoucher/electronicsocialcard/idcard",
  398. ["inputData"] = "输入数据"
  399. }
  400. },
  401. ["设备状态"] = new JObject
  402. {
  403. ["method"] = "GET",
  404. ["url"] = "/status",
  405. ["description"] = "获取设备状态"
  406. },
  407. ["重置状态"] = new JObject
  408. {
  409. ["method"] = "POST",
  410. ["url"] = "/reset",
  411. ["description"] = "重置系统内部状态(不调用DLL关闭函数)"
  412. },
  413. ["简化调用"] = new JObject
  414. {
  415. ["method"] = "GET",
  416. ["url"] = "/simple?action=readcard&autoVerifyPIN=false",
  417. ["description"] = "简化调用接口"
  418. },
  419. ["健康检查"] = new JObject
  420. {
  421. ["method"] = "GET",
  422. ["url"] = "/health",
  423. ["description"] = "系统健康检查"
  424. }
  425. }
  426. };
  427. return Ok(helpInfo);
  428. }
  429. }
  430. }