崔阳
(中国劳动关系学院数学与计算机教学部,北京100048)
近年来,随着4G 网络的迅速发展和微信等新型移动社交软件的普及,超市自助零售业务这种新型购物模式逐渐兴起,一些企业纷纷面向市场推出了自己的智能零售方案和产品。扫码支付属于移动支付的一种,也是自助零售的核心功能之一。其基本流程是:用户在超市使用手机、平板电脑等移动设备扫描想要购买的商品条形码,即可查看到商品信息、了解产品推荐、自助提交订单并结账;同时超市也可以不定期将优惠信息、促销活动、会员资讯等服务直接推送至用户的移动设备。这样不仅可以提升用户的购物体验、降低超市的人力成本,更能使超市与用户之间建立起有效的长联系机制,为用户提供更多精准服务。正因为如此,当前已经有越来越多的大中型超市将自助零售作为连接超市线下和线上销售的重要桥梁[1]。为了让用户更加迅速、准确、安全地完成自助购物,必须要为扫码支付提供一种有效的保障机制,这就是设计扫码支付中间件的基本目的。
当前的扫码支付产品种类较多,很多外部因素对这些产品在应用中的体验度都有影响。例如移动设备的硬件配置、4G 或Wi-Fi 信号强度和带宽、某一时间段内超市自助购物的用户数量,等等。除此之外,扫码支付产品在性能方面还须关注以下几点:
第一,支付响应的快捷性。用户选用扫码支付实现自助购物的主要原因之一就是节省超市结账的排队时间,如果在扫码支付时响应时间过长,甚至高于排队时间,则会大大降低用户的购物愿望,进而导致用户放弃此次购物。因此扫码支付的响应时间必须严格控制在用户容忍的范围内。
第二,支付金额的准确性。超市商品价格的起伏变化较快,同一种商品的价格在不同日期甚至一天中的不同时段都可能随着促销、打折等活动而有所不同,这就需要扫码支付产品能够及时更新商品价格,保证计算得到的订单商品价格总额与实际金额一致。
第三,支付过程的安全性。扫码支付涉及金融活动,具有一定的风险[2]。用户的移动设备和扫码支付服务器通讯时传输的数据必须要保证安全,防止泄露。
以上几个问题的解决在很大程度上有赖于用户移动设备与扫码支付服务器之间能否实现快捷和安全的通讯。MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议是一种构建在TCP/IP 协议上、基于发布/订阅模式的“轻量级”通讯协议[3]。它的最大优势是可以在带宽有限的情况下,使用很少的代码为终端设备和服务器之间提供实时可靠的消息服务,在物联网、移动设备等方面有广泛的应用[4]。例如亚马逊的AWS IoT 云平台就充分利用了MQTT 协议。由于MQTT 协议非常适合于移动终端与服务器通讯,因此扫码支付中间件的设计就基于该协议。
扫码支付产品的结构框架如图1 所示。其中,扫码支付小程序为用户提供扫码支付产品的入口;扫码支付中间件可部署在超市用于日常管理的客户机上,实现服务器与本地收银系统数据库的信息交换;服务器负责完成用户经由小程序提交的购物请求、验证通过扫码支付中间件登录服务器的超市客户机身份、存储上传的商品信息和下发回写命令等。
从图1 可知,扫码支付中间件在功能上属于一种数据交互中间件,是服务器和各超市收银系统数据库的通讯桥梁。中间件以SQL 方式与收银系统数据库直接对接,与服务器则使用MQTT 协议进行通讯。中间件从收银系统数据库中读取商品信息,转换为JSON 格式后上传至服务器;同时将从服务器接收到的订单信息回写到收银系统数据库中。之所以采用JSON 作为数据交换格式,是因为JSON 效率较XML 更高且易于修改[5]。由于扫码支付中间件承担了低速且频繁的数据库读/写任务,这样就很大程度上减轻了服务器的负担、提高了扫码支付产品的实时效率。
具体而言,扫码支付中间件包含以下几方面的功能:
(1)商品信息定时上传功能。超市商品的价格波动大、促销和折扣信息繁多,收银系统数据库中保存的商品信息处于不断变化中。服务器在处理用户提交的订单时必须以最新价格为准,否则会造成订单金额计算错误。之前一些扫码支付产品服务器中保存的商品信息多以人工方式更新,这样不仅速度较慢,也容易造成遗漏。通过扫码支付中间件提供的商品信息定时上传功能,超市管理人员仅需要为中间件设定两次商品信息上传的间隔时间。之后中间件在每次上传时间点到达时,将自动读取并上传最新的商品信息至服务器,无须人工干预。
(2)订单回写功能。中间件将用户提交并完成的订单信息实时写入到收银系统数据库中。这样除了及时记录超市的销售情况外,还可以更有效地采集用户消费数据,进而通过大数据技术对消费行为做出分析,为用户提供更精准的个性化服务。由于在同一时刻可能会有大量订单等待写入数据库,因此该功能需要以异步方式实现。
(3)网络代理功能。服务器与客户机、收银系统数据库有可能处在不同的网络,或因防火墙设置问题而无法直接访问。因此中间件必须提供网络代理功能,以保证服务器与客户机在各种情况下都能正常连接与通讯。
扫码支付中间件的主要功能如图2 所示。
中间件与服务器通讯所需的MQTT 主题在表1 中列出。
表1 扫码支付中间件与服务器的MQTT 主题
其中,smg/server/client/{client_id}/reply 是客户机向服务器订阅的主题,用于服务器确认启动扫码支付中间件的客户机身份和订单回写。例如某客户机的client_id 为123,则订阅主题为smg/server/client/123/reply。smg/client/server/schedule_data 和smg/client/server/data 用于中间件向服务器上传数据。smg/client/server/will 是MQTT 协议的遗嘱消息主题,用于在中间件或客户机出现异常时向服务器发送说明信息[6]。
图2 扫码支付中间件的功能流程
扫码支付中间件以Visual Studio 2017 为开发平台,开发语言为C#,使用开源类库MQTTnet 2.4.5 实现对MQTT 协议的支持。服务器和客户机的运行环境都为Windows 10(64-bit),.NET 版本为4.6.2。测试选用的收银系统数据库为科迈智赢V9.0。
(1)中间件启动流程。中间件启动后,首先由超市管理人员在登录界面上输入连接服务器和收银系统数据库所必需的信息,如图3 所示。
当单击“登录”按钮时,中间件首先向服务器传输一个JSON 格式的登录请求数据,其内容为:
{
"command_type":"login", //命令类型
"data":{
"user_name":"", //登录名
"passwd":"" //密码
}
}当服务器审核登录信息无误后,立即向中间件回复包含超市信息的确认登录数据。其内容为:
{
"command_type":"login_reply", //命令类型
"data":{
"supermarket_id":"", //超市ID
"supermarket_name":"", //超市名称
}
}
图3 扫码支付中间件登录界面
(2)数据定时上传与回写流程。中间件定时上传的时间间隔(例如6 小时)由超市管理人员在中间件的配置文件中设定。中间件登录到服务器后首先上传一次商品信息,然后定时上传收银系统数据库中最新的全部商品信息,并覆盖服务器之前保存的信息。其内容为(具体条目可根据实际需要增删):
{
"command_type":"schedule_data", //命令类型
"data":[{
"upc_code":, //商品编码
"product_name":"",//商品名称
"price":"", //商品价格
"member_price":"", //会员价
"sale_price:"", //促销价
"unit:"", //单位
}]
}
当用户提交的一个订单完成后,服务器会将该订单信息发送至中间件。其内容为:
{
"command_type":"schedule_data", //命令类型
"order_id":"", //订单ID
"shop_name":"", //超市名称
"shop_code":"", //超市代码
"time_stamp:"", //时间戳
"pay_type":"", //支付方式
"total_price":"", //订单总价
"mobile":"", //用户手机号码
"card_num":"" //用户会员卡号
"data":[{….. //根据订单中各件商品的信息逐一
填写
}]
}
中间件收到订单信息后将进行格式转换,并立即调用回写接口将订单写入到收银系统数据库中。为保证中间件的效率和数据库的安全,回写过程采取异步方式,并在回写时锁定相应的数据库表。
此外,由于中间件启动后,除客户机关机、断电等特殊情况之外一般不终止运行。为最大程度保证中间件的正常运行,还提供了一些防护机制,例如断网时自动重新连接服务器和数据库、Socks5 网络代理、远程自动升级,等等。
该中间件已在某大型超市的扫码支付产品中得到了试用。在网络正常的情况下,中间件每次上传18000条商品信息至收银系统数据库仅需3 到4 分钟,还可以同时响应1000 个左右的订单回写请求。实践证明,中间件较为有效地提高了扫码支付产品的效率,而且在运行过程中对客户机、服务器和收银系统数据库的性能均没有明显影响。
扫码支付在超市自助购物领域有广阔的应用前景,但目前不少扫码支付产品还存在一些待改进之处。扫码支付中间件的引入可以在一定程度上为提升扫码支付产品性能提供一种新思路,更好地满足用户自助购物的需求。今后进一步的工作主要集中在扩展中间件功能和更好地解决中间件部署等方面。