自助机做医保统筹、个账支付、银联支付
🛖 概述
医院部署自助机
病人在自助机上做相关的查询、缴费业务。
需要解决:
- HIS接口对接,如果HIS没有接口,那么需要对接医保数据接口(对于大医院是不存在的)。
- 医保结算包括统筹的对接
- 统筹以外自费金额的结算对接,自费有包括个账和现金(现金、刷卡、微信支付宝)。
🚲 分析
关于医保统筹,见
和
的读卡接口及医保相关结算文档。
自费方面,现金就不用考虑了,微信支付宝也有相关通道,照着走即可;这里主要说个账。
个账是用户医保卡中个人账户的钱(用户可以在药店、医院中使用的钱)。
以广东为例,实帐,走银联结算。
关键点是:
- 读取卡片基本信息
- 读取卡片个账账号
- 执行社保卡(医保卡)消费
- 银联业务流程
🚙 处理
只讲读卡器相关部分,读卡及消费,只需要SSCardDriver.dll。
- 读取卡片基本信息
调用 iReadCardBas,要求有PSAM卡,如果没有PSAM卡需要有加密机。
使用加密机就需要调 iReadCardBas_HSM_Step1 + iReadCardBas_HSM_Step2 。
读出数据模板如下
上面通过发卡地区行政区划代码 110000 跟PSAM卡号前6位(终端机编号442000) 对比,判断是本地还是异地。(默认是装本地的PSAM卡),上例中本地终端机编号是442000,用户社保卡是110000,所以是异地卡。 每个卡的卡识别码、卡号都是唯一的,在用iReadCard时(后面会用到),这个信息是后面其它读卡操作的入参之一,格式如下。110000D15600000500069C68DC97D090| A04738174|,这个在读帐号上会用得到。
- 读取卡片个账账号
个账账号是写在社保卡里面的,调用SscardDriver.dll中的通用读卡来读取,如下图
三代卡读取地址为:DF04EF05|8B|$
可以读到,读卡里要验证pin,即需要通过键盘输入密码,请确认键盘是否连接,或正常使用第三方键盘库。
注意:
- 广州的一代卡,读取地址是:DF04EF0D|F1|$
- 珠海部分旧的社保卡,读取地址是:DF04EF05|8B|8A|$
- 广州的一代卡,读取地址是:DF04EF0D|F1|$
- 执行社保卡(医保卡)消费
- 首先是做医保结算,计算过出统筹金额、自费金额。
- 通过SSCardDriver.dll的接口 iDoDebit 进行消费操作。
交易获得:算法标识、密钥地址、交易金额、交易类型、终端机编号、终端交易序号、交易时间、交易验证码(TAC)。
- 传到银联后台或医保后台。走相关扣款流程。
🚚 使用第三方金融标准的键盘对接方法
设计银联交易,需要有标准的安全键盘,使用第三方厂家的键盘,需要做对键盘驱动库(SSKeyBDriver.dll),并修改配置文件(egapp.ini),让SScardDriver.dll在需要驱动键盘时,自动通过键盘驱动库去驱动键盘。
- 编写键盘驱动库(SSKeyBDriver.dll)
long iReaderGetPass(unsigned char ctimeout,char *cdsp,unsigned char audiocmd,unsigned char *cpasslen,char *cpass) /* 参数说明 ctimeout: 等待键盘输入的超时时间,单位为秒; cdsp: 密码键盘液晶显示汉字字符串(预留参数,暂不启用); audiocmd: 密码键盘语音提示代码: 1:语音提示“请输入密码” 2:语音提示“请再输入一次” 3:语音提示“请输入原密码” 4:语音提示“请输入新密码” cpasslen: 输入密码的长度; cpass: 输入的密码值,字符串格式; 函数返回: 0 成功取得密码,cpasslen=密码位数,cpass=密码; -31 用户取消密码输入,cpasslen=0,cpass 为空; -32 输入操作超时,cpasslen=0,cpass 为空; -39 其它错误,cpasslen=0,cpass 为空; 举例:如用户输入 123456 这样的 6 位密码。则返参为:密码长度 cpasslen=6;输入的密码值 cpass=“123456”的字符串。 注:无论读卡器是否带有密码键盘、密码键盘是否与读卡器连接,密码的获取都由上述函数完成。 */ - 修改SSCardDriver.dll的配置文件(egapp.ini)
配置文件 egapp.ini和SSCardDriver.dll在一个目录内,修改
EnableExtKBLib=TRUE ; 是否启用外部密码键盘库(SSKeyBDriver.dll)默认FALSE ; TRUE表示启用,此时密码键盘输入受外部键盘库SSKeyBDriver.dll控制,EnableUSBKB和EnablePS2KB值无效 ; FALSE表示不启用