聊聊支付流程的設計與實現邏輯

来源:https://www.cnblogs.com/cicada-smile/archive/2022/07/03/16440287.html
-Advertisement-
Play Games

通常在業務體系中,都會或多或少的涉及到支付相關的功能;對於一些經驗欠缺同學來說,最緊張的就是面對這類支付結算的邏輯,因為流程中的任何細節問題,都可能引發對賬異常的情況;錯誤發生之後,再想去修複流程,花費的時間成本又是高昂的,還牽扯錯誤數據的調平問題,最終很可能引發亂賬算不清的結果,然後需要人工介入手... ...


新手打怵老手頭疼的業務;

一、業務背景

通常在業務體系中,都會或多或少的涉及到支付相關的功能;對於一些經驗欠缺同學來說,最緊張的就是面對這類支付結算的邏輯,因為流程中的任何細節問題,都可能引發對賬異常的情況;

錯誤發生之後,再想去修複流程,花費的時間成本又是高昂的,還牽扯錯誤數據的調平問題,最終很可能引發亂賬算不清的結果,然後需要人工介入手動處理;

在支付場景中,不但涉及諸多的複雜業務,結算規則,超長的流程,第三方對接,其中更是涉及到諸多技術細節,比如:事務管理、非同步處理、重試機制、加鎖等;下麵來分析具體的細節邏輯。

二、支付業務

1、流程拆解

面對複雜業務的時候,最基本的能力就是要懂得把流程拆成模塊,做好各個模塊管理,再考慮如何銜接起整個流程,從而形成解決問題的思路和經驗;

如圖是對交易場景常見的分解,大致可以分為四個模塊:

  • 賬面管理:對於開通支付功能的用戶,必須清晰的管理資金信息;比如可用,凍結,賬單等;
  • 交易流水:整個資金管理的流水記錄,不局限於交易場景,還有充值,提現,退款等;
  • 支付對接:通常流程中的支付功能都是對接第三方支付平臺來實現的,所以要做好請求和報文的記錄;
  • 訂單結構:比如在電商交易中,訂單模型的管理,拆單策略等,支付的商品規格等;

這裡只是從一個常規的交易流程中去分析,實際的細節描述會遠比圖例複雜,雖然業務細節各不相同,但是處理思路是大體相通的;再根據各個模塊設計流程時序圖,規劃好節點之間的銜接和協作;

2、流程時序

通過時序圖的設計,來分析各個節點在銜接協作時應該如何處理,在支付業務中,通常分為支付前、支付對接、支付後三個核心階段:

  • 支付前:在商品下單時,構建訂單模型,根據拆單規則校驗庫存、商品狀態等,然後進行賬戶資金凍結,生成交易流水,此時的狀態都是待支付;
  • 支付對接:支付前業務模型初始化成功之後,構建第三方支付對接請求,發起付款流程,並記錄相應的請求動作和參數,等待支付結果的通知;
  • 支付後:根據支付結果的成功與否,執行相應的業務模型狀態更新,如果支付成功則交易記錄、凍結的資金、訂單結構與庫存等都需要做一系列更新;

實際上對業務有清晰的理解和拆分之後,再做好時序流程的設計,這樣就已經讓一個複雜的場景看起來簡單許多了,之後就是設計各個節點的數據結構;

3、結構設計

基於上面的業務場景分析和拆解,以及流程時序圖的呈現,可以很容易輸出一份基礎維度的結構設計,下圖可以作為參考:

  • 賬面管理:三個核心維度,賬戶金額,可用餘額,凍結金額;
  • 交易記錄:存儲用戶的交易動作,但是可能會產生多個交易明細,典型的場景就是購物車下單;
  • 交易明細:通常因為訂單拆分,從而導致交易被拆分多條明細,進而將資金支付給不同商家;
  • 支付對接:請求第三方支付平臺時,需要記錄請求時參數,以及第三方回調通知的報文;
  • 訂單記錄:在一筆訂單中可能存在多個拆分的子單,拆分策略也很多,比如倉庫,商家,品類等;
  • 訂單明細:管理每筆子訂單的信息,下單的商品、規格、買賣雙方、單價、數量、金額等;

即使單看上面的簡單設計,都能感覺到支付業務的複雜性,更何況還會疊加紅包或滿減等優惠規則之後,其複雜程度可想而知;

當然如果有明確的開發規範,在複雜版本中,所有開發必須輸出業務的分解拆分思路,時序和結構設計,在統一評審之後再落地編碼,這樣即便是複雜的業務也會有極大的質量保證。

三、關聯業務

上面單從支付的主邏輯去分析流程,實際上涉及到的業務遠不止流程中提到的這些,以常見的電商場景為例,交易中還存在商品管理、庫存管理、物流管理,支付對接還會涉及優惠規則嵌入等等;

商品管理

  • 商品主體:維護商品各個維度的信息,並提供各種規格選項,以及基礎的定價階梯,構建商品詳情描述;
  • 倉儲管理:訂單拆單之後,需要根據商品編號去校驗倉儲信息,進行相應的庫存凍結以及支付後的倉庫發貨;

優惠券規則

  • 優惠券主體:為了適配更多的業務場景,需要對優惠規則有諸多的設計,比如滿減或折扣比例、按價格階梯優惠、有效期限制等;
  • 發放規則:支撐日常的運營活動,用戶生命周期的維護,以及渠道流量的轉化,提供用戶群營銷的基礎能力;

這裡簡述的商品和優惠券業務,都是與支付流程有緊密的聯繫,比如拆單後庫存不足,需要移除該商品;優惠券在支付中的使用策略,以及退款時的處理方式等;

四、實踐總結

最後從技術實現的角度,總結一下支付流程中的一些關鍵問題:

  • 業務模型:對業務有清晰的理解,並能拆分出核心的節點,設計出相應的流程時序和數據結構;
  • 事務管理:交易流程中常用TCC事務機制,即Try(預處理)、Confirm(確認)、Cancel(取消)模式;
  • 加鎖與重試:支付完成後發出支付成功的消息,而後進行業務更新,通常需要對處理的訂單號加鎖,避免消息重試機制引發數據問題;
  • 資金結算:涉及金額的計算,自然要求不能出現精度損失的問題,在一次交易中必須保證每筆資金可以通過對賬核驗;
  • 流程維護:流程本身是很難保證不出現錯誤的,需要在開發的時候,提供流程的可視化界面,並且支持手動維護的機制;

很多複雜的業務場景管理,都需要一個長期的迭代過程,但是前提需要牢牢把握住核心的邏輯;對業務的認知是一個由繁入簡的過程,而業務的實現是一個由淺到深的過程,即分析與理解,到落地實現,再到探索與創新。

五、參考源碼

編程文檔:
https://gitee.com/cicadasmile/butte-java-note

應用倉庫:
https://gitee.com/cicadasmile/butte-flyer-parent

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 促使我寫這篇文章主要是在寫一個關於虛擬貨幣賬戶監控的項目時使用 Ticker 的問題。 Ticker 的問題 如果用過 Ticker 的朋友會知道,創建 Ticker 後並不會馬上執行,而是會等待一個時間 d,這就是創建時的間隔時間。如果間隔時間很短這基本上不會有太大問題,但是如果對首次執行時間有要 ...
  • ​ 隨著互聯網的快速發展,各種組件層出不窮,需要框架集成的組件越來越多。每一種組件與Spring容器整合需要實現相關代碼。SpringMVC框架配置由於太過於繁瑣和依賴XML文件;為了方便快速集成第三方組件和減少對配置文件的依賴,SpringBoot應運而生,其中採用了約定大於配置的理論讓開發者不需 ...
  • 開發經常遇到分頁查詢的需求,但是當翻頁過多的時候,就會產生深分頁,導致查詢效率急劇下降。 有沒有什麼辦法,能解決深分頁的問題呢? 本文總結了三種優化方案,查詢效率直接提升10倍,一起學習一下。 ...
  • 背景介紹 在程式中,主線程啟動一個子線程進行非同步計算,主線程是不阻塞繼續執行的,這點看起來是非常自然的,都已經選擇啟動子線程去非同步執行了,主線程如果是阻塞的話,那還不如主線程自己去執行不就好了。那會不會有一種場景,非同步線程執行的結果主線程是需要使用的,或者說主線程先做一些工作,然後需要確認子線程執行 ...
  • 本文介紹了Netty對各種IO模型的支持以及如何輕鬆切換各種IO模型。還花了大量的篇幅介紹Netty服務端的核心引擎主從Reactor線程組的創建過程。在這個過程中,我們還提到了Netty對各種細節進行的優化,展現了Netty對性能極致的追求。 ...
  • 記憶體分析器 (MAT) 1. 記憶體分析器 (MAT) 1.1 MAT介紹 MAT是Memory Analyzer tool的縮寫。指分析工具。 1.2 MAT作用 Eclipse Memory Analyzer 是一種快速且功能豐富的Java 堆分析器,可幫助您發現記憶體泄漏並減少記憶體消耗。 使用記憶體 ...
  • 編程中一直對這兩個概念不是很理解,在網上搜了很多資料大概描述的其實都很模糊,有時候還自相矛盾,很容易搞混,這裡說一下我對這兩個概念的理解。 首先看一下相關技術書籍對這兩個概念的描述,下麵分別是摘自《深入理解Java核心技術》和《Java併發程式設計中的》的內容。 摘自《深入理解Java核心技術》14 ...
  • 題目鏈接:P2680 [NOIP2015 提高組] 運輸計劃 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn) 看了好長時間題解才終於懂的,有關lca和二分答案的題解解釋的不詳細,一時半會理解不過來,於是自己寫一篇解釋儘管解釋主要在代碼中,希望能對迷茫的小伙伴有幫助 解析(主要為二分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...