Springboot整合支付寶支付功能
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)模式),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南
這篇文章主要為大家介紹了Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例
這篇文章主要介紹了Java多線程執(zhí)行處理業(yè)務(wù)時間太久解決方法代碼示例的相關(guān)資料,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12初識Java基礎(chǔ)之?dāng)?shù)據(jù)類型與運算符
Java是一種強類型語言,每個變量都必須聲明其數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)之?dāng)?shù)據(jù)類型與運算符的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-10-10Java Web中常用的分頁組件(Java端實現(xiàn))
本文通過使用場景分析給大家介紹了Java Web中常用的分頁組件(Java端實現(xiàn)),非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-05-05