欢迎,来自IP地址为:18.97.14.90 的朋友
2022年,国家将大力推进医保全国统一结算工作,并逐步实现医保结算的精准化、合理化。了解和掌握医保国家平台的结算规则,具备一定的接口开发能力,可以在全国医保结算方式变革的大潮中占得先机,为个人发展打下良好基础。
本文将简要介绍医保国家平台的实现机理,并以 Python 语言为例,详细讲解如何对接医保国家平台。
医保国家平台的实现机理
众所周知,医保之前都是各医保统筹区独立处理医保交易,从而造成医保政策各异、结算接口标准不一、诊疗项目及药品目录也存在差异。随着各医保统筹区逐渐采用国家标准代码,从而实现诊疗项目、药品、医疗机构、医护人员等基本信息的全国统一,为采用国家医保接口进行医保交易创造了条件。
使用国家医保平台进行医保交易,可以轻易实现跨统筹区的医保结算,从而真正实现全民医保,可以有效提升医保覆盖范围和保障水平。
重庆作为第一个接入医保国家平台的省级医保统筹区,为医保国家平台的运作积累了众多宝贵的经验。重庆医保接入国家平台的实现方式为:
医院信息系统<—json报文—>本机医保交易动态库<—json报文—>本地医保国家平台
医院的信息系统只需要与医保网络可达,医院信息系统通过调医保交易运态库,直接同医保国家平台进行交互,取消了之前部署在各医疗机构的前置设备,使网络更加扁平化,易于管理。
数据传输采用网络中数据传输最为流行的数据格式 json,使接口更具有通用性。本地医保国家平台通过专用网络,联接其他统筹区的国家平台,共同组成医保国家平台,从而实现医保全国联网结算。
重庆医保国家平台交易程序实现
重庆医保交易使用”SiInterface_hsf.dll”作为交易接口程序,负责完成医保交易数据的传输。该动态库提供两个调用函数,分别为int INIT(char * pErrMsg) 和 int BUSINESS_HANDLE( char* inputData, char* outputData)。其中 INIT 函数用于初始化接口,初始化成功后方能调用该接口进行医保交易;而 BUSINESS_HANDLE 函数是业务处理函数,用于接收医院系统传输的交易报文,并将国家平台产生的响应结果回传医院系统。
动态库依赖于 Visual C++ 2008 x86 版本,需要在系统安装该 VC 发行版。找不到的话,可以点击 >>这里<<进行下载。
由于重庆医保交易的接口动态库为32位程序,并且依赖于32位的 VC 动态库,开发方便起见,建议开发系统采用32位的 Python 程序包。调用该动态库,使用 ctypes 包即可。示例如下:
import ctypes SI_DLL = ctypes.windll.LoadLibrary('./SiInterface_hsf.dll')
注意在调用该动态库时,需要将动态库文件及其配置文件”SiInterface_hsf.ini”共同放置于 Python 文件的同一目录。
如果动态库装载成功,就会得到接口动态库对象 SI_DLL,之后就可以通过该对象来调用动态库的接口函数了。
进行医保交易之前,首先需要初始化,也就是调用动态库的 INIT 函数。示例代码如下:
outputData = ctypes.create_string_buffer(1024) try: if SI_DLL.INIT(outputData)== 0 : print('接口初始化成功') except Exception as e: print('错误提示',str(e))
根据交易说明,初始化成功时,函数返回值为0,如果初始化出错,则会将出错信息回写至接口入参的字符串中(也就是outputData串),当然也可以直接获得程序报错。
初始化成功后,就可以正式进行医保交易了,调用 BUSINESS_HANDLE 函数即可实现。该函数有两个参数,inputData 和 outputData,均是 C 语言的字符串指针。inputData 用于存放医院系统发送给医保平台的报文串,而outputData用于存放国家平台反馈给医院系统的交易结果数据。数据格式采用 json 格式,二进制保存。所以在发送及接收报文数据时需要编码和解码。
Python 对于 json 格式有着天然的支持优势,其字典类型可以完美对应 json 报文。将字典转换为 json 报文时,调用 dumps 函数,将 json 报文转换为对应的字典数据时,只需要调用 loads 函数即可。
医保交易采用标准的 json 格式报文,每个交易有其特定的交易代码,示例使用签到(9001)交易举例,实现一次简单的医保交易:
import json import ctypes #定义一个签到交易字典变量 SI_Business_9001={ "infno":"9001", "msgid":"H50000000001202201011000000001", "insuplc_admdvs":"", "mdtrtarea_admvs":"500001", "recer_sys_code":"YBXT", "dev_no":"", "dev_safe_info":"", "signtype":"SM3", "cainfo":"", "infver":"V1.0", "opter_type":"1", "opter":"1000", "opter_name":"测试", "inf_time":"2022-01-01 10:00:00", "fixmedins_code":"H50000000001", "fixmedins_name":"重庆医保测试医院", "sign_no":"", "serv_code":"HH00001", "serv_sign":"AABBCCDDAABBCCDD", "input":{ "signIn":{ "opter_no":"1000", "mac":"00:11:22:33:44:55", "ip":"192.168.0.1" } } } SI_DLL = ctypes.windll.LoadLibrary('./SiInterface_hsf.dll') #初始化接口动态库 outputData = ctypes.create_string_buffer(1024) try: if SI_DLL.INIT(outputData)== 0 : print('接口初始化成功') except Exception as e: print('错误提示',str(e)) #医保签到交易 inParameter = ctypes.c_char_p(json.dumps(SI_Business_9001).encode('utf-8')) print(inParameter.value) outParameter = ctypes.create_string_buffer(1024) try: businessResult = SI_DLL.BUSINESS_HANDLE(inParameter,outParameter) if businessResult == 0: outputData = str(outParameter.value,encoding='gbk') out_dict = json.loads(outputData) print(json.dumps(out_dict,indent=2,ensure_ascii=False)) SIGN_NO = out_dict['output']['signinoutb']['sign_no'] else: print('提示信息','医保签到不成功!') except Exception as e: print('错误提示',str(e))
代码首先将9001交易的字典类型数据转换为 C 字符串指针,然后创建一个 C 字符串指针用于接收出参数据。字典类型转换为 json 报文调用 dumps 函数,编码采用统一的UTF-8 编码。经过编码的数据就会被转换成二进制字符串,用于医保动态库交易处理函数的入参。
然后创建一个长为1024字节的 C 字符串outParameter,用于作为医保动态库交易处理函数的出参接收平台返回的数据。
最后调用之前生成的交易动态库对象的 BUSINESS_HANDLE 函数进行医保交易。
交易成功的话,函数返回值为0,并且会将相应信息写入之前定义的出参字符串,示例为 outParameter。接收到的数据同样为 json 报文,首先将它转换为字符串后,再使用 json.loads 函数将其转换为字典类型数据,用于提取数据。重庆医保平台有一个比较坑的地方是回传数据中文采用 GBK 编码,如果转换时编码格式不对,中文会显示有问题。最后,通过字典类型,可以方便的提取需要的数据,示例提取了从国家平台获取的医保签到号”sing_no”,之后当天所有的医保交易都可以使用这个签到号了,示例还打印了获取的 json 报文内容,ensure_ascii=False 用于将数据的中文正确打印出来。
以上就是医保国家平台接口开发的关键内容,其它内容则需要根据每个交易的具体规范修改入参字典数据,根据出参解析相应内容即可。目前重庆最新版的交易接口标准可以从 >>这里<< 获取。