医院移动支付系统的设计与实现
作者: 周笑宇
摘要:随着4G和5G网络的普及以及互联网业务的不断发展,主流的支付方式已经从现金支付变成线上支付。文章从实际应用角度出发,简要的介绍移动支付在医院门诊及住院收费中的优点,并针对移动支付在使用过程中的风险防控,提出几点浅薄的意见。
关键词:医院;移动支付;收费;风险防控
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2022)24-0036-04
1 大型医院接入移动支付的必要性
在当今社会,随着科技水平的不断发展和智能手机的全面普及,人们在支付过程中的主流支付方式已经从现金支付转变成了使用手机等进行扫码线上支付。而从医院的角度而言,移动支付可以大大缓解收费窗口的压力,在现金支付为主流的时代,收费员不仅需要进行录入费用等一系列的操作,而且还需要对收到的钱币进行清点和校验,确定钱币的真伪,之后可能还需要进行找给患者钱币等。这样就大大降低收费窗口的效率。当医院接入移动支付后,收费员只需要关注费用是否收取进相应的账户即可,节省了相当多的步骤,大大地缩减了和患者之间的交互时间;从患者的角度而言,在现金支付为主流的时代,患者在和收费员交互的过程中,可能会产生许多不必要的交涉,比如:患者支付后是否找取货币,找取的货币金额是否正确等。当医院接入移动支付后,患者只需要关注支付的金额是否正确即可,也大大地缩减了患者在收费窗口前的交互时间和等待时间。所以,医院接入移动支付是非常必要的。
2 门诊移动支付的具体实现
2.1 门诊移动支付的要求
门诊移动支付主要解决现金收费方式等待时间长,流程冗余等问题。在此场景下应该注意以下几个问题:①支付流程的简化,对于主扫和被扫两种支付方式,笔者建议采取被扫的方式,因为被扫可以大大的简化患者的操作步骤,只需要打开相应的界面即可进行支付。②支付流程的安全性,整个支付过程必须完全保证交易的安全,所以务必要考虑数据传输过程的安全和隔离性。③接口的规范性和可拓展性,为未来可能进行的接口拓展等打下坚实的基础[1]。
2.2 门诊移动支付的总体设计架构
为确保交易的安全性,需要在前置服务器和医院内网和HIS服务器和收费终端之间部署网闸,同时应在前置服务器和支付平台之间设置防火墙,避免支付平台被攻击,造成问题数据[2]。该架构如图1所示。
实现门诊全流程移动支付主要需要分为以下部分进行改造:对于院内收费业务,需要改造以下几个模块:①门诊挂号收费模块;②门诊退号退费模块;③门诊收费划价模块;④门诊退库退费模块;⑤全流程异常处理模块。对于院内硬件平台,需要在HIS服务器等与支付前置服务器之间增设网闸,以确保院内网络的安全性,且需要在支付前置机服务器和支付平台之间增设防火墙,以确保支付过程中上传数据时和反馈数据时数据的安全性。
2.3 门诊移动支付的实现
在医院实际运行中,患者首先要进行的步骤就是挂号,当患者在就诊医院拥有了本次就诊独一无二的身份标识后,才可以进行其他的操作,本部分以挂号和退号为例,进行门诊部分移动支付的介绍。
2.3.1 挂号收费模块流程
使用移动支付挂号收费时,需要对于门诊收费功能进行改进,首先需要增加选择支付方式的界面,根据选择的支付方式弹出相应的提示,此时收费员根据提示引导患者进行扫码支付,待患者扫码后,将当前支付信息提交到前置机上,前置机进行转发,至支付平台进行支付处理,支付平台处理完毕后,进行反馈结果,若反馈成功,系统将自动进行打印票据等一系列操作,若反馈失败,则收费员操作关闭订单,该流程如图2所示。
2.3.2 挂号收费模块相关代码
案例系统以PowerBuilder9.0进行开发,通过PowerBuilder自带的oleobject进行服务器交互,并使用Msxml2.XMLHTTP进行数据传输,提交方式为post,传输数据格式为json[4],部分代码如下:
int li_ret
string ls_url //从配置文件读取http地址
oleobject http
http = create oleobject
ls_url = profilestring('httpconfig.ini','config','url','')
ls_url = ls_url + '/' + as_method
li_ret = of_gettoken(ref gstr_token,ref as_msg)
if li_ret<>1 then
as_msg = "获取访问令牌失败!" + as_msg
RETURN -1
end if
IF http.connecttonewobject( "Msxml2.XMLHTTP") <> 0 THEN
as_msg = "连接ole对象失败"
RETURN -1
END IF
try
http.open("POST",ls_url , TRUE)
http.setrequestheader("Content-type","application/json")
http.setrequestheader("Authorization-Token",gstr_token.accessToken)
http.Send(postdata)
catch(runtimeerror rte)
as_msg = "请求异常:" + rte.getmessage()
return -1
end try
do While http.readyState <> 4 // ' 查询状态,延时
yield()
Loop
getdata = http.responseText //返回结果
if len(getdata) = 0 then
as_msg = "http返回数据为空"
return -1
end if
return 1
2.3.3 退号退费模块流程
退号时,在系统中输入需要退费的收据号后,系统调用退费流程。首先调用门诊系统的退费模块,此时门诊系统从HIS相关表中读取支付订单号等信息,将退费请求和包含支付订单号的数据串等转发给前置机服务器,由前置机服务器经过处理后转发给支付平台,支付平台处理后,将结果反馈给门诊系统。该流程如图3所示。
2.3.4 退号退费相关代码
案例系统以PowerBuilder9.0进行开发,通过PowerBuilder自带的oleobject进行服务器交互,并使用Msxml2.XMLHTTP进行数据传输,提交方式为post,传输数据格式为json,结构体形成相应的数据串与请求头一起进行数据传输,部分代码如下:
str_in.org_code = gs_org_code
str_in.mch_appid = gs_appKey
str_in.mch_order_id = gf_get_guid()
str_in.mch_notify_url = ''
str_in.refund_reason = ' '
str_in.extend_params = ''
str_in.sign = ''
str_in.sign_type = 'MD5'
li_ret = nvo_orderhttp.of_order_refund( str_in, ref str_out, ref ls_msg)
if li_ret<>1 then
messagebox('提示','调用接口失败!'+' ' + ls_msg)
return -1
end if
if isnull(str_out.refund_id) or str_out.refund_id='' then
messagebox('提示','统一退款接口返回的支付平台退款订单号为空!',exclamation!)
return
end if
3 住院移动支付的具体实现
3.1 住院移动支付的要求
住院移动支付主要解决在住院预交金缴纳、支付、退费等过程中,因金额普遍相对较大,患者携带大额金额不方便的问题。在此场景下应该注意以下几个问题:①支付流程的安全性,由于住院业务金额普遍较大,所以相比门诊业务而言,更需要注意数据传输过程中的安全性。②预交金额的准确性问题,因住院业务的特殊性,患者在住院前、住院中等多个时间节点都可能需要进行预交金的充值,这就务必确保支付流程在HIS服务器中写表的准确性。③接口的规范性和可拓展性,为未来可能进行的接口拓展等打下坚实的基础[3]。
3.2 住院移动支付的实现
实现住院全流程移动支付主要需要分为以下部分进行改造:对于院内收费业务,需要改造以下几个模块:①住院费用预交金缴纳模块;②住院费用结算补收费用模块;③住院费用结算退费模块。对于财务对账业务,需要相应的配套对账系统。本部分以住院费用预交金缴纳模块和住院费用退费模块为例,介绍一下住院业务实现流程:
3.2.1 住院费用预交金缴纳流程及代码
使用移动支付进行住院费用预交金缴纳时,首先应在相应的支付方式中添加移动支付相关的类别,如:微信支付,支付宝支付,银行卡支付等。其次应对预交金缴纳模块的保存功能进行改造,在确保预交金缴纳的整个流程中,应在保证HIS写表成功的前提下,再通过调用移动支付接口进行缴费,同时在患者缴费成功后,进行移动支付相关的写表操作,当整个支付流程全部成功后,再进行数据库事务的提交操作,以免造成数据错误等。该流程如图4所示。
3.2.2 住院费用预交金缴纳相关代码
案例系统以PowerBuilder9.0进行开发,通过PowerBuilder自带的oleobject进行服务器交互,并使用Msxml2.XMLHTTP进行数据传输,提交方式为post,传输数据格式为json,结构体形成相应的数据串与请求头一起进行数据传输,部分代码如下:
str_in.org_code = gs_org_code
str_in.mch_appid = gs_appKey
str_in.mch_order_id = gf_get_guid()
str_in.mch_notify_url = ''
str_in.order_amt = string(amount)
str_in.order_subject = '住院业务'
str_in.pay_option = ls_paytype
str_in.auth_code = ls_authCode