国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java后端支付大雜燴之sps.controller(支付請(qǐng)求入口,配置文件)(五)

Joyven / 2214人閱讀

摘要:重要的是學(xué)習(xí)過(guò)程,而不是結(jié)果。但,結(jié)果同樣重要,加油。。在這提一點(diǎn),由于網(wǎng)絡(luò)原因等異常情況支付平臺(tái)可能出現(xiàn)多次發(fā)送支付結(jié)果的情況,通知回調(diào)接口商戶要注意做好接口冪等,其余的不再多說(shuō)。

7、sps.controller.base,front. 說(shuō)明

如果有幸能看到,其實(shí)只為自己記錄,回頭復(fù)習(xí)用

1、本文項(xiàng)目來(lái)自Martin404,自己只是臨摹大佬的項(xiàng)目。

2、重要的是學(xué)習(xí)過(guò)程,而不是結(jié)果。但,結(jié)果同樣重要,加油。gogogo。

3、框架搭建就略過(guò)了。配置文件太多。遇到的時(shí)候貼出來(lái)。也收藏起來(lái),留著備用。

4、Gist、Insight.io for GitHub必備吧,劃詞翻譯不懂的單詞劃一劃。

5、代碼提交到這里了GitHub。根據(jù)提交記錄找自己想要的類庫(kù)。

6、只為自己整理,大概的過(guò)了一邊,在Service層哪里還需好好理解。。

目錄

2、core.dao,service,web(重點(diǎn)是接口的設(shè)計(jì))點(diǎn)這里

3、sps包~dto、enums、mq點(diǎn)這里

4、在Dao層定義了domian、mapper映射文件,想了解的可以去看看。有助于理解整個(gè)系統(tǒng)。點(diǎn)這里

5、pay.util.app。 pay.stratege,支付工具類,和支付策略點(diǎn)這里

6、sps.service及實(shí)現(xiàn)類(重點(diǎn))點(diǎn)這里

首先看下支付的一些相關(guān)知識(shí)點(diǎn)

(1)、支付方案:

(2)、支付流程:

一般流程說(shuō)明: 原作者

用戶在商戶網(wǎng)站選定商品并下單,在商戶支付頁(yè)面選擇對(duì)應(yīng)支付平臺(tái)圖標(biāo),進(jìn)行支付;

商戶按照文檔提交支付請(qǐng)求接口組織報(bào)文,向支付平臺(tái)發(fā)送支付請(qǐng)求;

如果是PC端,會(huì)跳轉(zhuǎn)到對(duì)應(yīng)支付平臺(tái)的支付頁(yè)面,如果是移動(dòng)端,會(huì)喚起對(duì)應(yīng)的支付工具,用戶在支付平臺(tái)輸入支付信息,提交支付;

支付平臺(tái)將支付結(jié)果通知商戶;

若支付成功,則支付平臺(tái)將交易結(jié)果異步發(fā)送給商戶;

商戶若未收到交易結(jié)果,則商戶按照文檔查詢接口向支付平臺(tái)發(fā)請(qǐng)求查詢?cè)摻灰祝源_定消費(fèi)交易的狀態(tài),支付平臺(tái)收到 查詢請(qǐng)求時(shí),將同步返回該筆消費(fèi)交易的交易結(jié)果;

商戶若收到交易結(jié)果,如果未向支付平臺(tái)反饋已收到交易結(jié)果,支付平臺(tái)會(huì)重復(fù)發(fā)送交易結(jié)果。

在這提一點(diǎn),由于網(wǎng)絡(luò)原因等異常情況支付平臺(tái)可能出現(xiàn)多次發(fā)送支付結(jié)果的情況,通知回調(diào)接口商戶要注意做好接口冪等,其余的不再多說(shuō)。

在線支付過(guò)程:

01)創(chuàng)建合法的商業(yè)購(gòu)物網(wǎng)站,且在易寶支付平臺(tái)申請(qǐng)成為商家,并提供商家銀行卡號(hào),等待審查

02)如果審查通過(guò),和易寶支付簽約,得向易寶支付一定的接口使用費(fèi)或每筆交易的手續(xù)費(fèi),通常是交易額的1%左右

03)付款后,易寶會(huì)給每個(gè)商家一個(gè)唯一的商家編號(hào),密鑰,和接口文檔和jar包

04)當(dāng)用戶請(qǐng)求來(lái)了,你得獲取客戶的相關(guān)信息,例如:訂單號(hào),金額,支付銀行等14個(gè)信息

注意:其中hmac是由客戶訂單信息和商家密鑰生成,通過(guò)易寶提供的工具包自動(dòng)生成

05)用表單的方式,以POST或GET請(qǐng)求,使用GBK或GB2312向易寶發(fā)出支付請(qǐng)求,請(qǐng)求中帶有14個(gè)參數(shù)

06)易寶如果驗(yàn)成功,即客戶發(fā)送過(guò)來(lái)的信息與易寶生成的信息相同的話,易寶認(rèn)為是合法用戶請(qǐng)求,否則非法用戶請(qǐng)求

注意:驗(yàn)證是否成功,主要通過(guò)hmac和密鑰作用

07)如果是合法用戶的支付請(qǐng)求的話,易寶再將請(qǐng)求轉(zhuǎn)發(fā)到客戶指定的銀行,例如:招商銀行

注意:易寶必須支持招商銀行在線支付

08)凡是轉(zhuǎn)賬,查詢,等等都由銀行后臺(tái)操作完成,是全封閉的,與易寶沒有任何關(guān)系,千萬(wàn)不要認(rèn)為是易寶在處理資金結(jié)算

09)銀行處理完畢后,將響應(yīng)結(jié)果轉(zhuǎn)發(fā)到易寶在線支付平臺(tái)

10)易寶在線支付經(jīng)過(guò)加工處理后,再將結(jié)果響應(yīng)到用戶指定的外網(wǎng)可以訪問的Servlet或Jsp頁(yè)面

11)商家網(wǎng)站可以用GET方式接收易寶的響應(yīng)數(shù)據(jù),經(jīng)過(guò)驗(yàn)證合法后,再將付款結(jié)果,顯示在用戶的瀏覽器

注意:驗(yàn)證是否成功,主要通過(guò)hmac和密鑰作用

首先來(lái)看BaseController

public class BaseController {

    private Logger logger = LoggerFactory.getLogger(BaseController.class);

    /**
     * 獲取用戶ID,用戶ID可能為NULL,需自行判斷
     */
    protected Long getUserId(HttpServletRequest request) {
        String sId = request.getHeader("userId");
        if (!StringUtil.isEmpty(sId)) {
            try {
                Long userId = Long.parseLong(sId);
                return userId;
            } catch (NumberFormatException e) {
                logger.warn("請(qǐng)求頭userId參數(shù)格式錯(cuò)誤:{}", sId);
            }
        }
        return null;
    }

    /**
     * 獲取用戶ID,當(dāng)userId為空的時(shí)候拋出異常
     */
    protected Long getNotNullUserId(HttpServletRequest request) throws BusinessException {
        Long userId = getUserId(request);
        if (userId == null) {
            throw new BusinessException("用戶ID不能為空");
        }
        return userId;
    }

    /**
     * 獲取請(qǐng)求來(lái)源類型
     */
    protected RequestFrom getRequestFrom(HttpServletRequest request) throws BusinessException {
        String from = request.getHeader("from");
        if (StringUtil.isEmpty(from)) {
            throw new BusinessException("請(qǐng)求頭錯(cuò)誤未包含來(lái)源字段");
        }
        try {
            int iFom = Integer.parseInt(from);
            return RequestFrom.getById(iFom);
        } catch (NumberFormatException e) {
            throw new BusinessException("請(qǐng)求頭來(lái)源字段類型錯(cuò)誤");
        }

    }

    /**
     * 獲取移動(dòng)端請(qǐng)求頭信息
     */
    protected MobileInfo getMobileInfo(HttpServletRequest request) throws BusinessException {
        String appVersion = request.getHeader("appVersion");
        String systemVersion = request.getHeader("appSystemVersion");
        String deviceId = request.getHeader("appDeviceId");
        Integer width = null;
        Integer height = null;
        int night = 0;
        try {
            width = Integer.parseInt(request.getHeader("appDeviceWidth"));
            height = Integer.parseInt(request.getHeader("appDeviceHeight"));
            if (request.getHeader("nightMode") != null) {
                night = Integer.parseInt(request.getHeader("nightMode"));
            }
        } catch (NumberFormatException e) {
            throw new BusinessException("移動(dòng)端請(qǐng)求頭不符合約定");
        }
        if (StringUtil.isEmpty(appVersion) || width == null || height == null) {
            throw new BusinessException("移動(dòng)端請(qǐng)求頭不符合約定");
        }
        return new MobileInfo(appVersion, systemVersion, deviceId, width, height, night != 0);
    }

}

控制層異常統(tǒng)一處理

/**
 * 控制層異常統(tǒng)一處理
 */
public class RestErrorHandler {
    private static Logger logger = LoggerFactory.getLogger(RestErrorHandler.class);

    @ExceptionHandler(BindException.class)
    @ResponseBody
    public AjaxResult handleBindException(BindException exception) {
        AjaxResult result = AjaxResult.getError(ResultCode.ParamException);
        Set errors = new HashSet();
        for (FieldError er : exception.getFieldErrors()) {
            errors.add(new ValidationError(er.getObjectName(), er.getField(), er.getDefaultMessage()));
        }
        result.setData(errors);
        logger.warn("參數(shù)綁定錯(cuò)誤:{}", exception.getObjectName());
        return result;
    }

    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public AjaxResult handleBusinessException(BusinessException exception) {
        AjaxResult result = AjaxResult.getError(ResultCode.BusinessException);
        result.setMessage(exception.getMessage());
        logger.warn("業(yè)務(wù)錯(cuò)誤:{}", exception.getMessage());
        return result;
    }

    @ExceptionHandler(SystemException.class)
    @ResponseBody
    public AjaxResult handleSystemException(SystemException exception) {
        AjaxResult result = AjaxResult.getError(ResultCode.SystemException);
        result.setMessage("系統(tǒng)錯(cuò)誤");
        logger.error("系統(tǒng)錯(cuò)誤:{}", exception);
        return result;
    }

    @ExceptionHandler(DBException.class)
    @ResponseBody
    public AjaxResult handleDBException(DBException exception) {
        AjaxResult result = AjaxResult.getError(ResultCode.DBException);
        result.setMessage("數(shù)據(jù)庫(kù)錯(cuò)誤");
        logger.error("數(shù)據(jù)庫(kù)錯(cuò)誤:{}", exception);
        return result;
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public AjaxResult handleException(Exception exception) {
        AjaxResult result = AjaxResult.getError(ResultCode.UnknownException);
        result.setMessage("服務(wù)器錯(cuò)誤");
        logger.error("服務(wù)器錯(cuò)誤:{}", exception);
        return result;
    }
}

支付通知入口:

/**
 * 支付通知入口
 * Created by Martin on 2016/7/01.
 */
@RequestMapping(value = "/open/payNotify")
public class PayNotifyController extends BaseController {

    private static Logger logger = LoggerFactory.getLogger(PayNotifyController.class);


    /**
     * 國(guó)內(nèi)支付寶app通知回調(diào)
     * @param request
     * @param response
     * @throws SystemException
     * @throws BusinessException
     */
    @RequestMapping(value = "/alipayNotifyMainApp", method = RequestMethod.POST)
    public void alipayNotifyMainApp(HttpServletRequest request, HttpServletResponse response) throws SystemException, BusinessException {
        alipayNotifyService.alipayNotifyMainApp(request, response);
    }
    /**
     * 國(guó)內(nèi)支付寶web通知回調(diào)
     * @param request
     * @param response
     * @throws SystemException
     * @throws BusinessException
     */
    @RequestMapping(value = "/alipayNotifyMain", method = RequestMethod.POST)
    public void alipayNotifyMain(HttpServletRequest request, HttpServletResponse response) throws SystemException, BusinessException {
        alipayNotifyService.alipayNotifyMain(request, response);
    }
    /**
     * 國(guó)際支付寶app通知回調(diào)
     * @param request
     * @param response
     * @throws SystemException
     * @throws BusinessException
     */
    @RequestMapping(value = "alipayNotifyGlobalApp", method = RequestMethod.POST)
    public void alipayNotifyGlobalApp(HttpServletRequest request, HttpServletResponse response) throws SystemException, BusinessException {
        alipayNotifyService.alipayNotifyGlobalApp(request, response);
    }
}

支付請(qǐng)求相關(guān)接口

/**
 * 支付請(qǐng)求相關(guān)接口
 */
@Controller
@RequestMapping("/app/payRequest")
public class PayRequestController extends BaseController {

    private static Logger logger = LoggerFactory.getLogger(PayRequestController.class);
    @Autowired
    private IPayRouteService payRouteService;

    /**
     * 組裝支付請(qǐng)求報(bào)文
     * @param payRequestParam
     * @return
     * @throws BusinessException
     * @throws SystemException
     */
    @ResponseBody
    @RequestMapping(value = "/getPayParams", method = RequestMethod.POST)
    public AjaxResult getPayParams(@RequestBody PayRequestParam payRequestParam) throws BusinessException, SystemException {
        return AjaxResult.getOK(payRouteService.getPayRetMap(payRequestParam));
    }

}

接下來(lái)在看看配置文件,支付相關(guān)的暫時(shí)省略,因?yàn)榘硾]有。

generatorConfig


    
    

       

    
        
        
        
        
        
        
        
        

        
        
        


        
            
        
        
        
        
        
        

        
        

        

        

    

數(shù)據(jù)庫(kù)配置:
#MySQL
mysql.jdbc.url=jdbc:mysql://127.0.0.1:3306/sps_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
mysql.jdbc.username=root
#連接數(shù)據(jù)庫(kù)的密碼.
mysql.jdbc.password=root
mysql.jdbc.initialSize=10
#連接池在空閑時(shí)刻保持的最大連接數(shù).
mysql.jdbc.minIdle=10
#連接池在同一時(shí)刻內(nèi)所提供的最大活動(dòng)連接數(shù)。
mysql.jdbc.maxActive=100
#當(dāng)發(fā)生異常時(shí)數(shù)據(jù)庫(kù)等待的最大毫秒數(shù) (當(dāng)沒有可用的連接時(shí)).
mysql.jdbc.maxWait=60000
mysql.jdbc.timeBetweenEvictionRunsMillis=60000
mysql.jdbc.minEvictableIdleTimeMillis=300000
mysql.jdbc.removeAbandonedTimeout=7200
mysql.jdbc.validationQuery=SELECT "x"
mysql.jdbc.testWhileIdle=true
mysql.jdbc.testOnBorrow=false
mysql.jdbc.testOnReturn=false
mysql.jdbc.filters=slf4j
mysql.jdbc.removeAbandoned=true
mysql.jdbc.logAbandoned=true

#Redis
redis.ip=127.0.0.1
redis.port=6379
redis.timeout=6000
#Redis-pool
redis.pool.maxTotal=10000
redis.pool.maxIdle=1000
redis.pool.testOnBorrow=true

#RabbitMQ
rabbitmq.master.ip=127.0.0.1
rabbitmq.master.port=5672
rabbitmq.master.username=guest
rabbitmq.master.password=guest

接著再看這幾個(gè)

 applicationContext:



    
        
        
    

    
        
            
                classpath:server_config.properties
                classpath:sys_config.properties
            
        
    

    
    

    
    
        
        
        
    

    
        
        
        
        
        
    
    
    
    

    
        
        
        
        
        
    

    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
        
            ${shiro.guest.username}
        
    

    
    
        
    
    
    
        
        
        
    

    
        
            
            
            
            
            
            
            
            
            
        
    

    
        
        
        
        
        
        
        
    

    
        
    
mybatis_config




    
        
    
    
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    


spring_mvc



    
    

    
    
        
    

    
    
        
        
        
    
    
    
        
        
    

    
        
    
    
    
        
    



spring_shiro



    
    
        
    
    
    
        
    
    
    
    
    
        
        
        
        
    

    
    
        
        
            
                
            
        
        
        
            
                /=anon
                /index.jsp=anon
                /app/**=stateless
            
        
    
    
    


Spring-rabbitmq



    

    
    
    

    
    
    
    
    
    
    
        
            
            
            
        
    
    
    
        
    
    
    
    
    


web.xml


    Pay Map Service
    
        webAppRootKey
        PayMap
    
    
    
        contextConfigLocation
        classpath:applicationContext.xml,classpath:spring_shiro.xml,classpath:spring_rabbitmq.xml
        
    

    
    
        MDCInsertingServletFilter
        
            ch.qos.logback.classic.helpers.MDCInsertingServletFilter
        
    
    
        MDCInsertingServletFilter
        /*
    

    
    
        shiroFilter
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        shiroFilter
        /*
    
    
    
    
        字符集過(guò)濾器
        encodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            字符集編碼
            encoding
            UTF-8
        
    
    
        encodingFilter
        /*
    

    
        DruidWebStatFilter
        com.alibaba.druid.support.http.WebStatFilter
        
            exclusions
            *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
        
    
    
        DruidWebStatFilter
        /*
    

    
        loggingFilter
        com.guo.core.web.system.filters.LoggingFilter
    

    
        loggingFilter
        /*
    

    
        spring監(jiān)聽器
        org.springframework.web.context.ContextLoaderListener
    
    
        Introspector緩存清除監(jiān)聽器
        org.springframework.web.util.IntrospectorCleanupListener
    
    
        request監(jiān)聽器
        org.springframework.web.context.request.RequestContextListener
    
                                     c
        系統(tǒng)初始化監(jiān)聽器
        com.guo.core.web.system.listener.InitListener
    
    
        default
        /static/*
    
    
        spring mvc servlet
        springMvc
        org.springframework.web.servlet.DispatcherServlet
        
            spring mvc 配置文件
            contextConfigLocation
            classpath:spring_mvc.xml
        
        1
    
    
        springMvc
        /
    
    
        DruidStatView
        com.alibaba.druid.support.http.StatViewServlet
    
    
        DruidStatView
        /druid/*
    

    
        HiddenHttpMethodFilter
        org.springframework.web.filter.HiddenHttpMethodFilter
    

    
        HiddenHttpMethodFilter
        springMvc
    

    
    
        30
    

    
        index.jsp
    

這只是簡(jiǎn)單的過(guò)來(lái)一遍,對(duì)大概的流程有個(gè)印象。需要配置文件的時(shí)候能找到。如果你有幸能看到這段話,那就好好加油吧。gogogo。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68662.html

相關(guān)文章

  • Java后端支付雜燴core.dao,service,web(重點(diǎn)是接口的設(shè)計(jì))(二)

    摘要:是一個(gè)使用語(yǔ)言集成三方支付的小,現(xiàn)已集成支付寶國(guó)內(nèi)國(guó)際移動(dòng)端端微信銀聯(lián)光大網(wǎng)關(guān)網(wǎng)頁(yè)郵政支付,采用的技術(shù)棧為。系統(tǒng)初始化監(jiān)聽器在系統(tǒng)啟動(dòng)時(shí)運(yùn)行進(jìn)行一些初始化工作加載銀聯(lián)配置文件緩存初始化忽略過(guò)濾器我們先看關(guān)于日志的,真心看不懂,后面有一大堆。 PayMap PayMap是一個(gè)使用Java語(yǔ)言集成三方支付的小Demo,現(xiàn)已集成支付寶(國(guó)內(nèi)、國(guó)際、移動(dòng)端、PC端)、微信、銀聯(lián)(ACP、UPO...

    sourcenode 評(píng)論0 收藏0
  • Java后端支付雜燴core.common、utils(異常,ID,日期,字符串等工具類)(一)

    摘要:但,結(jié)果同樣重要,加油。。而且可明確提出錯(cuò)誤信息。業(yè)務(wù)異常的自定義封裝類實(shí)現(xiàn)和一樣,為了空間就不展示了。數(shù)據(jù)庫(kù)異常在看兩個(gè)類,驗(yàn)證信息異常。那就是字符串工具類。字符串處理及轉(zhuǎn)換工具類,。 PayMap PayMap是一個(gè)使用Java語(yǔ)言集成三方支付的小Demo,現(xiàn)已集成支付寶(國(guó)內(nèi)、國(guó)際、移動(dòng)端、PC端)、微信、銀聯(lián)(ACP、UPOP)、光大(網(wǎng)關(guān)、網(wǎng)頁(yè))、郵政支付,采用的技術(shù)棧為:S...

    huayeluoliuhen 評(píng)論0 收藏0
  • Java 類文章 - 收藏集 - 掘金

    摘要:而調(diào)用后端服務(wù)就應(yīng)用了的高級(jí)特分布式配置管理平臺(tái)后端掘金輕量的分布式配置管理平臺(tái)。關(guān)于網(wǎng)絡(luò)深度解讀后端掘金什么是網(wǎng)絡(luò)呢總的來(lái)說(shuō),網(wǎng)絡(luò)中的容器們可以相互通信,網(wǎng)絡(luò)外的又訪問不了這些容器。 在 Java 路上,我看過(guò)的一些書、源碼和框架(持續(xù)更新) - 后端 - 掘金簡(jiǎn)書 占小狼轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!如果讀完覺得有收獲的話,歡迎點(diǎn)贊加關(guān)注 物有本末,事有終始,知所先后,則近道矣 ......

    RayKr 評(píng)論0 收藏0
  • 這次要是講不明白Spring Cloud核心組件,那我就白編這故事了

    摘要:我不聽,我就是這么命名。任何服務(wù)啟動(dòng)以后,都會(huì)把自己注冊(cè)到的注冊(cè)表中當(dāng)服務(wù)死亡的時(shí)候,也會(huì)通知。服務(wù)拿到結(jié)果后,會(huì)把結(jié)果緩存在本地的注冊(cè)表里。根據(jù)負(fù)載均衡策略,從注冊(cè)表中選擇一個(gè)真正的實(shí)例地址。 原創(chuàng):小姐姐味道(微信公眾號(hào)ID:xjjdog),歡迎分享,轉(zhuǎn)載請(qǐng)保留出處。 這幾天可真是熱啊,泡個(gè)海澡是再好不過(guò)了。玩的正起勁,突然腳底絆上一股暗流,然后我就一直在水里旋轉(zhuǎn)旋轉(zhuǎn)旋轉(zhuǎn)...終于...

    stdying 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<