## 支付流程設計 以及細節安全
業務場景:一個預定可以首次預定,還可以在預定有效期內對其進行多次續訂。
目標:設計一個高效,友好,安全的支付方案流程。
>[tip] 注意:無論哪種方案,用戶都有可能打開多個窗口,生成多個支付二維碼支付
**需要注意問題:**
1. 數據一致性校驗(防止用戶在過期的界面提交,這樣會造成實際生成的訂單金額等數據可能與用戶在點擊提交前的頁面上看到的不一致,會讓用戶感到困惑)
2. 安全校驗(防止用戶篡改信息,一般是保護訂單等信息不被非法篡改)
3. 并發問題(用戶同時打開多個頁面進行操作,生成多個訂單,造成多支付二維碼重復支付的問題)
**安全,防止并發問題需確保:**
1. 保證同一預定同一時刻只能被一個線程進行操作(包括預定下面的資源,訂單等)
2. 每次創建訂單,都會檢查當前預定狀態是否滿足創建訂單,并將名下其他待支付的訂單標記為失效
3. 收到支付回執時檢查預定和訂單的狀態是否分別滿足狀態,以及狀態是否相互吻合,如:預定是否為待支付或生效中(預定待支付時訂單類型應該是預定訂單,預定生效中時訂單類型應該是預定訂單),訂單是否失效了,失效則安排退款等
*****
**方案一:**
1. 獲取價格信息,根據其顯示界面,表單
2. 點擊確認,提交表單生成訂單,根據訂單生成支付二維碼,并返回支付信息
> 選擇價格時不創建訂單,等確認提交時,一次性生成訂單和支付信息
>[tip] 需要注意的地方:以最后生成訂單的時刻為準來做數據校驗
----
**方案二:**
1. 獲取價格信息,自動創建訂單(每次天數選擇都會自動生成新的訂單)
2. 點擊支付按鈕,根據前次的訂單信息生成支付二維碼
> 選擇價格時就創建訂單,每次返回訂單信息,點擊“提交”按鈕時,根據前次的訂單信息生成支付信息
>[tip] 需要注意的地方:
> 1. 提交時檢查訂單是否存在,狀態是否正確,order_id是否被篡改等;
> 2. 如果對數據時效性要求高,還需要對數據一致性進行校驗,過期數據,可認為是過期訂單,直接作廢處理,提示用戶頁面過期,引導重新生成訂單。
> 3. 以最后生成支付信息時為準做數據校驗的
----
**方案三:**
1. 獲取價格信息,自動創建訂單,并根據訂單生成支付二維碼
> 選擇價格時就創建訂單,并根據其訂單信息生成支付信息,一并返回,一步到位沒有其他提交操作,直接就返回支付信息
> 優點:步驟少,快
>[tip] 缺點/缺陷:由于是直接生成了支付信息,所以無法像方案一和方案二那樣做數據過期校驗了,**總不能以收到支付回執時的信息為準來做數據校驗吧**,(通常以最后生成訂單的時刻為準來做數據校驗,方案二例外,是以最后生成支付信息時為準做數據校驗的),所以如果對過期數據有要求的話,就不能采用此方案。(支付信息也有支付有效期的參數,如果對數據過期不是特別苛刻,也可以用這個)
*****
~~~
預定類型,預定應該是預定成功的第一個訂單,如果不適用預鎖定方式的話,訂單類型不應該是創建時生成,這樣會導致多個預定類型的訂單
除非采用預加鎖的方式,而不是支付回執成功后才加鎖
預加鎖也不能解決這個問題,因為訂單是每次點擊提交都會生成的(同時生成支付信息)
只能在回執時寫入訂單類型了
這樣也還解決不了,別人開多個窗口提交支付,可以繞過系統對于預定次數的限制
所以不能每次點擊提交就同時生成訂單信息和支付信息,這樣不可控
只能獲取價格時生成訂單信息,點擊提交時才根據訂單信息生成支付信息,這樣就可以控制訂單狀態了,使得對于一個預定,同時只能存在一個有效的訂單,而又可以做到不限制用戶可以任意的創建訂單,這樣就從根源上解決了多訂單同時支付的混亂問題了
如果需要做成直接選擇價格后直接就能出來支付信息,而不需要多點擊一下,就可以做個假二維碼讓用戶點一下刷新,刷新時才是根據訂單生成支付信息
~~~
~~~
這樣也還是不能解決用戶同時打開多個支付二維碼支付的問題,只能回執時,檢測到訂單狀態 是關閉取消的狀態,就安排退款,還要檢測預定狀態是否正確
不能徹底解決這個問題,生成新訂單時關閉舊訂單,回執時處理,目前來看算是最合理最直觀的處理方案了
那現在就可以生成支付信息,沒必要再提交一次
不過現在生成支付信息也有個問題,那就是不能校驗舊數據了(這是個何時生成訂單,何時又根據訂單生成支付信息的問題)
如果再次提交時生成支付信息,我們就可以以最后生成支付信息的時候為準來校驗舊數據(其實支付接口也可以設置過期關閉參數)
每種方案都有它的好處和缺陷,具體視情況而定,如果不過分擔心舊數據的情況,可以通過超時關閉支付的來參數控制
如果對舊數據比較嚴格,時間比較精確實時的話,那么就采用最后生成支付信息的一刻校驗數據的方案
~~~
- 開始
- 公益
- 更好的使用看云
- 推薦書單
- 優秀資源整理
- 技術文章寫作規范
- SublimeText - 編碼利器
- PSR-0/PSR-4命名標準
- php的多進程實驗分析
- 高級PHP
- 進程
- 信號
- 事件
- IO模型
- 同步、異步
- socket
- Swoole
- PHP擴展
- Composer
- easyswoole
- php多線程
- 守護程序
- 文件鎖
- s-socket
- aphp
- 隊列&并發
- 隊列
- 講個故事
- 如何最大效率的問題
- 訪問式的web服務(一)
- 訪問式的web服務(二)
- 請求
- 瀏覽器訪問阻塞問題
- Swoole
- 你必須理解的計算機核心概念 - 碼農翻身
- CPU阿甘 - 碼農翻身
- 異步通知,那我要怎么通知你啊?
- 實時操作系統
- 深入實時 Linux
- Redis 實現隊列
- redis與隊列
- 定時-時鐘-阻塞
- 計算機的生命
- 多進程/多線程
- 進程通信
- 拜占庭將軍問題深入探討
- JAVA CAS原理深度分析
- 隊列的思考
- 走進并發的世界
- 鎖
- 事務筆記
- 并發問題帶來的后果
- 為什么說樂觀鎖是安全的
- 內存鎖與內存事務 - 劉小兵2014
- 加鎖還是不加鎖,這是一個問題 - 碼農翻身
- 編程世界的那把鎖 - 碼農翻身
- 如何保證萬無一失
- 傳統事務與柔性事務
- 大白話搞懂什么是同步/異步/阻塞/非阻塞
- redis實現鎖
- 淺談mysql事務
- PHP異常
- php錯誤
- 文件加載
- 路由與偽靜態
- URL模式之分析
- 字符串處理
- 正則表達式
- 數組合并與+
- 文件上傳
- 常用驗證與過濾
- 記錄
- 趣圖
- foreach需要注意的問題
- Discuz!筆記
- 程序設計思維
- 抽象與具體
- 配置
- 關于如何學習的思考
- 編程思維
- 談編程
- 如何安全的修改對象
- 臨時
- 臨時筆記
- 透過問題看本質
- 程序后門
- 邊界檢查
- session
- 安全
- 王垠
- 第三方數據接口
- 驗證碼問題
- 還是少不了虛擬機
- 程序員如何談戀愛
- 程序員為什么要一直改BUG,為什么不能一次性把代碼寫好?
- 碎碎念
- 算法
- 實用代碼
- 相對私密與絕對私密
- 學習目標
- 隨記
- 編程小知識
- foo
- 落盤
- URL編碼的思考
- 字符編碼
- Elasticsearch
- TCP-IP協議
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依賴注入
- 科目一
- 開發筆記
- 經緯度格式轉換
- php時區問題
- 解決本地開發時調用遠程AIP跨域問題
- 后期靜態綁定
- 談tp的跳轉提示頁面
- 無限分類問題
- 生成微縮圖
- MVC名詞
- MVC架構
- 也許模塊不是唯一的答案
- 哈希算法
- 開發后臺
- 軟件設計架構
- mysql表字段設計
- 上傳表如何設計
- 二開心得
- awesomes-tables
- 安全的代碼部署
- 微信開發筆記
- 賬戶授權相關
- 小程序獲取是否關注其公眾號
- 支付相關
- 提交訂單
- 微信支付筆記
- 支付接口筆記
- 支付中心開發
- 下單與支付
- 支付流程設計
- 訂單與支付設計
- 敏感操作驗證
- 排序設計
- 代碼的運行環境
- 搜索關鍵字的顯示處理
- 接口異步更新ip信息
- 圖片處理
- 項目搭建
- 閱讀文檔的新方式
- mysql_insert_id并發問題思考
- 行鎖注意事項
- 細節注意
- 如何處理用戶的輸入
- 不可見的字符
- 抽獎
- 時間處理
- 應用開發實戰
- python 學習記錄
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文檔相似度驗證
- thinkphp5.0數據庫與模型的研究
- workerman進程管理
- workerman網絡分析
- java學習記錄
- docker
- 筆記
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京東
- pc_detailpage_wareBusiness
- doc
- 電商網站設計
- iwebshop
- 商品規格分析
- 商品屬性分析
- tpshop
- 商品規格分析
- 商品屬性分析
- 電商表設計
- 設計記錄
- 優惠券
- 生成唯一訂單號
- 購物車技術
- 分類與類型
- 微信登錄與綁定
- 京東到家庫存系統架構設計
- crmeb
- 命名規范
- Nginx https配置
- 關于人工智能
- 從人的思考方式到二叉樹
- 架構
- 今日有感
- 文章保存
- 安全背后: 瀏覽器是如何校驗證書的
- 避不開的分布式事務
- devops自動化運維、部署、測試的最后一公里 —— ApiFox 云時代的接口管理工具
- 找到自己今生要做的事
- 自動化生活
- 開源與漿果
- Apifox: API 接口自動化測試指南