崔陽
(中國勞動關系學院數(shù)學與計算機教學部,北京100048)
近年來,隨著4G 網(wǎng)絡的迅速發(fā)展和微信等新型移動社交軟件的普及,超市自助零售業(yè)務這種新型購物模式逐漸興起,一些企業(yè)紛紛面向市場推出了自己的智能零售方案和產(chǎn)品。掃碼支付屬于移動支付的一種,也是自助零售的核心功能之一。其基本流程是:用戶在超市使用手機、平板電腦等移動設備掃描想要購買的商品條形碼,即可查看到商品信息、了解產(chǎn)品推薦、自助提交訂單并結賬;同時超市也可以不定期將優(yōu)惠信息、促銷活動、會員資訊等服務直接推送至用戶的移動設備。這樣不僅可以提升用戶的購物體驗、降低超市的人力成本,更能使超市與用戶之間建立起有效的長聯(lián)系機制,為用戶提供更多精準服務。正因為如此,當前已經(jīng)有越來越多的大中型超市將自助零售作為連接超市線下和線上銷售的重要橋梁[1]。為了讓用戶更加迅速、準確、安全地完成自助購物,必須要為掃碼支付提供一種有效的保障機制,這就是設計掃碼支付中間件的基本目的。
當前的掃碼支付產(chǎn)品種類較多,很多外部因素對這些產(chǎn)品在應用中的體驗度都有影響。例如移動設備的硬件配置、4G 或Wi-Fi 信號強度和帶寬、某一時間段內超市自助購物的用戶數(shù)量,等等。除此之外,掃碼支付產(chǎn)品在性能方面還須關注以下幾點:
第一,支付響應的快捷性。用戶選用掃碼支付實現(xiàn)自助購物的主要原因之一就是節(jié)省超市結賬的排隊時間,如果在掃碼支付時響應時間過長,甚至高于排隊時間,則會大大降低用戶的購物愿望,進而導致用戶放棄此次購物。因此掃碼支付的響應時間必須嚴格控制在用戶容忍的范圍內。
第二,支付金額的準確性。超市商品價格的起伏變化較快,同一種商品的價格在不同日期甚至一天中的不同時段都可能隨著促銷、打折等活動而有所不同,這就需要掃碼支付產(chǎn)品能夠及時更新商品價格,保證計算得到的訂單商品價格總額與實際金額一致。
第三,支付過程的安全性。掃碼支付涉及金融活動,具有一定的風險[2]。用戶的移動設備和掃碼支付服務器通訊時傳輸?shù)臄?shù)據(jù)必須要保證安全,防止泄露。
以上幾個問題的解決在很大程度上有賴于用戶移動設備與掃碼支付服務器之間能否實現(xiàn)快捷和安全的通訊。MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)協(xié)議是一種構建在TCP/IP 協(xié)議上、基于發(fā)布/訂閱模式的“輕量級”通訊協(xié)議[3]。它的最大優(yōu)勢是可以在帶寬有限的情況下,使用很少的代碼為終端設備和服務器之間提供實時可靠的消息服務,在物聯(lián)網(wǎng)、移動設備等方面有廣泛的應用[4]。例如亞馬遜的AWS IoT 云平臺就充分利用了MQTT 協(xié)議。由于MQTT 協(xié)議非常適合于移動終端與服務器通訊,因此掃碼支付中間件的設計就基于該協(xié)議。
掃碼支付產(chǎn)品的結構框架如圖1 所示。其中,掃碼支付小程序為用戶提供掃碼支付產(chǎn)品的入口;掃碼支付中間件可部署在超市用于日常管理的客戶機上,實現(xiàn)服務器與本地收銀系統(tǒng)數(shù)據(jù)庫的信息交換;服務器負責完成用戶經(jīng)由小程序提交的購物請求、驗證通過掃碼支付中間件登錄服務器的超市客戶機身份、存儲上傳的商品信息和下發(fā)回寫命令等。
從圖1 可知,掃碼支付中間件在功能上屬于一種數(shù)據(jù)交互中間件,是服務器和各超市收銀系統(tǒng)數(shù)據(jù)庫的通訊橋梁。中間件以SQL 方式與收銀系統(tǒng)數(shù)據(jù)庫直接對接,與服務器則使用MQTT 協(xié)議進行通訊。中間件從收銀系統(tǒng)數(shù)據(jù)庫中讀取商品信息,轉換為JSON 格式后上傳至服務器;同時將從服務器接收到的訂單信息回寫到收銀系統(tǒng)數(shù)據(jù)庫中。之所以采用JSON 作為數(shù)據(jù)交換格式,是因為JSON 效率較XML 更高且易于修改[5]。由于掃碼支付中間件承擔了低速且頻繁的數(shù)據(jù)庫讀/寫任務,這樣就很大程度上減輕了服務器的負擔、提高了掃碼支付產(chǎn)品的實時效率。
具體而言,掃碼支付中間件包含以下幾方面的功能:
(1)商品信息定時上傳功能。超市商品的價格波動大、促銷和折扣信息繁多,收銀系統(tǒng)數(shù)據(jù)庫中保存的商品信息處于不斷變化中。服務器在處理用戶提交的訂單時必須以最新價格為準,否則會造成訂單金額計算錯誤。之前一些掃碼支付產(chǎn)品服務器中保存的商品信息多以人工方式更新,這樣不僅速度較慢,也容易造成遺漏。通過掃碼支付中間件提供的商品信息定時上傳功能,超市管理人員僅需要為中間件設定兩次商品信息上傳的間隔時間。之后中間件在每次上傳時間點到達時,將自動讀取并上傳最新的商品信息至服務器,無須人工干預。
(2)訂單回寫功能。中間件將用戶提交并完成的訂單信息實時寫入到收銀系統(tǒng)數(shù)據(jù)庫中。這樣除了及時記錄超市的銷售情況外,還可以更有效地采集用戶消費數(shù)據(jù),進而通過大數(shù)據(jù)技術對消費行為做出分析,為用戶提供更精準的個性化服務。由于在同一時刻可能會有大量訂單等待寫入數(shù)據(jù)庫,因此該功能需要以異步方式實現(xiàn)。
(3)網(wǎng)絡代理功能。服務器與客戶機、收銀系統(tǒng)數(shù)據(jù)庫有可能處在不同的網(wǎng)絡,或因防火墻設置問題而無法直接訪問。因此中間件必須提供網(wǎng)絡代理功能,以保證服務器與客戶機在各種情況下都能正常連接與通訊。
掃碼支付中間件的主要功能如圖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 用于中間件向服務器上傳數(shù)據(jù)。smg/client/server/will 是MQTT 協(xié)議的遺囑消息主題,用于在中間件或客戶機出現(xiàn)異常時向服務器發(fā)送說明信息[6]。
圖2 掃碼支付中間件的功能流程
掃碼支付中間件以Visual Studio 2017 為開發(fā)平臺,開發(fā)語言為C#,使用開源類庫MQTTnet 2.4.5 實現(xiàn)對MQTT 協(xié)議的支持。服務器和客戶機的運行環(huán)境都為Windows 10(64-bit),.NET 版本為4.6.2。測試選用的收銀系統(tǒng)數(shù)據(jù)庫為科邁智贏V9.0。
(1)中間件啟動流程。中間件啟動后,首先由超市管理人員在登錄界面上輸入連接服務器和收銀系統(tǒng)數(shù)據(jù)庫所必需的信息,如圖3 所示。
當單擊“登錄”按鈕時,中間件首先向服務器傳輸一個JSON 格式的登錄請求數(shù)據(jù),其內容為:
{
"command_type":"login", //命令類型
"data":{
"user_name":"", //登錄名
"passwd":"" //密碼
}
}當服務器審核登錄信息無誤后,立即向中間件回復包含超市信息的確認登錄數(shù)據(jù)。其內容為:
{
"command_type":"login_reply", //命令類型
"data":{
"supermarket_id":"", //超市ID
"supermarket_name":"", //超市名稱
}
}
圖3 掃碼支付中間件登錄界面
(2)數(shù)據(jù)定時上傳與回寫流程。中間件定時上傳的時間間隔(例如6 小時)由超市管理人員在中間件的配置文件中設定。中間件登錄到服務器后首先上傳一次商品信息,然后定時上傳收銀系統(tǒng)數(shù)據(jù)庫中最新的全部商品信息,并覆蓋服務器之前保存的信息。其內容為(具體條目可根據(jù)實際需要增刪):
{
"command_type":"schedule_data", //命令類型
"data":[{
"upc_code":, //商品編碼
"product_name":"",//商品名稱
"price":"", //商品價格
"member_price":"", //會員價
"sale_price:"", //促銷價
"unit:"", //單位
}]
}
當用戶提交的一個訂單完成后,服務器會將該訂單信息發(fā)送至中間件。其內容為:
{
"command_type":"schedule_data", //命令類型
"order_id":"", //訂單ID
"shop_name":"", //超市名稱
"shop_code":"", //超市代碼
"time_stamp:"", //時間戳
"pay_type":"", //支付方式
"total_price":"", //訂單總價
"mobile":"", //用戶手機號碼
"card_num":"" //用戶會員卡號
"data":[{….. //根據(jù)訂單中各件商品的信息逐一
填寫
}]
}
中間件收到訂單信息后將進行格式轉換,并立即調用回寫接口將訂單寫入到收銀系統(tǒng)數(shù)據(jù)庫中。為保證中間件的效率和數(shù)據(jù)庫的安全,回寫過程采取異步方式,并在回寫時鎖定相應的數(shù)據(jù)庫表。
此外,由于中間件啟動后,除客戶機關機、斷電等特殊情況之外一般不終止運行。為最大程度保證中間件的正常運行,還提供了一些防護機制,例如斷網(wǎng)時自動重新連接服務器和數(shù)據(jù)庫、Socks5 網(wǎng)絡代理、遠程自動升級,等等。
該中間件已在某大型超市的掃碼支付產(chǎn)品中得到了試用。在網(wǎng)絡正常的情況下,中間件每次上傳18000條商品信息至收銀系統(tǒng)數(shù)據(jù)庫僅需3 到4 分鐘,還可以同時響應1000 個左右的訂單回寫請求。實踐證明,中間件較為有效地提高了掃碼支付產(chǎn)品的效率,而且在運行過程中對客戶機、服務器和收銀系統(tǒng)數(shù)據(jù)庫的性能均沒有明顯影響。
掃碼支付在超市自助購物領域有廣闊的應用前景,但目前不少掃碼支付產(chǎn)品還存在一些待改進之處。掃碼支付中間件的引入可以在一定程度上為提升掃碼支付產(chǎn)品性能提供一種新思路,更好地滿足用戶自助購物的需求。今后進一步的工作主要集中在擴展中間件功能和更好地解決中間件部署等方面。