免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

五 SpringMvc - 支付寶沙箱和關(guān)鍵字過濾,md5加密,SSM項目重要知識點

1、支付寶沙箱1.1 jar包  alipay-sdk<!-- alipay-sdk --><dependency>    <groupId>com.alipay.sdk</groupId>    <artifactId>alipay-sdk-java</artifactId>    <version>4.10.90.ALL</version></dependency>1.2 信息配置類1.2.1 配置信息public class AlipayConfig { // 應(yīng)用ID,您的APPID,收款賬號既是您的APPID對應(yīng)支付寶賬號 public static String app_id = ""; // 商戶應(yīng)用私鑰,您的PKCS8格式RSA2私鑰 public static String merchant_private_key = ""; // 對應(yīng)APPID下的支付寶公鑰 。public static String alipay_public_key = ""; // 服務(wù)器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問 public static String notify_url = "http://localhost:8080(/項目名,沒有的不需要)/Alipay/notify_url.do"; // 頁面跳轉(zhuǎn)同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問 public static String return_url = "http://localhost:8080(/項目名,沒有的不需要)/Alipay/alipay_return.do"; // 簽名方式 public static String sign_type = "RSA2"; // 字符編碼格式 public static String charset = "UTF-8"; // 支付寶網(wǎng)關(guān) public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";}1.2.2配置信息來源登錄自己已經(jīng)入駐的支付寶賬號:https://open.alipay.com/develop/sandbox/app
1.2.2.1 APPID

五 SpringMvc - 支付寶沙箱和關(guān)鍵字過濾,md5加密,SSM項目重要知識點

文章插圖
1.2.2.2 公鑰,私鑰
五 SpringMvc - 支付寶沙箱和關(guān)鍵字過濾,md5加密,SSM項目重要知識點

文章插圖
1.3 支付控制層/** * 支付寶支付 */@Controller@RequestMapping("/Alipay")public class AlipayController {    /**     * 生成訂單直接跳轉(zhuǎn)支付寶付款     */    @RequestMapping("/to_alipay.do")    public void toAlipay(HttpServletResponse response, HttpServletRequest request) throws Exception{        AlipayClient alipayClient = new DefaultAlipayClient(                AlipayConfig.gatewayUrl, AlipayConfig.app_id,                AlipayConfig.merchant_private_key, "json", AlipayConfig.charset,                AlipayConfig.alipay_public_key, AlipayConfig.sign_type);        // 取購買人名稱        String in_name = request.getParameter("in_name");        // 取手機號        String in_phone = request.getParameter("in_phone");        // 創(chuàng)建唯一訂單號        int random = (int) (Math.random() * 10000);        String dateStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());        // 訂單號拼接規(guī)則:手機號后四位+當(dāng)前時間后四位+隨機數(shù)四位數(shù)        String out_trade_no = in_phone.substring(7) + dateStr.substring(10)                + random;        // 拼接訂單名稱        String subject = in_name + "的訂單";        // 取付款金額        String total_amount = request.getParameter("in_money");        // 設(shè)置請求參數(shù)        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();        alipayRequest.setReturnUrl(AlipayConfig.return_url);//支付成功響應(yīng)后跳轉(zhuǎn)地址        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//異步請求地址        /*FAST_INSTANT_TRADE_PAY 二維碼瞬時支付         * out_trade_no 訂單號 total_amount 訂單金額  subject 訂單名稱         */        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no                + "\"," + "\"total_amount\":\"" + total_amount + "\","                + "\"subject\":\"" + subject + "\"," + "\"body\":\""                + ""+ "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");        String result = "請求無響應(yīng)";        // 請求        try {            //通過阿里客戶端,發(fā)送支付頁面請求            result = alipayClient.pageExecute(alipayRequest).getBody();            response.setContentType("text/html;charset=UTF-8");            response.setCharacterEncoding("UTF-8");            response.getWriter().println(result);            response.getWriter().flush();        } catch (AlipayApiException e) {            e.printStackTrace();        } finally {            response.getWriter().close();        }    }    /**     * 支付成功后處理業(yè)務(wù)     */    @RequestMapping("/alipay_return.do")    public String alipayReturn(HttpServletRequest request, Map<String, Object> map) throws Exception{        // 響應(yīng)信息        String msg = "";        // 請在這里編寫您的程序(以下代碼僅作參考)        if (verifyAlipayReturn(request)) {//驗簽成功后執(zhí)行的自定義業(yè)務(wù)代碼            // 商戶訂單號            String out_trade_no = new String(request.getParameter(                    "out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            // 支付寶交易號            String trade_no = new String(request.getParameter("trade_no")                    .getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            // 付款金額            String total_amount = new String(request.getParameter(                    "total_amount").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            msg = "支付寶交易號:" + trade_no + "<br/>商戶訂單號"                    + out_trade_no + "<br/>付款金額:" + total_amount;        } else {            msg = "驗簽/支付失敗";        }        map.put("msg", msg);        return "forward:/success.jsp"; //支付完成后,跳轉(zhuǎn)的頁面    }    /**     * 支付寶異步通知     * @param request     * @param response     * @throws Exception     */    @RequestMapping("/notify_url.do")    public void alipayNotify(HttpServletRequest request,HttpServletResponse response)                                                throws Exception {        // ——請在這里編寫您的程序(以下代碼僅作參考)——        /*         * 實際驗證過程建議商戶務(wù)必添加以下校驗: 1、需要驗證該通知數(shù)據(jù)中的out_trade_no是否為商戶系統(tǒng)中創(chuàng)建的訂單號,         * 2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創(chuàng)建時的金額),         * 3、校驗通知中的seller_id(或者seller_email)         * 是否為out_trade_no這筆單據(jù)的對應(yīng)的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)         * 4、驗證app_id是否為該商戶本身 。         */        if (verifyAlipayReturn(request)) {// 驗證成功            // 商戶訂單號            String out_trade_no = new String(request.getParameter(                    "out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            System.out.println(out_trade_no);            // 支付寶交易號            String trade_no = new String(request.getParameter("trade_no")                    .getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            System.out.println(trade_no);            // 交易狀態(tài)            String trade_status = new String(request.getParameter(                    "trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            if (trade_status.equals("TRADE_FINISHED")) {                // 判斷該筆訂單是否在商戶網(wǎng)站中已經(jīng)做過處理                // 如果沒有做過處理,根據(jù)訂單號(out_trade_no)在商戶網(wǎng)站的訂單系統(tǒng)中查到該筆訂單的詳細(xì),并執(zhí)行商戶的業(yè)務(wù)程序                // 如果有做過處理,不執(zhí)行商戶的業(yè)務(wù)程序                // 注意:                // 退款日期超過可退款期限后(如三個月可退款),支付寶系統(tǒng)發(fā)送該交易狀態(tài)通知            } else if (trade_status.equals("TRADE_SUCCESS")) {                // 判斷該筆訂單是否在商戶網(wǎng)站中已經(jīng)做過處理                // 如果沒有做過處理,根據(jù)訂單號(out_trade_no)在商戶網(wǎng)站的訂單系統(tǒng)中查到該筆訂單的詳細(xì),并執(zhí)行商戶的業(yè)務(wù)程序                // 如果有做過處理,不執(zhí)行商戶的業(yè)務(wù)程序                // 注意:                // 付款完成后,支付寶系統(tǒng)發(fā)送該交易狀態(tài)通知            }        } else {// 驗證失敗            response.setContentType("text/html;charset=UTF-8");            response.setCharacterEncoding("UTF-8");            response.getWriter().println("驗簽/支付失?。?quot;);            response.getWriter().flush();            response.getWriter().close();            // 調(diào)試用,寫文本函數(shù)記錄程序運行情況是否正常            // String sWord = AlipaySignature.getSignCheckContentV1(params);            // AlipayConfig.logResult(sWord);        }    }    /**     * @author zhukang     * @date 2021-04-23     * @return     * @description 驗證支付寶的反饋信息     */    private boolean verifyAlipayReturn(HttpServletRequest request) throws UnsupportedEncodingException {        // 獲取支付寶回調(diào)反饋的信息        Map<String, String> params = new HashMap<>();        Map<String, String[]> requestParams = request.getParameterMap();        for (Iterator<String> iter = requestParams.keySet().iterator(); iter                .hasNext();) {            String name = iter.next();            String[] values = requestParams.get(name);            String valueStr = "";            for (int i = 0; i < values.length; i++) {                valueStr = (i == values.length - 1) ? valueStr + values[i]                        : valueStr + values[i] + ",";            }            // 亂碼解決,這段代碼在出現(xiàn)亂碼時使用            valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);            params.put(name, valueStr);        }        boolean signVerified = false;        try {// 調(diào)用SDK驗證簽名            signVerified = AlipaySignature.rsaCheckV1(params,                    AlipayConfig.alipay_public_key, AlipayConfig.charset,                    AlipayConfig.sign_type);        } catch (AlipayApiException e) {            e.printStackTrace();        }        return signVerified;    }}

經(jīng)驗總結(jié)擴(kuò)展閱讀