欢迎,来自IP地址为:98.80.143.34 的朋友
SiInterface.dll 是重庆市医保规范的标准化接口,医保中心试图通过该接口让政策与业务分离,方便医保定点机构在不了解政策的情况正确的完成医保结算。通过 SiInterface.dll 动态库,可以快捷的实现定点机构的签到和医保业务操作。
本文将以 Python 语言作为示例语言,讲解如何调用 SiInterface.dll 动态库,以实现医保交易。
一、环境配置
上图是重庆医保网络的典型拓扑结构,各医疗机构配置一台具有双网卡的医保前置机,两块网卡分别连接医保专网和机构内部网络,前置机启用路由服务,完成机构内部网络中终端访问医保专网的路由转发,从而实现终端的医保结算。前置机安装有本地数据库,保存机构所有的结算数据及相关信息,从而实现医保机构间的数据隔离。
了解了医保网络结构,有助于理解终端调用 SiInterface.dll 库所进行的相关环境配置。
SiInterface.dll 根据各个接口厂商的不同,其版本也略有差异,示例采用的东软医保接口,目前版本为1.1.1.4,为支持医保电子凭证支付的版本,后期预计会有较大更新,以满足重庆医保贯标要求。
首先使用 dumpbin 工具,查看一下 SiInterface.dll 动态库的依赖库,提前准备好以免在调用时报错。
可以看到,东软 SiInterface.dll 动态库有如下依赖包:
- OCI.dll:为 Oracle 客户端动态库文件
- NETAPI32.dll:为系统32位网络接口动态库
- mfc90.dll:为 VC 动态库
- MSVCR90.dll:为VC动态库
- KERNEL32.dll:为系统核心32位动态库
- USER32.dll:为系统用户32位动态库
- GDI32.dll:为系统图形接口32位动态库
以上依赖包中,属于系统级的动态库可以直接调用,其余的 OCI.dll、mfc90.dll 和 MSVCR90.dll 需要安装对应的软件包,如果没有进行系统注册的话,需要将这些依赖文件放置于 SiInterface.dll 文件同一目录,以免出现调用失败。
而 SiInterface.dll 使用的均中32位的系统动态库,说明它是一个32位的动态库,如果在64位系统下使用,只需要安装32位的软件包即可。
对于 OCI.dll 动态库,需要安装 Oracle 数据库客户端,完全版或精简版均可,但必须是32位的,否则 SiInterface.dll 动态库不能正常工作。客户端安装完成后,需要添加一个指向前置机数据库的 tns 文件项,以保证 SiInterface.dll 在执行时可以连接到前置机数据库。既然使用了 Oracle 客户端,那么前置机数据库当然也必须是 Oracle 的。
对于 mfc90.dll 和 MSVCR90.dll,是微软标准的动态库,可以下载后放置于 SiInterface.dll 目录即可。当然,如果医保结算终端上安装有 VS 环境,则不需要另行下载 VC 的动态库了。
至于 NETAPI32.dll,SiInterface.dll 会用到是因为前置机有一个数据传输工具,用于进行医保交易数据的传输,于是需要用到该动态库。
安装好 Oracle 客户端,配置好访问前置机数据库的 tns 文件,并保证 SiInterface.dll 的所有依赖包都可用后,医保交易接口 SiInterface.dll 的环境就配置完成了。
二、调用程序示例(Python 3)
既然 SiInterface.dll 是32位 Windows 动态库,那么 Python 同样采用32位版本即可。
创建一个 SI-Business.py 的 Python 文件,将 SiInterface.dll 以及所需要的依赖库均复制到该文件的同一目录中,注意 SiInterface.dll 还需要读取配置文件 SiInterface.ini,默认读取调用 SiInterface.dll 文件所在的目录,所以还需要将配置文件复制到 Python 文件目录。
首先看一下 SiInterface.dll 动态库提供的函数,对于机构终端只需要使用其中的 INIT 和 BUSINESS_HANDLE 两个,其中 INIT 是初始化函数,完成机构签到功能,未初始化是不能进行医保交易的;BUSINESS_HANDLE 是医保交易函数,根据医保规范进行相关交易,接口规范是”int BUSINESS_HANDLE (const char* inputData,char* outputDat)”。
在 SI-Business.py 文件中填入如下代码:
# -*- coding: utf-8 -*- # Author DAEHUB import ctypes def si_business(): si_dll = ctypes.windll.LoadLibrary("./SiInterface.dll") si_dll.INIT() inputData = ctypes.c_char_p('01|A000000||'.encode('utf-8')) outputData = ctypes.create_string_buffer(1024) print(si_dll.BUSINESS_HANDLE(inputData,outputData)) try: print(str(outputData.value,encoding='gbk')) except Exception as e: print(e) finally: print("end") if __name__=='__main__': si_business()
执行代码,会看到如下结果:
程序使用了 Python 强大的 ctypes 类,用于进行 SiInterface.dll 的调用。如果调用环境配置无误,执行程序就会见到如图所示的执行结果。
程序首先调用 SiInterface.dll 的 INIT 函数完成签到,之后进行了一条 01 交易,用于查询人员基本信息。由于示例中的医保卡号并不存在,所以返回不能查询到对应人员的错误。但是这条交易的执行结果为0,表示交易成功执行。
这里需要说明的是,由于 BUSINESS_HANDLE 函数的入参和出参均为字符串指针,而 Python 中没有对应的数据类型,于是需要对应的处理,也就是将字符串转换为 bytes 串。而出参的编码格式需要使用 GBK,否则显示不正常。
至此,就完成了使用 Python3 语言调用医保 SiInterface.dll 动态库进行初始化及交易的全部内容,希望对于进行医保交易接口开发的朋友有所帮助。
好顶赞,这种分享很难得
很有阅读性