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

資訊專欄INFORMATION COLUMN

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

Joyven / 2220人閱讀

摘要:重要的是學習過程,而不是結果。但,結果同樣重要,加油。。在這提一點,由于網絡原因等異常情況支付平臺可能出現多次發送支付結果的情況,通知回調接口商戶要注意做好接口冪等,其余的不再多說。

7、sps.controller.base,front. 說明

如果有幸能看到,其實只為自己記錄,回頭復習用

1、本文項目來自Martin404,自己只是臨摹大佬的項目。

2、重要的是學習過程,而不是結果。但,結果同樣重要,加油。gogogo。

3、框架搭建就略過了。配置文件太多。遇到的時候貼出來。也收藏起來,留著備用。

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

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

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

目錄

2、core.dao,service,web(重點是接口的設計)點這里

3、sps包~dto、enums、mq點這里

4、在Dao層定義了domian、mapper映射文件,想了解的可以去看看。有助于理解整個系統。點這里

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

6、sps.service及實現類(重點)點這里

首先看下支付的一些相關知識點

(1)、支付方案:

(2)、支付流程:

一般流程說明: 原作者

用戶在商戶網站選定商品并下單,在商戶支付頁面選擇對應支付平臺圖標,進行支付;

商戶按照文檔提交支付請求接口組織報文,向支付平臺發送支付請求;

如果是PC端,會跳轉到對應支付平臺的支付頁面,如果是移動端,會喚起對應的支付工具,用戶在支付平臺輸入支付信息,提交支付;

支付平臺將支付結果通知商戶;

若支付成功,則支付平臺將交易結果異步發送給商戶;

商戶若未收到交易結果,則商戶按照文檔查詢接口向支付平臺發請求查詢該交易,以確定消費交易的狀態,支付平臺收到 查詢請求時,將同步返回該筆消費交易的交易結果;

商戶若收到交易結果,如果未向支付平臺反饋已收到交易結果,支付平臺會重復發送交易結果。

在這提一點,由于網絡原因等異常情況支付平臺可能出現多次發送支付結果的情況,通知回調接口商戶要注意做好接口冪等,其余的不再多說。

在線支付過程:

01)創建合法的商業購物網站,且在易寶支付平臺申請成為商家,并提供商家銀行卡號,等待審查

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

03)付款后,易寶會給每個商家一個唯一的商家編號,密鑰,和接口文檔和jar包

04)當用戶請求來了,你得獲取客戶的相關信息,例如:訂單號,金額,支付銀行等14個信息

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

05)用表單的方式,以POST或GET請求,使用GBK或GB2312向易寶發出支付請求,請求中帶有14個參數

06)易寶如果驗成功,即客戶發送過來的信息與易寶生成的信息相同的話,易寶認為是合法用戶請求,否則非法用戶請求

注意:驗證是否成功,主要通過hmac和密鑰作用

07)如果是合法用戶的支付請求的話,易寶再將請求轉發到客戶指定的銀行,例如:招商銀行

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

08)凡是轉賬,查詢,等等都由銀行后臺操作完成,是全封閉的,與易寶沒有任何關系,千萬不要認為是易寶在處理資金結算

09)銀行處理完畢后,將響應結果轉發到易寶在線支付平臺

10)易寶在線支付經過加工處理后,再將結果響應到用戶指定的外網可以訪問的Servlet或Jsp頁面

11)商家網站可以用GET方式接收易寶的響應數據,經過驗證合法后,再將付款結果,顯示在用戶的瀏覽器

注意:驗證是否成功,主要通過hmac和密鑰作用

首先來看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("請求頭userId參數格式錯誤:{}", sId);
            }
        }
        return null;
    }

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

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

    }

    /**
     * 獲取移動端請求頭信息
     */
    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("移動端請求頭不符合約定");
        }
        if (StringUtil.isEmpty(appVersion) || width == null || height == null) {
            throw new BusinessException("移動端請求頭不符合約定");
        }
        return new MobileInfo(appVersion, systemVersion, deviceId, width, height, night != 0);
    }

}

控制層異常統一處理

/**
 * 控制層異常統一處理
 */
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("參數綁定錯誤:{}", 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("業務錯誤:{}", exception.getMessage());
        return result;
    }

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

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

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public AjaxResult handleException(Exception exception) {
        AjaxResult result = AjaxResult.getError(ResultCode.UnknownException);
        result.setMessage("服務器錯誤");
        logger.error("服務器錯誤:{}", 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);


    /**
     * 國內支付寶app通知回調
     * @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);
    }
    /**
     * 國內支付寶web通知回調
     * @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);
    }
    /**
     * 國際支付寶app通知回調
     * @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);
    }
}

支付請求相關接口

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

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

    /**
     * 組裝支付請求報文
     * @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));
    }

}

接下來在看看配置文件,支付相關的暫時省略,因為俺沒有。

generatorConfig


    
    

       

    
        
        
        
        
        
        
        
        

        
        
        


        
            
        
        
        
        
        
        

        
        

        

        

    

數據庫配置:
#MySQL
mysql.jdbc.url=jdbc:mysql://127.0.0.1:3306/sps_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
mysql.jdbc.username=root
#連接數據庫的密碼.
mysql.jdbc.password=root
mysql.jdbc.initialSize=10
#連接池在空閑時刻保持的最大連接數.
mysql.jdbc.minIdle=10
#連接池在同一時刻內所提供的最大活動連接數。
mysql.jdbc.maxActive=100
#當發生異常時數據庫等待的最大毫秒數 (當沒有可用的連接時).
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

接著再看這幾個

 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
        /*
    
    
    
    
        字符集過濾器
        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監聽器
        org.springframework.web.context.ContextLoaderListener
    
    
        Introspector緩存清除監聽器
        org.springframework.web.util.IntrospectorCleanupListener
    
    
        request監聽器
        org.springframework.web.context.request.RequestContextListener
    
                                     c
        系統初始化監聽器
        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
    

這只是簡單的過來一遍,對大概的流程有個印象。需要配置文件的時候能找到。如果你有幸能看到這段話,那就好好加油吧。gogogo。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68662.html

相關文章

  • Java后端支付雜燴core.dao,service,web(重點是接口的設計)(二)

    摘要:是一個使用語言集成三方支付的小,現已集成支付寶國內國際移動端端微信銀聯光大網關網頁郵政支付,采用的技術棧為。系統初始化監聽器在系統啟動時運行進行一些初始化工作加載銀聯配置文件緩存初始化忽略過濾器我們先看關于日志的,真心看不懂,后面有一大堆。 PayMap PayMap是一個使用Java語言集成三方支付的小Demo,現已集成支付寶(國內、國際、移動端、PC端)、微信、銀聯(ACP、UPO...

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

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

    huayeluoliuhen 評論0 收藏0
  • Java 類文章 - 收藏集 - 掘金

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

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

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

    stdying 評論0 收藏0

發表評論

0條評論

Joyven

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<