C#实战:5步搞定阿里健康药品追溯码接口对接(附完整签名源码)
C#实战5步高效对接阿里健康药品追溯码API在医院和药店管理系统中药品追溯功能已成为刚需。阿里健康提供的药品追溯码查询接口能帮助医疗机构快速获取药品全流程信息。作为.NET开发者你可能需要将这个功能集成到现有ERP系统中。本文将带你从零开始用C#完成整个对接流程。1. 环境准备与基础配置在开始编码前需要确保开发环境就绪。创建一个新的C#控制台应用或类库项目建议使用.NET Core 3.1或更高版本以获得更好的跨平台支持。必备NuGet包dotnet add package RestSharp dotnet add package Newtonsoft.Json配置基础参数时建议使用配置文件而非硬编码。在appsettings.json中添加{ AliHealthConfig: { AppKey: your_app_key, AppSecret: your_32char_secret, ApiUrl: http://gw.api.taobao.com/router/rest, RefEntId: your_ent_id } }提示AppSecret是核心安全参数生产环境应使用Azure Key Vault或类似服务保管2. 参数解析与签名机制阿里健康API采用淘宝开放平台的通用签名方案。签名过程需要特别注意参数排序和编码规则。关键参数说明参数名类型必填说明methodstring是API方法名如alibaba.alihealth.drugtrace.top.querycodetimestampstring是请求时间格式yyyy-MM-dd HH:mm:sssign_methodstring是签名算法支持md5/hmac/hmac-sha256vstring是API版本固定2.0签名算法实现要点将所有参数除sign外按键名字母序排序将排序后的参数键值拼接成字符串根据sign_method选择加密方式计算签名public static string GenerateSign(IDictionarystring, string parameters, string secret, string signMethod md5) { var sortedParams new SortedDictionarystring, string(parameters, StringComparer.Ordinal); var queryBuilder new StringBuilder(); if(signMethod md5) queryBuilder.Append(secret); foreach(var param in sortedParams) { if(!string.IsNullOrEmpty(param.Key) !string.IsNullOrEmpty(param.Value)) { queryBuilder.Append(param.Key).Append(param.Value); } } byte[] hashBytes; switch(signMethod.ToLower()) { case hmac: using(var hmac new HMACSHA256(Encoding.UTF8.GetBytes(secret))) { hashBytes hmac.ComputeHash(Encoding.UTF8.GetBytes(queryBuilder.ToString())); } break; default: // md5 queryBuilder.Append(secret); using(var md5 MD5.Create()) { hashBytes md5.ComputeHash(Encoding.UTF8.GetBytes(queryBuilder.ToString())); } break; } return BitConverter.ToString(hashBytes).Replace(-, ).ToLower(); }3. 请求构建与参数处理构建HTTP请求时需要注意参数编码和特殊字符处理。以下是完整的请求构建示例public async TaskJObject QueryDrugTraceCode(string traceCode) { var config Configuration.GetSection(AliHealthConfig); var parameters new Dictionarystring, string { {method, alibaba.alihealth.drugtrace.top.querycode}, {app_key, config[AppKey]}, {timestamp, DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)}, {format, json}, {v, 2.0}, {sign_method, md5}, {code, traceCode}, {ref_ent_id, config[RefEntId]} }; parameters[sign] GenerateSign(parameters, config[AppSecret]); var client new RestClient(config[ApiUrl]); var request new RestRequest(Method.POST); request.AddParameter(application/x-www-form-urlencoded, string.Join(, parameters.Select(p ${p.Key}{HttpUtility.UrlEncode(p.Value)})), ParameterType.RequestBody); var response await client.ExecuteAsync(request); return JObject.Parse(response.Content); }常见问题处理时间参数必须精确到秒所有参数值需要进行URL编码POST请求的Content-Type应为application/x-www-form-urlencoded4. 异常处理与重试机制API调用可能因网络或服务端问题失败需要完善的异常处理public async TaskJObject SafeQueryDrugTrace(string traceCode, int maxRetry 3) { int attempt 0; while(attempt maxRetry) { try { var result await QueryDrugTraceCode(traceCode); if(result[error_response] null) return result; var error result[error_response]; if(error[code].ToString() 15) // 请求频繁 { await Task.Delay(1000 * (attempt 1)); attempt; continue; } throw new ApiException(error[msg].ToString()); } catch(Exception ex) when (attempt maxRetry - 1) { attempt; await Task.Delay(1000 * attempt); } } throw new ApiException(Maximum retry attempts reached); }常见错误码处理错误码含义建议处理方式15接口调用频率超限延时重试40缺少必要参数检查参数完整性41无效参数验证参数格式25签名错误检查签名算法5. 响应解析与业务集成成功响应后需要将API返回的数据转换为业务可用的格式。典型响应结构如下{ alibaba_alihealth_drugtrace_top_querycode_response: { result: { ent_info: { ent_name: 某制药有限公司 }, code_detail_list: { code_detail: [ { code: 6970123456789, produce_date: 2023-05-01, expire_date: 2025-04-30, batch_no: B20230501 } ] } } } }解析示例public DrugTraceInfo ParseTraceResponse(JObject response) { var resultPath alibaba_alihealth_drugtrace_top_querycode_response.result; var result response.SelectToken(resultPath); return new DrugTraceInfo { EnterpriseName result[ent_info][ent_name].ToString(), CodeDetails result[code_detail_list][code_detail] .Select(d new CodeDetail { Code d[code].ToString(), ProduceDate DateTime.Parse(d[produce_date].ToString()), ExpireDate DateTime.Parse(d[expire_date].ToString()), BatchNumber d[batch_no].ToString() }).ToList() }; }集成到业务系统时建议添加本地缓存避免重复查询相同追溯码记录查询日志用于审计对高频查询场景考虑批量查询接口// 缓存集成示例 public async TaskDrugTraceInfo GetDrugTraceInfo(string traceCode) { var cacheKey $DrugTrace:{traceCode}; if(_cache.TryGetValue(cacheKey, out DrugTraceInfo cachedInfo)) return cachedInfo; var response await SafeQueryDrugTrace(traceCode); var info ParseTraceResponse(response); _cache.Set(cacheKey, info, TimeSpan.FromHours(1)); return info; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2481590.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!