欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot整合支付寶支付功能

 更新時間:2022年01月12日 11:56:14   作者:亞利桑那的天空  
這篇文章主要介紹了Springboot整合支付寶支付功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1.需要的Maven依賴

// 支付寶
<dependency>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-sdk-java</artifactId>
   <version>4.8.73.ALL</version>
</dependency>

2.controller層

/**
 * 統(tǒng)一下單接口
 * @param orderNo 訂單號
 * @param request
 * @return
 */
@PostMapping("/unifiedOrder")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public ResultMap unifiedOrder(@RequestParam("orderNo") String orderNo,@RequestParam("payType") Integer payType,
                              HttpServletRequest request){
    try {
        // 1、驗證訂單是否存在
        // 2、開始微信支付統(tǒng)一下單
        Orders orders = ordersService.FindOrder(orderNo);
        ResultMap resultMap =null;
        if(orders!=null){
           if(payType==1){
               String spbill_create_ip = getIpAddr(request);
               resultMap = wxPayService.unifiedOrder(orders.getOrderNo(),orders.getTotalPrice(),"云App",spbill_create_ip);
               Hotel hotel= hotelMapper.selHotelById(orders.getHId());
               Note note=new Note();
               String s=note.Notefs(hotel.getPhone(),1);
               ordersService.updataorderpaytype(orders.getOrderNo(),payType);
           return resultMap;
           }else if(payType==2){
                // 2、創(chuàng)建支付寶訂單
                String orderStr = alipayService.createOrder(orders.getOrderNo(), orders.getTotalPrice(),"App");
               ordersService.updataorderpaytype(orders.getOrderNo(),payType);
                return ResultMap.ok().put("data",orderStr);
           }
        }
      return resultMap;//系統(tǒng)通用的返回結(jié)果集
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
        return ResultMap.error("服務(wù)器異常,付款失敗");
    }


}

//這是支付寶異步回調(diào)函數(shù)
/**
 * 支付異步通知
 * 接收到異步通知并驗簽通過后,一定要檢查通知內(nèi)容,
 * 包括通知中的app_id、out_trade_no、total_amount是否與請求中的一致,并根據(jù)trade_status進行后續(xù)業(yè)務(wù)處理。
 * https://docs.open.alipay.com/194/103296
 */
@PostMapping("/notify")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public String notify(HttpServletRequest request, HttpSession session) {
  // 調(diào)用service層rsaCheckV1驗證簽名
    boolean flag = alipayService.rsaCheckV1(request);
    if (flag) {
         String tradeStatus = request.getParameter("trade_status"); // 交易狀態(tài)
        String outTradeNo = request.getParameter("out_trade_no"); // 商戶訂單號
        String tradeNo = request.getParameter("trade_no"); // 支付寶訂單號
        /**
         * 還可以從request中獲取更多有用的參數(shù),自己嘗試
         */
         //調(diào)用service層notify函數(shù)
        boolean notify = alipayService.notify(tradeStatus, outTradeNo, tradeNo);
        if(notify){
            return "success";
        }
    }
    return "fail";
}

3.service層

private String publicKey="公鑰";
    @Override
    public String createOrder(String orderNo, double amount, String body) throws AlipayApiException {
        //SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)。以下方法為sdk的model入?yún)⒎绞?model和biz_content同時存在的情況下取biz_content)。
    //構(gòu)造client
        //構(gòu)造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
    //設(shè)置網(wǎng)關(guān)地址https://openapi.alipay.com/gateway.do
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//設(shè)置應(yīng)用Id
        certAlipayRequest.setAppId("appid");
//設(shè)置應(yīng)用私鑰
        certAlipayRequest.setPrivateKey("應(yīng)用私鑰");
        certAlipayRequest.setFormat("json");
//設(shè)置字符集
        certAlipayRequest.setCharset("UTF-8");
//設(shè)置簽名類型
        certAlipayRequest.setSignType("RSA2");
//設(shè)置應(yīng)用公鑰證書路徑
        certAlipayRequest.setCertPath("證書驗證的應(yīng)用公鑰證書路徑");
//設(shè)置支付寶公鑰證書路徑
        certAlipayRequest.setAlipayPublicCertPath("證書驗證的支付寶公鑰證書路徑");
//設(shè)置支付寶根證書路徑
        certAlipayRequest.setRootCertPath("證書驗證的支付寶根證書路徑");
//構(gòu)造client
        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//實例化具體API對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)。以下方法為sdk的model入?yún)⒎绞?model和biz_content同時存在的情況下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setSubject(body);
        model.setOutTradeNo(orderNo);
        model.setTotalAmount(String.valueOf(amount));
        model.setTimeoutExpress("30m");
        /*model.setTotalAmount("0.01");*/
        model.setProductCode("QUICK_MSECURITY_PAY");
       /* model.setPassbackParams("公用回傳參數(shù),如果請求時傳遞了該參數(shù),則返回給商戶時會回傳該參數(shù)");*/
        //實例化具體API對應(yīng)的request類,類名稱和接口名稱對應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay
        AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
        ali_request.setBizModel(model);
        ali_request.setNotifyUrl("回調(diào)地址");// 回調(diào)地址
        AlipayTradeAppPayResponse ali_response = alipayClient.sdkExecute(ali_request);
        //就是orderString 可以直接給客戶端請求,無需再做處理。
        return ali_response.getBody();
    }
//支付寶簽名驗證
    @Override
    public boolean rsaCheckV1(HttpServletRequest request){
        try {
            //獲取支付寶POST過來反饋信息
            Map<String,String> params = new HashMap<String,String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
                String name = (String) iter.next();
                String[] values = (String[]) 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("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
//切記alipaypublickey是支付寶的公鑰,請去open.alipay.com對應(yīng)應(yīng)用下查看。
//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
            boolean flag = AlipaySignature.rsaCertCheckV1(params, publicKey, alipayConfig.getCharset(),"RSA2");
         /* 千萬不要調(diào)用錯了?。。∩厦娴牟攀亲C書驗證調(diào)用的函數(shù)這個是普通驗證調(diào)用函數(shù)  boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, alipayConfig.getCharset(), alipayConfig.getSignType());*/
            System.out.println("flag-----------"+flag);
            return flag;
        }catch (AlipayApiException e) {
            logger.debug("verify sigin error, exception is:{}",e);
            return false;
        }
    }
//notify()支付成功或者失敗后一系列操作
@Override
public boolean notify(String tradeStatus, String orderNo, String tradeNo) {
    if ("TRADE_FINISHED".equals(tradeStatus)
            || "TRADE_SUCCESS".equals(tradeStatus)) {
        Orders orders =ordersMapper.FindOrder(orderNo);
        // 支付成功,根據(jù)業(yè)務(wù)邏輯修改相應(yīng)數(shù)據(jù)的狀態(tài)
        int state =ordersMapper.updateOrder(DateUtil.now(),orderNo);
       Hotel hotel= hotelMapper.selHotelById(orders.getHId());
        Note note=new Note();
        String s=note.Notefs(hotel.getPhone(),1);
        // boolean state = orderPaymentService.updatePaymentState(orderNo, tradeNo);
        if (state!=0) {
            return true;
        }else {
         UMember m= memberMapper.selMemByOrderNo(orderNo);
         Boolean b= userMapper.updateVip(m.getOpenId(),2);
        }
    }
    //支付失敗查詢訂單詳情得到用戶id
    Orders orders=ordersMapper.FindOrder(orderNo);
    //將扣除的積分返還
    if(orderNo!=null){
        //添加用戶積分
        ordersMapper.RefundIntegral(orders.getOpenId(),orders.getIntegral());
        /*//添加退回積分記錄
        ordersMapper.insIntegralRecord(orders.getOpenId(),orders.getIntegral(),1,2);*/
    }
    return false;
}

哈哈,以上僅為基礎(chǔ)版證書驗證支付寶支付的源碼,有很大的優(yōu)化空間,需要小伙伴自己去優(yōu)化了!

到此這篇關(guān)于Springboot整合支付寶支付功能的文章就介紹到這了,更多相關(guān)Springboot支付寶支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的有限狀態(tài)機(設(shè)計模式——狀態(tài)模式)

    Java中的有限狀態(tài)機(設(shè)計模式——狀態(tài)模式)

    這篇文章主要介紹了Java中的有限狀態(tài)機(設(shè)計模式——狀態(tài)模式),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南

    Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南

    這篇文章主要為大家介紹了Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 淺談單例模式和線程安全問題

    淺談單例模式和線程安全問題

    這篇文章主要介紹了淺談單例模式和線程安全問題,再某些特殊的情況下,存在一個類僅能用來產(chǎn)生一個唯一對象的必要性,因此需要單例模式,需要的朋友可以參考下
    2023-04-04
  • Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例

    Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例

    這篇文章主要介紹了Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例的相關(guān)資料,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 通過實例解析java8中的parallelStream

    通過實例解析java8中的parallelStream

    這篇文章主要介紹了通過實例解析java8中的parallelStream,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 初識Java基礎(chǔ)之?dāng)?shù)據(jù)類型與運算符

    初識Java基礎(chǔ)之?dāng)?shù)據(jù)類型與運算符

    Java是一種強類型語言,每個變量都必須聲明其數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)之?dāng)?shù)據(jù)類型與運算符的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • 淺析Java 9 Optional API 新增方法

    淺析Java 9 Optional API 新增方法

    本文我們介紹了Java 9 Optional Api新增的三個方法。or方法在Optional為空時返回Optional對象。 ifPresentOrElse()在值存在時執(zhí)行Consumer參數(shù),反之執(zhí)行另一個參數(shù)回調(diào)參數(shù)。感興趣的朋友跟隨小編一起看看吧
    2019-12-12
  • Java split 分隔空值無法得到的解決方式

    Java split 分隔空值無法得到的解決方式

    這篇文章主要介紹了Java split 分隔空值無法得到的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java Web中常用的分頁組件(Java端實現(xiàn))

    Java Web中常用的分頁組件(Java端實現(xiàn))

    本文通過使用場景分析給大家介紹了Java Web中常用的分頁組件(Java端實現(xiàn)),非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-05-05
  • Java多線程的原子性,可見性,有序性你都了解嗎

    Java多線程的原子性,可見性,有序性你都了解嗎

    這篇文章主要為大家詳細介紹了Java多線程的原子性,可見性,有序性,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論