1. 程式人生 > >記一次通用支付設計

記一次通用支付設計

說明:此部落格旨在記錄一此通用性支付的設計想法,微信支付相關文件此處不進行介紹(微信支付api傳送門:https://pay.weixin.qq.com/wiki/doc/api/index.html),業務程式碼因為與公司機密相關所以此處不貼出,只貼出部分關鍵程式碼,常量部分因為命名較為規範所以不再貼出常量詳細資訊,且此部落格主要為介紹一種想法,所有程式碼進行截圖,不喜伸手黨,設計因為時間短所以較為粗糙,只為了之後更好的擴充套件跟重構預留部分擴充套件性和通用性,如果發現有問題或者不明白的地方想要探討歡迎留言,但是謝絕引戰者和伸手黨

最近公司需要對接微信小程式支付業務和微信公眾號支付業務,但是我所在產品組沒有對接過微信支付,而其他專案組也只有微信掃碼支付的對接經驗,所以不得不進行開荒工作。

微信除了掃碼外所有支付業務基本流程都是:

統一下單 -> 根據響應預訂單資訊調起支付頁面 -> 支付成功修改業務訂單為中間等待狀態,同時掛起查詢或使用者手動重新整理 -> 微信方呼叫回撥介面更改業務訂單狀態為已支付

這樣的邏輯很適合策略模式的使用,所以決定暫時的簡單設計一個通用支付介面,剝離變化將每個支付(不只是微信支付)的具體邏輯委任給具體策略。而業務訂單的建立、完成等邏輯與支付的型別無關,所以使用命令模式將業務訂單命令物件傳入策略中在需要的時候進行業務操作(這是因為業務呼叫方與通用支付資料庫公用所以沒有進行復雜設計而選擇命令模式對業務訂單進行操作,如果支付業務作為一個服務與業務隔離,則建議將業務相關的程式碼做成介面將介面資訊作為引數傳遞給通用支付進行回撥操作)。

使用設計機制:策略模式、命令模式、簡單工廠、模板方法模式(這幾個模式和機制都是設計模式中最常用而且最簡單的,此處不做說明,不清楚的可以查一下)

UML圖:

類圖:

類圖說明與程式碼:

Controller與service不做累述

AbstractPayStrategy:支付策略的超類

方法:

generateOrder:為預訂單生成方法

payOrderAgain:為生成業務訂單後再次呼叫支付時的支付方法

AbstractWeChatPayStrategy:微信支付的支付策略超類

方法:

generateOrder:父類的委託方法,同時也是策略的入口方法

generateAndSaveOrder:建立業務訂單的方法,此方法接受AbstractPayOrderCommand抽象命令物件的子類,根據選擇的支付業務執行不同的業務訂單建立命令

generateThirdPartyOrder:生成第三方預訂單方法

collectThirdPartyOrder:收集第三方介面需要的引數的方法

addThirdPartyExtraParams:鉤子方法,由子類重寫新增不同微信支付型別的特有引數的方法

invokeThirdParty:執行第三方支付的呼叫

convertResponseDataToViewData:將第三方支付響應資料轉化為DTO

convertDataToViewData:模板方法,由子類複寫將轉化後的DTO進行後處理

getTradeType:模板方法,獲取不同支付型別

WeChatJsApiPayStrategy:公眾號支付策略

WeChatMiniProgramPayStrategy:小程式支付策略

AbstractPayOrderCommand:業務訂單命令物件超類,用於根據不同的傳參選擇不同的支付業務

方法:

       generateAndSaveOrder:生成並儲存訂單

  

       finishOrder:回撥完成訂單

       payOrderAgain:再次支付訂單

PayStrategyFactory:生成支付策略的簡單工廠

PayOrderCommandFactory:生成訂單命令的簡單工廠

時序圖:

  1. 統一下單

  1. 支付成功回撥

微信支付文件有一些地方不明確甚至有一些問題,然後引數命名規範也沒有統一當時除錯遇到了很多坑,主要遇到的特別坑的地方說一下:

1、Jsapi型別的支付,openid寫的非必填但是說明裡又說必填

2、統一下單全部使用全小寫的命名格式,但是調起微信支付頁面的時候又要求駝峰規則

3、公眾號支付時如果你在調起支付的時候提示你“total_fee 不能為空“那麼恭喜你,很多統一下單的時候還有調起時候引數的問題都會報這個錯,實際上不一定是total_fee為空,把他當作引數錯誤改吧,走遠端debugger之類的看你統一下單時候的傳參有問題沒

4、他們文件裡說回撥時候給他們響應的格式是錯誤,反正我用他們說的格式怎麼都不行(成不成功的現象是他回撥你的次數,如果支付成功後進行回撥失敗微信方會試七次),我回調響應成功的方法是用響應流直接如下圖:

5、如果你看到他們有了H5支付認為這個H5支付是所有瀏覽器都可以使用的支付就大錯特錯了,這個H5支付是除了微信瀏覽器之外的手機端瀏覽器呼叫的支付,就是說微信瀏覽器不能用