朱宝龙 上海亚太计算机信息系统有限公司
虚拟账户系统作为企业营销的基础系统,通过提供统一的虚拟账户充值、消费、撤销、转账、查询、账单等接口,实现与会员系统、营销系统、订单系统、商城系统、财务系统等企业内部系统,第三方支付平台等外部系统的集成。系统支持电子钱包、礼金、优惠券、积分、红包等多种营销手段和方式。
为保证账户安全,防止数据泄漏及被篡改,虚拟账户系统与统一的安全服务平台集成,通过对称算法对用户敏感信息如手机号、交易密码、账户余额等关键要素进行加解密,通过数字签名验签技术对交易通讯报文、文件进行防篡改、防抵赖处理。安全服务平台同时支持国密算法和国际算法双密钥体系,保障系统数据安全的同时保证系统可扩展性。
虚拟账户系统通过账户平衡检查、进销存统计报表、营销统计报表等手段保障系统平稳运行,并给企业营销决策提供依据。
虚拟账户系统为保证系统安全、平稳、高效地运行,需要对接入渠道进行报文检查、身份认证、数字验签、权限验证、限流控制、超时控制等,针对不同的业务场景,需要对会员规则、营销规则、黑白名单、账户规则、限额规则、风控规则等做匹配与验证,通过内部应用接口、消息中间件与数据同步技术实现企业内部系统间的通讯;通过分布式缓存技术、数据库主从同步、分库分表、乐观锁等技术保证系统的运行效率和高可用。
图1 系统架构图
虚拟系统提供统一的充值接口给营销系统,首次通过会员号、电子卡号或者营销机构号实现自动开户;系统提供专门的第三方充值接口,实现微信、支付宝、银联等对虚拟账户的直接充值。
虚拟账户系统支持带有效期的营销规则,自动设立带有有效期的明细账户。
虚拟账户系统通过与企业的会员系统、商城系统等接口集成,实现在商城网站、App、微信公众号、小程序上的直接支付或者兑换支付。
虚拟账户消费优先使用有效期临近的余额进行支付。
虚拟账户系统支持交易撤销和退款操作,被撤销的资金原路返回。结合具体业务,系统可设置对不退款的规则做双层校验。
虚拟账户系统对允许转账、转赠的业务场景支持系统内部转账。
虚拟账户查询返回账户总可用余额、账户临期余额(临期规则可设定)、账户临期明细、账户过期余额等。
根据客户选择的时间段,虚拟账户系统提供这段时间内的客户交易详单。
容器技术提供基于镜像的部署模式,它能够轻松跨多种环境,与其依赖程序共享应用或服务组,还有快速移植和部署、无感发布、自动负载均衡、回滚到任意历史版本、自动扩容缩容、不停整个应用对部分进行更新和替换等优点。
消息中间件的核心功能在于将系统间通信由同步变成异步,减少了系统调用、文件操作、数据库交互等资源消耗,降低整个交易流程的耗时和复杂度,提高系统的并发性和稳定性。
分布式缓存是将热点数据加载到内存中,对这部分数据的读写全部在内存中完成,这样不仅速度快,而且大幅度降低了服务器磁盘IO、CPU 等资源的负载,保证系统在业务高峰期的高并发性和高可用性。
在数据库设计上,从满足目前业务需求和未来一定时期内业务扩展需求角度进行设计,根据业务形态划分为主库、备份库、查询库、历史库。
1.数据同步
利用数据库本身的日志技术,主库实现与备份库、查询库的数据同步及容灾。
对于无需鉴权的数据,使用数据同步中间件如canal、otter 等实现与企业内部其他系统的同步及共享;对于需要鉴权的数据则通过鉴权接口访问数据。
2.读写分离
读写分离用于解决数据库读的性能瓶颈问题,主库做写入,备库做查询,互为主备随时切换,查询库做账单、明细、统计,历史库做归档和容灾。
3.分表分区
分表是解决单张表过于庞大而导致的性能低下问题。本系统对超大业务表按年份进行水平拆分,每张表只存放当年历史数据,对相关查询作智能关联或跨度约束。与分表不同的是,表分区后逻辑上仍然是一张完整的表,但表中的数据在物理上存放在多个表空间上,结合索引技术,每次业务操作只对分区操作而不是对全表操作,大大减少磁盘I/O,从而大幅度提升查询性能。
账户安全设计是从应用安全设计的角度出发,通过数据传输安全、账户存储安全、账户更新安全、账户平衡检查、账户报表统计等方面确保账户信息安全。
数据传输安全包括报文传输安全和文件传输安全。不论信息是报文传输还是文件传输,都要保证在通讯过程中不能被损坏和篡改,即使传输完成后发生了泄漏也不能对系统造成重大损失。
1.二级密钥体系
二级密钥体系是指系统双方约定根密钥,根密钥的作用是对工作密钥进行加解密。工作密钥用来加解密数据,系统双方定期同时更换,数据传输过程中,敏感的信息如密码使用PINKEY 加密,报文整体使用约定算法的MACKEY 加密。
图2 二级密钥体系
2.数字签名验签
数字签名技术可以保证签名方不能否认所发送信息的签名,验签方能够验证信息签名的真实性,只要保证签名方私钥信息的安全性,就能够保证通讯数据不能被任何其他人进行伪造。
图3 签名验签过程
为防止人为篡改数据库中的账户余额,相关表中必须存放余额信息的校验值,余额信息可以是余额明文,也可以是余额明文加上其他不变的标识信息,校验值应该是通过系统安全密钥进行算法运算后的结果,账户每次做出入账时需要先检查校验值是否正确,正确后方可计算本次交易后余额信息的校验值,并更新到数据库中。
在并发系统中,为保证账户更新安全,需要给待更新的资源加锁,大量使用悲观锁会造成锁等待甚至是死锁,采用业务乐观锁会大大提高系统性能;使用数据库事务,保证账户更新和交易流水的同步性。
图4 账户更新流程
账户平衡检查是指在规定的时间段内一个账户余额的变动要与对应的交易流水记录相匹配,账户平衡的计算公式为:账户A 期末余额=账户A 期初余额+本期账户A 入账金额-本期账户A 出账金额。
本文以一个自然日的时间范围即以零点作为分隔点来进行说明。
1.每日系统日切
系统日切是指在零点时刻执行记账日期的切换,切换在秒级完成,不影响任何正在发生的业务。
(1)系统日切不做交易数据的处理,只做记账日期、流水表号的切换,例如1 号的交易存放在流水表1 中,日切完成后,记账日期变成2 号,并且交易存放在流水表2 中;
(2)使用流水表1 中的交易流水做当日的数据统计、归档,然后清空,用于下一记账日期即3 号的流水记录。
2.每日余额备份
从计算公式可以看出,我们必须要拿到零点那个时刻的所有账户余额信息,如果系统账户数量很大,这是一个不能瞬间完成的工作,为保证计算的准确性就需要使用每日余额备份技术。
(1)如果业务允许暂停,在零点设立一个不允许所有进出账的时间窗口,在该时间窗口内完成账户余额备份;
(2)如果业务不允许暂停,在零点系统进行日切的同时,开启账户余额备份窗口,在该窗口中,新发生的业务不实时修改账户余额,待余额备份完成后关闭窗口,将备份完成的结果作为昨日余额,批量更新本次窗口中发生业务的账户数据,并恢复账户余额随业务的发生而实时变动。
3.账户平衡检查
账户平衡检查的目的是保证系统内部是账平的,可以及时发现是否有人对客户账户余额进行过篡改、是否有人对客户交易记录进行过篡改,从而保证账户系统的安全,并且在系统发生重大故障时,账户平衡检查的过程数据和结果数据可以作为系统追溯的依据。
进销存统计报表:
进销存报表用于统计整个系统当日销售、库存情况以及历史累计的销售、库存情况,该报表反映系统总体的运营状况,可以提供决策依据,预防系统风险。
对于账户系统而言,进销存报表体现的是系统本期期初金额、本期入账总金额、本期出账总金额、本期期末总金额、账户总沉淀资金,其中账户总沉淀资金是指所有的账户余额总和。
1.本期期末总金额=本期期初总金额+本期总入账金额-本期出账总金额;
2.本期期末总金额=账户总沉淀资金;
3.为提高系统统计效率,采用增量统计方式,即使用上期期末总金额作为本期期初总金额,不再重新统计历史数据,缺点是如果对统计完的数据作修正,需要修正后面所有已统计的数据。
本文针对面向企业营销的虚拟账户系统的架构和功能进行探讨,提出了基于容器化部署、消息中间件、分布式缓存、数据库设计等关键技术的建设方案,并通过数据传输安全、账户存储安全、账户更新安全、账户平衡检查、账户报表统计等技术和手段来保证系统的安全稳定,与此同时也为企业营销决策提供依据。