重構(gòu)支付接口(一)支付接口存在的問題

一、現(xiàn)有支付接口存在什么問題

早期公司為了搶占市場快速迭代魄梯,遺留下來一屁股的技術(shù)債務(wù)桨螺,其中以支付寶、微信酿秸、平臺幣購買接口最為厲害灭翔,無數(shù)的價格計算、營銷活動(助力允扇、限時特價缠局、拼團则奥、優(yōu)惠券等等)、商品類型判斷代碼交織在一個接口中狭园,造成后期維護成本巨大读处,看不懂鲜戒、不敢改猎唁。

業(yè)務(wù)邏輯層偽代碼示意:
1.平臺幣下單

public void coinPay() {
    100行支付校驗代碼和一大堆if else
         
    200行營銷活動判斷代碼
    
    商品類型判斷,以及價格計算著摔,500行代碼
     
    創(chuàng)建訂單完成訂單50行代碼

    扣除平臺幣
    
    增加流水記錄
}

2.支付寶下單

public void aliPay() {
    100行支付校驗代碼和一大堆if else
         
    200行營銷活動判斷代碼
    
    商品類型判斷绎谦,以及價格計算管闷,500行代碼
     
    創(chuàng)建訂單40行代碼

    調(diào)用第三方支付sdk,得到預(yù)付單信息返回
}

3.微信下單
同支付寶下單窃肠,幾乎除了調(diào)用支付sdk代碼外都是復(fù)制粘貼包个。

支付完成回調(diào)接口也和下單接口一樣,以上代碼摻雜了五六種商品類型判斷和五六種活動類型判斷冤留,活動存在互斥和共存關(guān)系碧囊,如此復(fù)雜的邏輯全用if else堆砌,后期要上手維護時纤怒,代碼的畫風(fēng)是這樣的:

                // 正常購買
                boolean notPinActivity = "null".equals(pinTaskId);
                if (notPinActivity)
                {
                    if (goodsInfo.getType() == CommonConstants.PRODUCT_TOPIC) // 如果是專題糯而,則添加子課程的購買關(guān)系
                    {
                        saveTopicSubjects(productId, userId);
                    }
                    if (goodsInfo.getType() == CommonConstants.PRODUCT_SUBJECT
                        || goodsInfo.getType() == CommonConstants.PRODUCT_TOPIC) // 非問診訂單才添加購買關(guān)系
                    {
                        UserBuySubject userBuySubject = new UserBuySubject();
                        userBuySubject.setId(CommonUtil.getUuid());
                        userBuySubject.setUserId(userId);
                        userBuySubject.setSubjectId(productId);
                        userBuySubject.setCreateTime(new Date());
                        userBuySubject.save();
                    }
                    else if (goodsInfo.getType() == CommonConstants.PRODUCT_DIAGNOSIS)
                    {
                        Diagnosis diagnosis = Diagnosis.dao.findById(productId);
                        order.setServiceEndTime(
                            DateUtil.addSecond(new Date(), diagnosis.getDuration()));
                    }
                    else if (goodsInfo.getType() == CommonConstants.PRODUCT_VIP)
                    {
                        order = vipService.buyVip(order, userId, productId);
                        
                        //如果購買VIP時存在分銷人,則加入分銷邏輯,ibos定時退款6-12小時內(nèi)
                        if(StrKit.notBlank(fromUserId) && !fromUserId.equals("null"))
                        {
                            ActivitySellRecord sellRecord = new ActivitySellRecord();
                            ActivitySell sell = goodsInfoService.findActivitySell(productId);
                            //獲取設(shè)置的返利金額
                            //TODO  這里是用實際支付的金額的50% 返利泊窘,   如果用后臺設(shè)置的金額熄驼,需要考慮學(xué)農(nóng)幣購買的情況
                            /*int sellCommision = vipService.getSellCommision(productId, sell.getFee());*/
                            if(null != sell && CommonConstants.DEFAULT_STATUS_ENABLE == sell.getStatus())
                            {
                                sellRecord.setSellId(sell.getId());
                                sellRecord.setSellUser(fromUserId);
                                sellRecord.setBuyUser(userId);
                                sellRecord.setOrderId(order.getId());
                                sellRecord.setStatus(CommonConstants.FALSE);
//                                 以前的線下分銷計算規(guī)則
//                                int amount = Integer.parseInt(cash_fee) / 2;//固定50%
//                                sellRecord.setFee(amount < 100 ? 100 : amount);
                                
                                int amount = Integer.parseInt(cash_fee);
                                sellRecord.setFee(activityService.
                                        calcSellFee(amount, sell.getFeeType(), sell.getFee(), order.getPayType()));     
                                sellRecord.save();
                            }
                        }
                    }
                }
                // 拼團活動購買
                else
                {
                    log.info("拼團支付成功!進入拼團處理邏輯烘豹!userId:" + userId + ",pin_task_id:" + pinTaskId
                             + ",subject_id:" + productId);
                    int pinProductType = activityService.getPinProductTypeByGoodsType(goodsInfo.getType());
                    pinTaskId = activityService.pin(userId, pinTaskId, productId,
                        order.getOrderNo(), source, appletFormId, pinProductType);
                    order.setDesc(pinTaskId);
                }

以上畫風(fēng)代碼延綿五百行瓜贾。


以上代碼存在的幾個問題##:

1.可讀性差

主干邏輯不清晰,不看上個把小時不知道這幾百行代碼做了什么吴叶。

2.可擴展性差

新增一種商品或者活動阐虚,要全面修改代碼,不符合開閉原則蚌卤。

3.代碼冗余度高

同樣的代碼在每一種支付方式的接口都寫了一遍实束,修改的時候要修改三處。

二逊彭、我想要一個什么樣的支付接口

2.1 可讀性好

主干邏輯清晰咸灿,一目了然這個接口核心邏輯走了哪幾步,每一步分別做了什么侮叮。

2.2 可擴展性好

后期加入一個商品或者加入一個活動避矢,只需要新增代碼,不需要修改歷史代碼。

2.3 復(fù)用性強

公共代碼抽取出來审胸,各個支付接口復(fù)用這部分代碼亥宿,例如創(chuàng)建訂單、價格計算砂沛、營銷活動處理等烫扼。

三、重構(gòu)方案

打算采用簡單工廠碍庵、策略對不同商品映企、不同活動的下單邏輯進行解耦,獨立變化静浴。將營銷活動復(fù)雜的價格計算邏輯放到責任鏈中堰氓,支付接口代碼只需要組裝責任鏈調(diào)用就可得到最后的支付價格。

本篇先拋出目前支付接口遇到的問題苹享,下一篇博文描寫這種重構(gòu)思路的設(shè)計和實現(xiàn)双絮。

重構(gòu)支付接口(二)重構(gòu)方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市得问,隨后出現(xiàn)的幾起案子掷邦,更是在濱河造成了極大的恐慌,老刑警劉巖椭赋,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異或杠,居然都是意外死亡哪怔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門向抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來认境,“玉大人,你說我怎么就攤上這事挟鸠〔嫘牛” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵艘希,是天一觀的道長硼身。 經(jīng)常有香客問我,道長覆享,這世上最難降的妖魔是什么佳遂? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮撒顿,結(jié)果婚禮上丑罪,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好吩屹,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布跪另。 她就那樣靜靜地躺著,像睡著了一般煤搜。 火紅的嫁衣襯著肌膚如雪免绿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天宅楞,我揣著相機與錄音针姿,去河邊找鬼。 笑死厌衙,一個胖子當著我的面吹牛距淫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婶希,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼榕暇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喻杈?” 一聲冷哼從身側(cè)響起彤枢,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筒饰,沒想到半個月后缴啡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡瓷们,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年业栅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬晕。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡碘裕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攒钳,到底是詐尸還是另有隱情帮孔,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布不撑,位于F島的核電站文兢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏焕檬。R本人自食惡果不足惜禽作,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揩页。 院中可真熱鬧旷偿,春花似錦烹俗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茫负,卻和暖如春蕉鸳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忍法。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工潮尝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饿序。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓勉失,卻偏偏與公主長得像,于是被迫代替她去往敵國和親原探。 傳聞我的和親對象是個殘疾皇子乱凿,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容