基于MQTT的扫码支付系统数据交互层的设计与应用

2022-03-09 23:48崔阳
软件工程 2022年2期

崔阳

文章编号:2096-1472(2022)-02-14-04

DOI:10.19644/j.cnki.issn2096-1472.2022.002.004

摘  要:首先分析了当前扫码支付系统的性能需求及存在的不足,在此基础上为扫码支付系统设计了一种基于MQTT协议、SOCKS5协议和JSON数据格式的数据交互层。该交互层优化了扫码支付系统服务器与商户终端数据库之间的数据交互模式,并集成了访问代理、身份验证等多项功能,可以使系统的自动化程度进一步提高,更灵活地部署于不同的环境。实践結果表明,在广东省某连锁超市使用设置了数据交互层的扫码支付系统后,响应时间明显缩短,准确率和安全性也有较大提高。因此,该系统具有较好的推广价值。

关键词:扫码支付系统;数据交互层;MQTT;SOCKS5

中图分类号:TP319     文献标识码:A

Design and Application of Data-interaction Layer in QR Code-scanning Payment System based on MQTT

CUI Yang

(College of Applied Technology, China University of Labor Relations, Beijing 100048, China)

cuiyang14@163.com

Abstract: This paper proposes to design a data-interaction layer based on MQTT (Message Queuing Telemetry Transport), SOCKS5 and JSON (JavaScript Object Notation) for QR (Quick Response) Code-scanning payment system, in view of the performance requirements and the defects of the current QR Code-scanning payment system. The proposed data-interaction layer optimizes data-interaction mode between QR code-scanning payment system server and sellers' terminal database. It also integrates multiple functions such as access agency, identity verification, etc., which further improves the automation of the system and make the system more flexible to be deployed on different occasions. Practical results show that after using a QR code-scanning payment system with data- interaction layer in a supermarket chain in Guangdong Province, the response time is significantly shortened, and the accuracy and security are also greatly improved. Therefore, the proposed system is quite worthy of promotion.

Keywords: QR code-scanning payment system; data-interaction layer; MQTT; SOCKS5

1   引言(Introduction)

扫码支付是近年正在快速推广的一种新型购物支付模式。与传统的支付模式相比,扫码支付在降低商户成本、节省消费者时间、建立商户与消费者之间有效联系机制等方面具有极大的优势[1]

当前很多企业都推出了自己的扫码支付系统,但这些系统在应用中也逐渐暴露出了一些不足之处,其中之一就是系统的数据交互模式仍有待提高。扫码支付系统以物联网、移动互联网等为基础,在这些领域中已经有多种比较切实可用的数据交互技术,例如基于人工蜂群算法的物联网数据可靠性传输方法[2]、基于微服务架构的物联网中间件方法[3]、“SIP over MQTT”优化传输机制[4]、基于网络编码的能量受限数据传输机制[5]等。本文以这些技术思想为基础,为扫码支付系统设计了一个专用的数据交互层,以提高扫码支付系统服务器与商户终端机之间数据交互的效率,更好地保障扫码支付的过程。

2   扫码支付系统的性能分析(Performance analysis of QR code-scanning payment system)

扫码支付系统的硬件部分主要由服务器、商户终端机、用户移动设备等组成。其中,服务器负责处理订单;商户终端机负责存储商品信息、用户信息和订单信息;用户移动设备负责为用户提供使用扫码支付系统的界面。系统中大部分的数据交互操作发生在服务器与商户终端机之间。

2.1   系统运行的基本流程

各种扫码支付系统虽然在实现上有所差别,但运行过程基本相同:用户首先通过移动设备上安装的APP(或小程序)接入系统,再依次扫描商品包装上的二维码生成订单。订单信息和付款请求由APP提交到系统服务器,服务器收到后根据自身存储的商品价格、折扣和用户级别等信息计算出订单应付金额,生成支付码并发回给APP。APP接收并显示支付码,供用户结账使用。之后APP再将支付结果(成功、异常、失败等)发回服务器。如果订单已被正确支付,则服务器还需将订单信息写入商户终端机的数据库[6]

综合而言,系统以下几方面的性能对用户支付體验度有明显影响:

第一,响应速度。自助支付的最大优势在于节省时间。如果系统每次响应和处理订单的时间过长,会导致用户的购物意愿降低。因此系统应具备一定的实时性特征,将响应速度严格控制在用户的容忍范围内。

第二,准确性。商品价格波动比较频繁,因此系统在处理订单时必须按最新的商品价格和折扣计算付款金额,保证用户和商户在交易中不会蒙受损失。

第三,安全性。扫码支付是一种金融活动[7],因此过程中涉及的订单、交易金额和用户身份等重要数据必须保证安全,防止泄露。

2.2   当前系统存在的不足

目前,很多扫码支付系统的服务器仍采用直接访问商户终端机数据库并控制数据读写的工作模式。这种模式虽然简单易行,但也可能会导致一些问题:首先是在数据读写量较大时会加重服务器的负载,降低响应速度,且不利于数据的安全保护。其次是服务器中信息的更新难以做到及时和自动化,有时还要依赖人工完成,容易使服务器在计算支付金额时因信息过期而出错。另外,当服务器与数据库处于不同网络时,可能会因防火墙设置等问题出现无法访问的情况。可见,服务器与商户终端机这种数据交互模式对系统的各项性能都有消极影响。

解决这一问题行之有效的方法是为系统增加一个数据交互层,将服务器与数据库操作彻底分离。这样就可以优化系统结构,使系统的响应速度、准确性和安全性三个方面均能得到提高。

3 数据交互层的设计与实现(Design and implementation of data-interaction layer)

扫码支付系统数据交互层遵循了物联网中间件的设计思想,与系统其他部分耦合度低,开发过程可控且易于部署[8]。数据交互层使系统的服务器与商户终端机之间彼此透明,所有数据交互操作均经过数据交互层完成。

3.1   功能设计

为更灵活地满足不同类型客户端的功能需求,数据交互层通常部署在商户终端机上。经改进后,扫码支付系统的服务器与数据库工作模式如图1所示。可以看出,在增设数据交互层后,以往服务器与数据库的直接访问模式就改为服务器—数据交互层—数据库的三级访问模式。数据库的连接、读写等工作都交由数据交互层完成,服务器只需接收或转发数据即可,不再直接干预低速且频繁的数据库操作。这样不但可以减轻服务器的负载,而且数据上传和写入的自动化程度也得到了很大提高。

为了满足扫码支付系统的性能需求,数据交互层应具备以下基本功能:

(1)商户终端机身份验证。当数据交互层在商户终端机启动时,将向服务器发送MD5模式加密的身份信息。服务器验证并确认无误后,数据交互层才能与服务器和数据库建立安全连接,并执行后续操作,从而减少数据被劫持的风险。

(2)数据定时上传。商户终端机数据库中保存的商品价格、折扣、库存等信息变化非常频繁,服务器在处理订单时必须以最新信息为依据,否则会造成支付金额计算错误。数据交互层的数据定时上传模块可以根据预先设定的每次上传间隔时间,按时自动读取商户终端机数据库中最新的商品信息,并上传至服务器,确保服务器的商品信息能够及时更新。

(3)订单写入。用户支付成功的订单需要及时记录到数据库。数据交互层接收服务器发送来的订单信息并写入商户终端机数据库。由于在同一时刻可能会有大量订单到达,因此数据交互层应以异步模式确保所有订单都正确写入数据库。

(4)访问代理。服务器与商户终端机可能在不同的网络中,无法相互访问。这时数据交互层的访问代理功能仍可保证服务器与商户终端机正常建立连接。

3.2   实现过程

数据交互层的实现过程主要包括以下几个关键模块:

(1)数据交互层与服务器的通讯。由于数据交互层与数据库同在一台商户终端机上,因此以SQL模式访问即可。与服务器的通讯则比较复杂,这里选用的是MQTT协议。MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输)协议是一种构建在TCP/IP协议上、基于发布/订阅模式的“轻量级”通讯协议。该协议提供了一种一对多的消息发布模式,定义了发布者、代理者和订阅者三种身份[9],如图2所示。

其中,客户端是消息的发布者和订阅者,服务器是消息的代理者。通过这种机制,MQTT协议消除了通讯程序之间的耦合性,将信息冗余降至最小,可以在低开销、低带宽的情况下提供实时可靠的消息服务[10]。目前MQTT协议已被广泛用于消息推送[11]、远程监控[12]及实时通信[13]等领域,其特性非常符合扫码支付系统应用环境的要求。

在MQTT协议框架下,数据交互层就相当于客户端,向服务器定时上传商品信息时充当发布者角色,从服务器接收订单时充当订阅者角色。服务器将用户成功支付的订单信息发送至数据交互层,充当代理者角色。订阅/发布模式可以保证当用户的移动设备将订单信息发送至服务器时,数据交互层能够自动同步获取该订单信息并写入数据库。在这一过程中,服务器只需转发相应的订单信息或接收上传的商品信息,不再负责数据库操作,因此大幅降低了负载。定义的数据交互层与服务器通讯主题如表1所示。

MQTTnet封装了一个实现客户端与服务端通讯的类MqttClient,类中定义了一个结构体MqttClientTcpOptions,用于设置数据交互层与服务器建立MQTT连接的参数:

public struct MqttClientTcpOptions

{

Server;            // 服务器地址

Port;              // 服务器端口

ClientId;           // 客户端ID

UserName;         // 用户名

Password;          // 密码

KeepAlivePeriod;    // 保持连接时长

CleanSession;     // 断开时是否保留会话

DefaultCommunicationTimeout;

// 默认连接超时时长

}

设置好MqttClientTcpOptions结构体中各项参数后,就可以调用MqttClient类的ConnectAsync方法发起与服务器的连接,成功后将建立数据交互层与服务器的会话连接。数据定时上传和从服务器接收订阅的订单信息分别使用MqttClient类PublishAsync和SubscribeAsync方法。

由于MQTTnet为开源类库,因此可以方便地在其中添加对SOCKS5协议的支持。SOCKS5是一种会话层访问代理协议,能够使数据交互层与服务器的通讯在处于不同网络或有防火墙设置等情况下仍能正常进行[14]。可以在MqttClientTcpOptions结构体中增加ProxyServer和ProxyServerPort参数,指定代理服务器的名称和端口。

(2)数据格式的定义。数据交互层与服务器之间通讯的数据格式采用JSON格式。相对于XML,JSON的层次结构更为简洁清晰,解析和传输效率较高[15]。例如,数据定时上传的JSON格式为:

{

"command_type": " schedule_data",

"data":[{

"upc_code":,

"product_name": "",

"price": "",

"member_price": "",

"unit: "",

}]

}

當数据库中的商品信息发生变化时,只需在数据格式中作相应修改即可。

(3)连接异常处理。数据交互层在运行过程中定时检测与服务器的连接状态。当发现中断时,将立即尝试重新连接服务器。如果是在数据上传期间发生中断,则连接成功后再次进行上传操作,以避免服务器出现数据不一致现象。当重新尝试次数达到最大值仍未能恢复连接时,模块将向系统管理员发出警告。

4  数据交互层的应用(Application of data-interaction layer)

扫码支付系统数据交互层的开发环境为Visual Studio 2018,开发语言为C#。服务器和商户终端机的运行环境为64 位Windows 10,数据库为SQL Server。

数据交互层划分为服务器连接、身份验证、数据定时上传、数据写入和MQTT连接监测等几个主要模块。数据交互层启动后,首先在网络连接正常的情况下检验商户终端机与服务器是否需要启用代理访问。之后尝试与服务器建立MQTT连接,若成功则向服务器发送商户终端机名称、密码等身份验证信息。若通过则继续向服务器发送订阅信息,并完成初始化工作,包括计时器置0,创建数据上传线程和数据写入线程,以及一些参数值的设定等;否则终止之前建立的MQTT连接。在没有遇到系统退出或故障时,数据交互层将一直处于运行状态。

数据交互层开始运行时,数据上传线程处于阻塞态。当上传时间点到达时,线程恢复运行,以SQL模式连接数据库并读取数据,转换为JSON格式后再根据预先设定的MQTT通讯主题为数据添加头部信息,之后上传至服务器。如果线程收到服务器的确认信息,则重新进入阻塞态并开始新一轮计时,反之则尝试再次上传数据。当重传次数达到最大值时将放弃本次时间点的上传任务,并向管理员发出警告,由管理员决定本次改由人工模式更新还是等待下一次上传时间点再自动更新。

订单数据写入过程则略复杂。由于同一时刻可能有多个商户终端机订阅的数据由服务器转发至数据交互层,为防止出现不同步问题导致的读写错误,必须设置一个数据缓冲队列,作为临界资源加以保护。数据缓冲队列为空时,数据写入线程处于阻塞态。当数据到达时先送入数据缓冲队列,同时数据写入线程恢复运行,从队列中读取数据并解析数据头部信息中的MQTT主题,判断是否为商户终端机订阅的订单数据,若是则将订单数据转换格式后写入数据库。图3给出了完整的扫码支付系统交互图。

目前,该系统已在广东省某大型连锁超市中得到了应用。数据交互层的引入改变了以往人工模式更新服务器信息的情况,且在网络连接正常的情况下,每次定时上传18,000 条商品信息至服务器数据缓冲区的时间缩短至40—50 秒。同时,数据交互层可以正确地将多个用户发送至服务器的订单依次写入数据库。实践证明,数据交互层有效地提高了扫码支付系统的效率和准确性,而且对服务器、商户终端机和数据库的运行均没有明显影响。

5   结论(Conclusion)

扫码支付系统是“智慧销售”系统的重要组成部分,数据交互层的设置给出了一种提高扫码支付系统性能的新思路。实际情况表明,数据交互层使扫码支付系统在响应速度、准确性和安全性等方面均有所提高。今后的工作主要集中在对数据交互层的改进和新功能扩展等方面。

参考文献(References)

[1] 陈平,高怀恩,陈炯标,等.基于物联网的智慧超市[J].电视技术,2013,37(S1):57-60.

[2] YI L, PENG Y. internet of things transmission and network reliability in complex environment[J]. Computer Communications, 2020, 150(1):757-763.

[3] 吴斌峰.基于微服务架构的物联网中间件设计[J].计算机科学, 2019,46(S1):580-584,604.

[4] 杨海波,马荣荣,张伟,等.面向移动互联网的“SIP over  MQTT”优化传输机制研究[J].小型微型计算机系统,2017,38(04):776-780.

[5] 黄辰,李可维,张伟,等.无线物联网中基于网络编码的能量受限数据传输机制[J].电子学报,2013,41(1):144-147.

[6] 汪天星,程耕国.基于B/S的扫码支付平台的设计[J].现代电子技术,2018,41(22):49-52,58.

[7] 單美静.基于AHP法的移动支付安全风险评估[J]计算机科学,2015,42(S2):368-371.

[8] 王冰,陈庭贵.基于高性能消息管理机制的物联网中间件设计方法[J].计算机工程与应用,2017,53(16):89-97,186.

[9] 阳旺,樊振宇,吴帆.基于6LoWPAN与MQTT的无线传感网络设计[J].国防科技大学学报,2019,41(01):161-168.

[10] 张玉杰,张海涛,张婷婷.基于MQTT的物联网系统消息发布/订阅方法研究[J].电视技术,2017,41(Z3):83-87.

[11] 姜妮,张宇,赵志军.基于消息队列遥测传输的推送系统[J].计算机工程,2015,41(9):1-6.

[12] 马汇海,张君燕,孟彦京.基于云平台的高频摇振器监控系统的设计与实现[J].中国造纸,2018,37(10):48-53.

[13] 谌建飞,邓敏,唐俊龙,等.实时大规模远程实验通信方案研究[J].计算机工程与应用,2018,54(19):94-100.

[14] 俞定国,舒明磊,谭成翔.基于Socks5代理的移动SSL VPN系统研究与实现[J].计算机科学,2011,38(1):119-121,144.

[15] 陈玮,贾宗璞.利用JSON降低XML数据冗余的研究[J].计算机应用与软件,2012,29(9):188-189,206.

作者简介:

崔   阳(1979-),男,博士,讲师.研究领域:知识工程与知识发现.

基金项目:中国劳动关系学院科研项目(20XYJS004).