網(wǎng)上有很多關于第三方支付有pos機的,基于有限狀態(tài)機與消息隊列的三方支付系統(tǒng)補單實踐的知識,也有很多人為大家解答關于第三方支付有pos機的的問題,今天pos機之家(m.afbey.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
第三方支付有pos機的
0.引言在日常生活中,從線下的超市購物到線上的外賣點餐、電商網(wǎng)購等,支付無時無刻不在發(fā)生,不論是通過現(xiàn)金、pos 機刷卡還是微信支付寶等第三方支付。線上支付有著及時便捷一氣呵成的極致體驗,當然也有少數(shù)的時候體驗不夠絲滑,比如早期我們在 PC 版 12306 買火車票,當支付完成后,訂單的支付狀態(tài)卻經(jīng)常不能及時更新,會有一段時間的延遲,有時甚至會等待很長時間處在未支付狀態(tài)。
在支付的過程中由于各種各樣的原因(比如外部渠道處理出了問題,異步回調(diào)遲遲不來)導致流程走了一半停了下來,用戶看到訂單依然是未支付狀態(tài),會不知所措,此時就需要一種機制來推動完成這筆交易。本文就以三方支付系統(tǒng)中的補單機制為例,來介紹一種較為通用的單據(jù)補償模式。
1.三方支付系統(tǒng)簡介1.1 什么是三方支付所謂第三方支付,就是和各大銀行簽約,獨立于商戶和銀行,具備一定實力和信譽保障的,為商戶與消費者提供支付結(jié)算服務的第三方獨立機構(gòu)。它是處于買方和賣方之間具備公信力的第三方,承擔擔保人和資金托管人的角色。三方支付也可以稱為虛擬賬戶支付,由消費者在第三方支付機構(gòu)開設虛擬賬戶,并用虛擬賬戶中的資金進行支付。業(yè)界常見的三方支付有支付寶、微信支付、美團支付、京東支付等等。
1.2 三方支付中的交易&支付系統(tǒng)交易是什么,最直觀的描述就是“一手交錢、一手交貨” ,交易會使買賣雙方形成債權(quán)和債務關系。交易的存在是支付發(fā)生的前提,用戶通過使用某種支付方式去完成交易。交易是支付流程的驅(qū)動者,根據(jù)具體場景組合不同的支付指令,來完成交易資金的轉(zhuǎn)移。
支付是交易處理資金流的工具,目的是清償債權(quán)和債務關系;支持多種支付方式(如銀行卡支付、余額支付、優(yōu)惠券組合支付、類似花唄的信用支付等),負責對接賬務、會計、計費系統(tǒng)等資金處理能力,接收支付指令,驅(qū)動完成資金交換。將實際的支付行為(實際資金)與內(nèi)部的記賬(虛擬資金)相結(jié)合,保證虛實一致。
三方支付整體業(yè)務架構(gòu)如圖 1 所示,其中交易核心與支付核心在業(yè)務劃分上處于"收單支付域",具備普通交易的收款、付款、退款及充值、轉(zhuǎn)賬與提現(xiàn)等常見功能,還包括了支撐電商業(yè)務的合單支付、擔保與分賬的能力。其中交易與支付核心都有一個異常查補模塊,它囊括了所有業(yè)務的補償流程,也是本文主要介紹的部分。
圖 1. 三方支付業(yè)務架構(gòu)
2.什么是補單&為什么需要補單一筆交易在支付過程中由于鏈路中的各種異常而中斷,此時的交易處在一種中間狀態(tài),這種情況俗稱"卡單",即卡在那里不動了,沒有繼續(xù)向下推進。還有一種情形,支付核心向渠道發(fā)起了扣款,渠道受理后,銀行卡扣款成功,但由于種種原因沒有向支付核心發(fā)起回調(diào),導致這筆支付沒有完成,用戶沒有享受到相應權(quán)益,但銀行卡的錢已經(jīng)扣了,這種情況稱為“掉單”。
不管是卡單還是掉單,都是處在中間態(tài)的訂單。補單就是將處在中間態(tài)的訂單進行補償,直到推進到終態(tài)(成功或失?。?/strong>。補單一般有兩個關鍵點,一個是補償?shù)挠行裕瑯O端情況下可能補償多次都不成功,不能就此放棄了,需要有兜底的機制;另一個是補償?shù)募皶r性,因為交易掛起的時間越長,用戶的體驗越差。
交易核心和支付核心的補單相得益彰,具有一定相似程度的設計與實現(xiàn),我們就以支付核心的補單為例介紹下異常補單機制。
3.補單是如何實現(xiàn)的本章首先了解一下業(yè)務流程,說明一下實現(xiàn)補單需要的前提基礎,然后介紹一下補單機制的演進路線,每個版本存在的問題以及在下一個版本是如何解決的。
3.1 有限狀態(tài)機與冪等性標識資金操作的有限狀態(tài)機我們首先以用戶發(fā)起一筆余額提現(xiàn)為例,說明下業(yè)務流程,簡化后如圖 2 所示。
圖 2. 余額提現(xiàn)流程
首先生成支付訂單,然后請求賬務系統(tǒng),扣減用戶賬戶下的余額,接著向外部渠道發(fā)起付款操作,資金操作完成后統(tǒng)一處理結(jié)果并更新單據(jù)信息,最后還有一些對上下游的異步通知,形式上包括消息和 RPC 回調(diào)。
我們將每個關鍵資金操作的狀態(tài)記錄落庫,如下表所示。其中出款即錢從哪里來,入款即錢到哪里去,沖正即回滾交易。在提現(xiàn)場景下就是從用戶支付賬戶出錢,到用戶的銀行卡去。其他場景比如充值(銀行卡->用戶支付賬戶),會有不同的資金流向。表中最后兩行加粗的場景還沒有達到終態(tài),是我們需要去補償?shù)摹?/p>
為了便于理解,我們在這里省略了沖正的相關操作,一次余額提現(xiàn)流程的狀態(tài)機轉(zhuǎn)換如圖 3 所示。
圖 3.附帶狀態(tài)機轉(zhuǎn)換的余額提現(xiàn)流程
可重入與冪等性保證發(fā)起一次支付會涉及到多個系統(tǒng)間調(diào)用,由于網(wǎng)絡原因?qū)е碌耐ㄐ懦瑫r是常見的問題。同時上游系統(tǒng)也可能會重新發(fā)起請求,這需要我們的系統(tǒng)保證操作結(jié)果的冪等性。少數(shù)用戶也可能會有多個終端同時操作帶來的并發(fā)請求,需要我們保證接口的可重入性。除了服務自身,我們的下游依賴同樣也需要保證其接口具有同樣的能力。
先說一說什么是可重入與冪等性。
可重入:在并發(fā)請求下可以保證正確性。冪等性:重復多次相同的輸入,獲得相同的輸出。冪等性在技術(shù)上其實也包含了可重入的要求。具體到業(yè)務中,冪等性是針對一筆已經(jīng)到達終態(tài)的支付而言的,對于初次未能拿到最終業(yè)務結(jié)果的請求,再次發(fā)起調(diào)用的結(jié)果可以是不同的(處理中->處理成功或失?。?。那么我們?nèi)绾伪WC業(yè)務流程的可重入與冪等性呢?我們分別拆解每一步來看:
生成支付單:首先支付單據(jù)可以將業(yè)務方傳遞的可保證唯一性的外部訂單號作為唯一索引,插入數(shù)據(jù)庫時若發(fā)生唯一索引沖突,則將查詢已有數(shù)據(jù)進行冪等參數(shù)校驗,若與當次請求的參數(shù)完全一致說明是重復請求,可使用 DB 中的支付單繼續(xù)推進后續(xù)流程;若不一致則返回錯誤。資金處理流程:賬戶和渠道系統(tǒng)各自保證其接口冪等性。我們也維護了每個下游操作的狀態(tài),根據(jù)狀態(tài)機決定是否要繼續(xù)推進,盡量不向下游輸出重復流量。比如支付單已經(jīng)完成了所有資金處理,狀態(tài)機已經(jīng)是終態(tài),那么接口可以直接返回相應結(jié)果。更新支付單信息,先將支付單加行級排他鎖,再進行更新,保證多個并發(fā)請求只會有一個成功。異步通知,在支付單推進到終態(tài)后進行。有了可重入與冪等性保證,我們就可以大量地復用正向流程來實現(xiàn)補單接口。
3.2 初始版一般來說最常見的補單形式是設置一個定時任務,定時去掃表完成業(yè)務補償,實現(xiàn)比較簡單,但是及時性不夠,對于收款轉(zhuǎn)賬類的交易而言用戶體驗不佳。我們采用了通過消息隊列進行即時補償?shù)姆绞?,如圖 4 所示。補償消費者并沒有去做補償工作,而是解析消息然后通過 RPC 調(diào)用支付核心暴露的補償接口。為什么不在消費者中直接補償?這么做主要是考慮將邏輯收斂到一處便于維護。
圖 4. 余額提現(xiàn)發(fā)生異常時的補單流程
當然,補單可能依然失敗,我們可以再次發(fā)送補償消息。但不能一直這樣循環(huán)下去,所以需要設置一個最大重試次數(shù),超出后不再發(fā)送。當補償多次都不成功時,一般是下游系統(tǒng)出了問題,這時我們需要放緩補償?shù)念l次,隨著重試次數(shù)增加,會讓每次補償時間間隔逐漸增大,通過 RocketMQ 的延時消息實現(xiàn)。
這里有三個很容易想到的問題:
如果異常消息發(fā)送失敗,上游也沒有重試機制,這筆訂單就可能一直掛在這里不了了之了,如圖 5 所示。補償消費者請求支付核心補單時不成功,可能是超時但實際補償成功了,或者是請求壓根沒有過去,如圖 6 所示。如果重試達到最大次數(shù)依然沒有成功,這筆單子該怎么處理。圖 5. 補償消息發(fā)送失敗
圖 6. 補償消息消費失敗
3.3 改進版針對問題 1,如果重試依然發(fā)送失敗,我們通過引入一張異常消息表,將發(fā)送失敗的消息落庫來解決。表中記錄了訂單號、當前的重試次數(shù)、異常分類、記錄狀態(tài)、消息體等字段。如果圖 6 中的第 4 步消息發(fā)送失敗,就將這筆訂單放入 DB 中的一張異常表中,會設置一個定時任務去處理。以目前 RocketMQ 的可用性來說,異常數(shù)據(jù)很少會出現(xiàn)。如圖 7 所示。
圖 7. 針對消息生產(chǎn)/消費異常的改進版 - 1
對于第 2 個問題,如果補償消費者調(diào)用支付核心失敗,補償消費者 HandleMessage 會向上層拋出 error,利用 RocketMQ 的梯度重試機制,當消費重試次數(shù)達到一定上限后會進入死信隊列。如圖 8 所示,這種情況一般是服務或網(wǎng)絡出了問題,待恢復之后,可以從死信隊列拉取這些消息再統(tǒng)一處理。
圖 8. 針對消息生產(chǎn)/消費異常的改進版 - 2
當然還有更極端的情況,請求 MQ 和 DB 都失敗了咋辦?以目前 MQ 和 DB 的可用性來說,同時失敗這種基本可以不用考慮,報警人工介入即可。
針對問題 3,如果重試超過最大次數(shù),依然補償不成功,一般是下游依賴出了問題。這種情況我們也將它放進異常表中。
對于這兩類漏網(wǎng)之魚,需要支持單條/批量支付單補償?shù)倪\營能力以供人工介入;最好有一個在業(yè)務低峰期運行的兜底任務,掃描業(yè)務單據(jù)表,將一段時間內(nèi)還未完成的訂單進行補償。
另外,兜底任務可能造成消息的短暫堆積,影響線上的實時補償流程推進,對此可以使用獨立的隊列隔離開來。
3.4 最終版其實如果只是異步通知類的操作出現(xiàn)了異常,并沒有必要每次都重新走一遍完整業(yè)務流程,缺啥補啥即可。因此我們將異常劃分為多種類型,將一些異步操作和業(yè)務處理劃分開來,進行精細化的處理:
通知下游的 MQ 失敗,就將這個消息體重發(fā)一次即可;通知交易的回調(diào) RPC 失敗,可將 RPC 請求序列化到消息體中,補償時通過反序列化消息體中的 RPC 請求,直接再發(fā)起一次 RPC 即可;對于更新 DB 失敗,將更新參數(shù)序列化到消息體中,補單時再次發(fā)起一次更新;如果在業(yè)務處理時遇到了異常情況,需要再走一遍業(yè)務補償;圖 9 以這幾種異常為例,說明了每種補償類型的消息參數(shù)。
圖 9. 分類補償
我們最終的補單體系見圖 10,它既通過即時消息保證了補償?shù)募皶r性,是主動出擊之茅;也利用延時消息重試、落地失敗消息的異常表與兜底任務保證了補償?shù)挠行裕侨f無一失之盾。不僅可用于支付單據(jù)的補償,通過保證流程的可重入性,也可作為一種通用解決方案,但不適用于無狀態(tài)、不可重入的業(yè)務形態(tài)。
圖 10. 異常補償體系
本文首先介紹了什么是補單,接著基于三方支付系統(tǒng)的實現(xiàn)完整闡述了補單機制的演進過程,最終演化為一種相對通用的異常處理模式,即基于消息隊列、有限狀態(tài)機與多重任務兜底的業(yè)務層最終一致性保障機制,供大家參考指正。
更多分享UME - 豐富的Flutter調(diào)試工具
一例 Go 編譯器代碼優(yōu)化 bug 定位和修復解析
字節(jié)跳動破局聯(lián)邦學習:開源Fedlearner框架,廣告投放增效209%
抖音品質(zhì)建設 - iOS啟動優(yōu)化《原理篇》
歡迎關注「 字節(jié)跳動技術(shù)團隊 」
簡歷投遞聯(lián)系郵箱「 tech@bytedance.com 」
POS機什么牌子好用?
觀點:安全是首先必須要保證的 其次考慮機器辦理成本 功能要求 使用便捷 是否養(yǎng)卡
POS機是金融收款工具 所以國家監(jiān)管十分嚴格 要求POS設備必須要有銀聯(lián)安全認證 收單機構(gòu)必須有支付牌照 滿足這兩方面要求得POS機就是有安全保證的。
下面的就是POS設備不合格的典型案例 由于存在安全隱患銀聯(lián)已經(jīng)取消了這款設備的安全認證【涉及市面4家支付公司的產(chǎn)品】
擁有支付牌照的支付公司有200多家 擁有全國收單權(quán)限的 雙牌照收單機構(gòu)24家 ,雖說有支付牌照機器都是安全的但對于個體用戶來說使用全國收單雙牌照支付公司產(chǎn)品有以下幾點好處
一、商戶池大 高質(zhì)量商戶多 落地商戶多 不會跳地區(qū)】很多品牌機器部分地區(qū)總共就幾十個商戶來回切換】
二、全國可用 不限制地區(qū)【很多支付公司機器是限制地區(qū)的 沒有商戶的地區(qū)就只有跳碼了】
三、大品牌市場占有率高 降低銀行系統(tǒng)tao xian評估【銀行是可以知道你是用什么品牌機器在消費的 你消費的所以店鋪都在使用一個小眾品牌的機器概率很小 】
以上三點對于一般用戶不太關緊 但是對于信用卡 高度依賴 銀行信用卡評分比較低的用戶也很關鍵 降低一個評分就可能被降額
下圖就是評分較低的 處在降額的邊緣
機器辦理成本及功能要求
機器辦理成本這個很關鍵 不論是商家還是個體辦理 首先考慮自己的每月交易量 如果交易量不大 顯然不適合有押金或者買斷的機器 信用卡消費本身就是在透支 一定要減少不必要得投入。
需不需要掃碼功能 是否用云閃付消費這些功能不是所有POS機上都有的 畢竟通過這類消費 能降低我們的手續(xù)費支出 也增加了消費的多樣化 提高信用卡評分【如上圖就是消費單一】
使用的便捷
之前手刷 不但費率高而且需要鏈接手機 明顯不夠便捷 大機器機器攜帶不夠方便 還需要耗材,但是大機器比較適合店鋪收銀 可以出小票。電簽版屬于二者的結(jié)合 不用鏈接手機 和大機器一個通道 個頭小便于攜帶 不能打印紙質(zhì)小票 支持掃碼獲取電子小票。
是否養(yǎng)卡提額
高度依賴信用卡這部分人群對能否養(yǎng)卡會特別在意 那什么樣的機器養(yǎng)卡呢?除了上邊提到的兩點 POS機還應該滿足一下四點要求:
1 百分百真實商戶
2 百分百本地區(qū)落地商戶
3 百分百有積分
4 百分百不跳碼
通過下圖和大家講解一下
真實商戶 落地商戶合規(guī) 符合監(jiān)管要求
不跳碼(標準費率商戶)銀行利益最大化
有積分增加用戶和銀行黏性 提升活躍度 積分還可兌換商品 變相降低刷卡成本
附加知識:跳碼就是支付公司把標注類商戶 跳到民生類或者減免類 這三類費率分別為 0.6% 0.38% 0% 跳碼支付公司拿走了本該屬于銀行的利潤 我們自己費率依然是固定的。而且跳碼的商戶都是商戶質(zhì)量非常差的比如 加油站 飛機票之類
總結(jié)
在安全得前提下 店鋪用機器功能強大更適合 個體使用便捷 養(yǎng)卡更合適 當然費率也是要考慮的。
如果您還有什么不懂得歡迎留言咨詢 別忘了關注我哦 謝謝支持
以上就是關于第三方支付有pos機的,基于有限狀態(tài)機與消息隊列的三方支付系統(tǒng)補單實踐的知識,后面我們會繼續(xù)為大家整理關于第三方支付有pos機的的知識,希望能夠幫助到大家!
