date:2017-04-01
巨人的肩膀
In me the tiger sniffs the rose. —— 英國詩人西格夫里·薩松代表作《于我,過去,現(xiàn)在以及未來 》
從入門到精通:支付系統(tǒng)設(shè)計(jì)
趨勢(shì)
支付的本質(zhì),是價(jià)值的轉(zhuǎn)移
聚合支付:
- 原因:支付賬戶和銀行賬戶垂直交叉
- 服務(wù)(>=):支付通道服務(wù)、集合對(duì)賬服務(wù)、技術(shù)對(duì)接服務(wù)、差錯(cuò)處理服務(wù)、運(yùn)行維護(hù)服務(wù)以及其他增值服務(wù)等服務(wù)內(nèi)容
http://qiniu.daydaygo.top/pay-system-design/pay-account
支付服務(wù)其實(shí)需要一套完整的業(yè)務(wù)系統(tǒng),包括且不限于賬務(wù)系統(tǒng)、賬戶系統(tǒng)、路由系統(tǒng)、風(fēng)控/反欺詐系統(tǒng)、運(yùn)營系統(tǒng)等,要為商戶提供完整的“一站式”支付服務(wù)
企業(yè)級(jí)支付突圍:
- 加強(qiáng)支付渠道能力,提供更完善的基礎(chǔ)支付服務(wù)
- 拓展支付場(chǎng)景,提供場(chǎng)景下的支付解決方案:紅包、打賞、平臺(tái)分賬、增值服務(wù)
- 提供安全穩(wěn)定的支付服務(wù)
支付市場(chǎng)未來格局:
- 電子支付賬戶的多維化呈現(xiàn)不可逆轉(zhuǎn)之勢(shì)
- 利用自身的技術(shù)與服務(wù)集成能力,越來越多的技術(shù)供應(yīng)商開始著眼于聚合支付領(lǐng)域
- 聚合支付的系統(tǒng)安全技術(shù)已日益成熟,讓企業(yè)無論大小,都能獲得安全、穩(wěn)定、便捷的支付系統(tǒng)
支付系統(tǒng)的專業(yè)與商業(yè)
支付的商業(yè)化探索:
- 從功能到場(chǎng)景的轉(zhuǎn)換:廣告、粉絲經(jīng)濟(jì)、社區(qū)電商、平臺(tái)類商城
- 支付場(chǎng)景的構(gòu)建:賬戶體系、營銷功能、層級(jí)管理、賬務(wù)管理
- 收費(fèi)服務(wù):好的服務(wù)一定是需要利潤(rùn)支撐的、低價(jià)值的數(shù)據(jù)增長(zhǎng)會(huì)對(duì)發(fā)展帶來致命的影響、付費(fèi)是對(duì)可從事商業(yè)模式的認(rèn)可
從功能到場(chǎng)景的轉(zhuǎn)變:
- 支付方式:網(wǎng)關(guān)、快捷、支付賬戶、信用分期;支付賬戶 和 銀行賬戶
- 支付服務(wù):身份認(rèn)證、銀行卡信息認(rèn)證、海關(guān)報(bào)關(guān)、物流信息查詢
- 場(chǎng)景:C2B2B、C2B2C、B2B2C、B2B2B;功能 -》組織成場(chǎng)景 -》用戶黏性和付費(fèi)意愿 -》創(chuàng)造交易
- 互聯(lián)網(wǎng)的消費(fèi)中,有很大比例的沖動(dòng)型消費(fèi),通過優(yōu)惠券可以有效的刺激用戶的消費(fèi)意愿
- 賬戶系統(tǒng)(應(yīng)該具備):現(xiàn)金賬戶系統(tǒng),卡券賬戶系統(tǒng),支付系統(tǒng)和帳號(hào)系統(tǒng)
支付營銷:
- 用戶對(duì)于貨幣電子紅包的接受度已經(jīng)達(dá)到了 88.3% 的高度
- 沒人再敢拿互聯(lián)網(wǎng)的流量紅利來說事了
http://qiniu.daydaygo.top/pay-system-design/pay-operation1
http://qiniu.daydaygo.top/pay-system-design/pay-operation2.jpg
不同行業(yè)支付系統(tǒng)設(shè)計(jì)
映客APP:
- 區(qū)別化對(duì)待的優(yōu)惠機(jī)制:從優(yōu)惠策略層面引導(dǎo)用戶關(guān)注微信服務(wù)號(hào),鼓勵(lì)用戶進(jìn)行大額充值(還有首充)
- 微信紅包提現(xiàn)(當(dāng)時(shí)沒有手續(xù)費(fèi))
- 設(shè)置不同賬戶出口:消費(fèi)、提現(xiàn)
- 用兌換比例控制運(yùn)營成本
- 緊扣用戶消費(fèi)線的經(jīng)驗(yàn)值系統(tǒng)
http://qiniu.daydaygo.top/pay-system-design/inke
教育行業(yè):
- 互聯(lián)已經(jīng)形成,支付還會(huì)遠(yuǎn)嗎?
- 體驗(yàn)機(jī)制:小額定金 / 免費(fèi)試課;教育是一個(gè)雙向選擇、互相信任的過程;支付行為本身就能讓平臺(tái)的存在感驟增
- 饑餓營銷:限量預(yù)售;讓預(yù)售行為本身就帶有自傳播性
- 優(yōu)惠券機(jī)制:打造口口相傳的熟人效應(yīng);最重要的獲客渠道之一
- 重線上,規(guī)范線下流程:線上專家、拜師,線下資質(zhì)認(rèn)證、退款保障等
社區(qū) + 消費(fèi)(母嬰):
- 想法很美好,現(xiàn)實(shí)很骨感:市場(chǎng)大,但是做好難
- 先做社區(qū),在做電商:打賞 -》 余額 -》 不能提現(xiàn),只能消費(fèi)
- 抱團(tuán):非標(biāo)產(chǎn)品的促銷與拼團(tuán)機(jī)制結(jié)合起來
- 用會(huì)員制建立核心用戶群:‘專家組’
旅游 app:
- 利用出行場(chǎng)景的周期性,增強(qiáng)消費(fèi)轉(zhuǎn)化:APP 的平均打開間隔和日啟動(dòng)次數(shù)可以看出其使用場(chǎng)景和用戶特性
- 支持第三方支付賬號(hào)登錄
- 綁定渠道,爭(zhēng)取渠道用戶流量:‘銀聯(lián)專屬’
- 利用互聯(lián)網(wǎng)優(yōu)勢(shì),打造消費(fèi)體驗(yàn)生態(tài)鏈:優(yōu)惠卡券前置,引導(dǎo)用戶消費(fèi)行為;多個(gè)賬戶體系,滿足多樣人群;加強(qiáng)支付環(huán)節(jié)體驗(yàn)設(shè)計(jì)
http://qiniu.daydaygo.top/pay-system-design/consume-flow
「支付力量」系列
嘛,帶些軟廣,就不列舉了
鳳凰牌老熊 - 支付系統(tǒng)設(shè)計(jì)系列
支付的典型架構(gòu)
- 某團(tuán)
- 某Q旅游公司
- 某東金融
- 業(yè)界最強(qiáng)的某金服金融
龍果開源支付系統(tǒng)
- 架構(gòu)
- 支付時(shí)序
sfy 支付系統(tǒng)升級(jí)
支付系統(tǒng)現(xiàn)狀
sfy 支付相關(guān)整理:使用百度腦圖進(jìn)行整理
相關(guān)問題:
- 沒有接查詢接口進(jìn)行支付結(jié)果確認(rèn)
- 支付后執(zhí)行的邏輯沒有提取出來,在同步和異步函數(shù)中都寫了一遍(DRY, Don't repeat yourself )
- 支付后執(zhí)行的邏輯全到寫到支付 sdk 中,需要 sdk 自己判斷支付場(chǎng)景(應(yīng)該抽象出商戶模式)
- 項(xiàng)目依賴
WEB_LIB
常量來加載第三方 sdk(短信、支付、二維碼), 導(dǎo)致依賴沒有統(tǒng)一管理. php 項(xiàng)目應(yīng)當(dāng)用好 composer 來管理依賴
數(shù)據(jù)庫事務(wù) 是必須要加的,除了防止支付渠道的異步、同步同時(shí)到達(dá),也要防止業(yè)務(wù)系統(tǒng)內(nèi)部的并行操作
支付場(chǎng)景:
- 分期訂單首付
- 還款
- 優(yōu)惠券
支付方式交互字典:統(tǒng)一使用賬務(wù)系統(tǒng)中記錄的支付方式, 避免子系統(tǒng)見不統(tǒng)一
設(shè)計(jì)方案:獨(dú)立出支付系統(tǒng)
支付系統(tǒng)當(dāng)做支付渠道,包含一套 sdk 可以供業(yè)務(wù)系統(tǒng)使用,sdk 包括 4 部分內(nèi)容:下單、同步、異步、查詢
需要考慮 2 點(diǎn):
- 支付網(wǎng)關(guān)前置、后置:采取后置,這樣業(yè)務(wù)系統(tǒng)只用給支付系統(tǒng)發(fā)起請(qǐng)求,用戶在支付系統(tǒng)提供的頁面選擇支付方式
- 支付后的邏輯由業(yè)務(wù)系統(tǒng)還是支付系統(tǒng)處理:支付成功后支付系統(tǒng)通知業(yè)務(wù)系統(tǒng),由業(yè)務(wù)系統(tǒng)完成支付之后的邏輯
最終細(xì)化設(shè)計(jì)如下:
業(yè)務(wù)系統(tǒng)只用展示 ‘去支付’ 按鈕,并傳遞相應(yīng)支付參數(shù)和用戶可以使用的支付方式給支付系統(tǒng),支付系統(tǒng)驗(yàn)證后生成 PayOrder,支付系統(tǒng)按照業(yè)務(wù)系統(tǒng)傳遞的
order_no
進(jìn)行去重支付系統(tǒng)展示收銀臺(tái)(需要 設(shè)計(jì) + 前端 支持)
根據(jù)用戶選擇的支付方式,調(diào)起支付渠道
接收支付渠道的同步和異步通知,解析出支付結(jié)果,更新 PayOrder 后轉(zhuǎn)發(fā)給業(yè)務(wù)系統(tǒng)
對(duì)接支付渠道查詢接口,異步通知業(yè)務(wù)系統(tǒng)結(jié)果
安全:和業(yè)務(wù)交互的接口都進(jìn)行驗(yàn)簽
支付流水記錄:
PayOrder
跟蹤一筆支付單全部生命周期
盜用一下別人的圖,抽空再練練 Axure
支付系統(tǒng)前期工作:代碼拆分,進(jìn)行分層
分層設(shè)計(jì)
pay-gateway(支付網(wǎng)關(guān)) / pay-task(后臺(tái)任務(wù)) -》pay-lib(支付公共庫) -》php-lib(基礎(chǔ)公共庫)
確定 代碼分層依賴關(guān)系 后,實(shí)現(xiàn)起來的難點(diǎn)主要在于一個(gè)接一個(gè)業(yè)務(wù)項(xiàng)目的 拆分 代碼,并清理支付方式中的業(yè)務(wù)代碼
支付系統(tǒng)網(wǎng)關(guān) - pay-gateway
業(yè)務(wù)系統(tǒng)和支付系統(tǒng)API交互約定規(guī)則:
- 返回:json 格式,6 位 code + message,成功返回
000000
,失敗返回28xxxx
(支付系統(tǒng)錯(cuò)誤碼段) - 驗(yàn)參:必填參數(shù)、參數(shù)長(zhǎng)度(大部分參數(shù)會(huì)落地到存儲(chǔ)層),返回第一條匹配失敗的信息
- 驗(yàn)簽:添加 sign 字段進(jìn)行簽名、驗(yàn)簽
收單接口
- 業(yè)務(wù)系統(tǒng)向支付系統(tǒng)收單接口發(fā)起請(qǐng)求
- 支付系統(tǒng)收單接口 驗(yàn)參、驗(yàn)簽、去重(商戶號(hào) + 訂單號(hào)),驗(yàn)證通過后生成 支付流水記錄(PayOrder)
- 展示支付方式給用戶,用戶選擇后,通過支付渠道 sdk 調(diào)起支付
- 注意:只有一種支付方式時(shí),直接通過支付渠道 sdk 調(diào)起支付,不顯示支付方式選擇頁面
同步接口
- 支付系統(tǒng)接收到支付渠道的同步通知,通過支付渠道 sdk 獲取支付結(jié)果,更新支付流水記錄
- 支付系統(tǒng)跳轉(zhuǎn)到業(yè)務(wù)系統(tǒng)下單時(shí)提供的
return_url
,并帶上支付信息
支付系統(tǒng) - 異步接口
- 支付系統(tǒng)接收到支付渠道的異步通知,通過支付 sdk 獲取支付結(jié)果,更新支付流水記錄
- 支付系統(tǒng)向業(yè)務(wù)系統(tǒng)發(fā)送異步通知
查詢接口
業(yè)務(wù)通過下單使用的單號(hào),調(diào)用支付系統(tǒng)支付查詢接口獲取支付結(jié)果
業(yè)務(wù)系統(tǒng)和支付系統(tǒng)屬于內(nèi)網(wǎng)交互,可靠性更高,可以考慮不做
支付系統(tǒng)后臺(tái)任務(wù) - pay-task
查詢支付渠道支付結(jié)果
- 通過支付 sdk 查詢接口獲取支付結(jié)果,更新支付流水記錄
- 獲取結(jié)果后向支付系統(tǒng)發(fā)送異步通知(需要和之前的異步通知進(jìn)行去重處理)
數(shù)據(jù)層設(shè)計(jì)
增加 PayOrder 用來跟蹤支付單
日志
增加專用支付日志, 打在關(guān)鍵節(jié)點(diǎn)上:
- 支付系統(tǒng):收到業(yè)務(wù)系統(tǒng)下單請(qǐng)求、給支付渠道發(fā)送下單請(qǐng)求、支付渠道同步請(qǐng)求、支付渠道異步請(qǐng)求、調(diào)用支付渠道查詢接口
- 業(yè)務(wù)系統(tǒng):發(fā)起支付、同步通知、異步通知
php 編程相關(guān)
編碼規(guī)范
部分通過配置 phpstorm IDE code style
實(shí)現(xiàn)(快捷鍵 ctrl-alt-l
)
遵循的編碼規(guī)范:
類的命名 必須 遵循 StudlyCaps 大寫開頭的駝峰命名規(guī)范;
類中的常量所有字母都 必須 大寫,單詞間用下劃線分隔;
方法名稱 必須 符合 camelCase 式的小寫開頭駝峰命名規(guī)范。
代碼 必須 使用4個(gè)空格符而不是「Tab 鍵」進(jìn)行縮進(jìn)。
每個(gè) namespace 命名空間聲明語句和 use 聲明語句塊后面,必須 插入一個(gè)空白行。
類的開始花括號(hào)({) 必須 寫在函數(shù)聲明后自成一行,結(jié)束花括號(hào)(})也 必須 寫在函數(shù)主體后自成一行。
方法的開始花括號(hào)({) 必須 寫在函數(shù)聲明后自成一行,結(jié)束花括號(hào)(})也 必須 寫在函數(shù)主體后自成一行。
類的屬性和方法 必須 添加訪問修飾符(private、protected 以及 public),abstract 以及 final 必須 聲明在訪問修飾符之前,而 static 必須 聲明在訪問修飾符之后。
控制結(jié)構(gòu)的關(guān)鍵字后 必須 要有一個(gè)空格符,而調(diào)用方法或函數(shù)時(shí)則 一定不可 有。
控制結(jié)構(gòu)的開始花括號(hào)({) 必須 寫在聲明的同一行,而結(jié)束花括號(hào)(}) 必須 寫在主體后自成一行。
違反的編碼規(guī)范:
- PHP代碼中 應(yīng)該 只定義類、函數(shù)、常量等聲明,或其他會(huì)產(chǎn)生 副作用 的操作(如:生成文件輸出以及修改 .ini 配置文件等),二者只能選其一;(支付 sdk 里面 12、13 年的代碼, 實(shí)在不好改成遵守編碼規(guī)范的)
自動(dòng)加載
- 項(xiàng)目中 composer 版本為 1.0-dev,我本地環(huán)境為 1.2,導(dǎo)致生成的文件不同;
- 修改
composer.json
文件中autoload
后,執(zhí)行php composer.phar.php aumpautoload
來生成類的映射文件
第三方依賴
- QrCode: 生成微信二維碼時(shí)使用