最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)微信App支付服務(wù)端

 更新時間:2018年10月03日 08:37:48   作者:Andyzty  
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)微信App支付服務(wù)端,具有一定的參考價值,感興趣的小伙伴們可以參考一下

微信App支付服務(wù)端的實現(xiàn)方法,供大家參考,具體內(nèi)容如下

引言

主要實現(xiàn)app支付統(tǒng)一下單、異步通知、調(diào)起支付接口、支付訂單查詢、申請退款、查詢退款功能;封裝了https對發(fā)起退款的證書校驗、簽名、xml解析等。

支付流程

具體支付流程參考“微信APP”文檔,文檔地址

APP支付:APP端點擊下單—-服務(wù)端生成訂單,并調(diào)起“統(tǒng)一下單”,返回app支付所需參數(shù)—–APP端“調(diào)起支付接口“,發(fā)起支付—-微信服務(wù)器端調(diào)用服務(wù)端回調(diào)地址—–服務(wù)端按照“支付結(jié)果通知”,處理支付結(jié)果

app查詢:調(diào)起“查詢訂單”

APP退款:發(fā)起退款請求,調(diào)用“申請退款”,發(fā)起退款,需雙向證書驗證

APP退款查詢:調(diào)起“查詢退款”

支付代碼實現(xiàn)

代碼實現(xiàn)簽名、證書校驗、http和https封裝等,項目結(jié)構(gòu)如下:

支付代碼

包含支付、支付查詢、異步通知、退款申請、退款查詢

package org.andy.wxpay.controller;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.andy.wxpay.model.JsonResult;
import org.andy.wxpay.model.ResponseData;
import org.andy.wxpay.utils.CollectionUtil;
import org.andy.wxpay.utils.ConfigUtil;
import org.andy.wxpay.utils.FileUtil;
import org.andy.wxpay.utils.HttpUtils;
import org.andy.wxpay.utils.PayUtil;
import org.andy.wxpay.utils.SerializerFeatureUtil;
import org.andy.wxpay.utils.StringUtil;
import org.andy.wxpay.utils.WebUtil;
import org.andy.wxpay.utils.XmlUtil;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.alibaba.fastjson.JSON;

/**
 * 創(chuàng)建時間:2016年11月2日 下午4:16:32
 * 
 * @author andy
 * @version 2.2
 */
@Controller
@RequestMapping("/order")
public class PayController {

 private static final Logger LOG = Logger.getLogger(PayController.class);

 private static final String ORDER_PAY = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 統(tǒng)一下單

 private static final String ORDER_PAY_QUERY = "https://api.mch.weixin.qq.com/pay/orderquery"; // 支付訂單查詢

 private static final String ORDER_REFUND = "https://api.mch.weixin.qq.com/secapi/pay/refund"; // 申請退款

 private static final String ORDER_REFUND_QUERY = "https://api.mch.weixin.qq.com/pay/refundquery"; // 申請退款

 private static final String APP_ID = ConfigUtil.getProperty("wx.appid");

 private static final String MCH_ID = ConfigUtil.getProperty("wx.mchid");

 private static final String API_SECRET = ConfigUtil.getProperty("wx.api.secret");

 /**
 * 支付下訂單
 * 
 * @param request
 * @param response
 * @param cashnum
 * 支付金額
 * @param mercid
 * 商品id
 * @param callback
 */
 @RequestMapping(value = "/pay", method = RequestMethod.POST)
 public void orderPay(HttpServletRequest request, HttpServletResponse response,
 @RequestParam(required = false, defaultValue = "0") Double cashnum, String mercid, String callback) {
 LOG.info("[/order/pay]");
 if (!"001".equals(mercid)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "商品不存在", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 boolean flag = true; // 是否訂單創(chuàng)建成功
 try {
 String total_fee = BigDecimal.valueOf(cashnum).multiply(BigDecimal.valueOf(100))
 .setScale(0, BigDecimal.ROUND_HALF_UP).toString();
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("device_info", "WEB");
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("body", "測試付費");
 parm.put("attach", "Andy");
 parm.put("out_trade_no", PayUtil.getTradeNo());
 parm.put("total_fee", total_fee);
 parm.put("spbill_create_ip", PayUtil.getRemoteAddrIp(request));
 parm.put("notify_url", "https://www.andy.org/wxpay/order/pay/notify.shtml");
 parm.put("trade_type", "APP");
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 String restxml = HttpUtils.post(ORDER_PAY, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 Map<String, String> payMap = new HashMap<String, String>();
 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
 payMap.put("appid", APP_ID);
 payMap.put("partnerid", MCH_ID);
 payMap.put("prepayid", restmap.get("prepay_id"));
 payMap.put("package", "Sign=WXPay");
 payMap.put("noncestr", PayUtil.getNonceStr());
 payMap.put("timestamp", PayUtil.payTimestamp());
 try {
 payMap.put("sign", PayUtil.getSign(payMap, API_SECRET));
 } catch (Exception e) {
 flag = false;
 }
 }

 if (flag) {
 WebUtil.response(response,
 WebUtil.packJsonp(callback,
 JSON.toJSONString(new JsonResult(1, "訂單獲取成功", new ResponseData(null, payMap)),
  SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("訂單創(chuàng)建失敗:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "訂單獲取失敗", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }


 /**
 * 查詢支付結(jié)果
 * 
 * @param request
 * @param response
 * @param tradeid 微信交易訂單號
 * @param tradeno 商品訂單號
 * @param callback
 */
 @RequestMapping(value = "/pay/query", method = RequestMethod.POST)
 public void orderPayQuery(HttpServletRequest request, HttpServletResponse response, String tradeid, String tradeno,
 String callback) {
 LOG.info("[/order/pay/query]");
 if (StringUtil.isEmpty(tradeno) && StringUtil.isEmpty(tradeid)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "訂單號不能為空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 try {
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("transaction_id", tradeid);
 parm.put("out_trade_no", tradeno);
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 String restxml = HttpUtils.post(ORDER_PAY_QUERY, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
 // 訂單查詢成功 處理業(yè)務(wù)邏輯
 LOG.info("訂單查詢:訂單" + restmap.get("out_trade_no") + "支付成功");
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(1, "訂單支付成功", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("訂單支付失敗:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "訂單支付失敗", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }


 /**
 * 訂單支付微信服務(wù)器異步通知
 * 
 * @param request
 * @param response
 */
 @RequestMapping("/pay/notify")
 public void orderPayNotify(HttpServletRequest request, HttpServletResponse response) {
 LOG.info("[/order/pay/notify]");
 response.setCharacterEncoding("UTF-8");
 response.setContentType("text/xml");
 try {
 ServletInputStream in = request.getInputStream();
 String resxml = FileUtil.readInputStream2String(in);
 Map<String, String> restmap = XmlUtil.xmlParse(resxml);
 LOG.info("支付結(jié)果通知:" + restmap);
 if ("SUCCESS".equals(restmap.get("result_code"))) {
 // 訂單支付成功 業(yè)務(wù)處理
 String out_trade_no = restmap.get("out_trade_no"); // 商戶訂單號
 // 通過商戶訂單判斷是否該訂單已經(jīng)處理 如果處理跳過 如果未處理先校驗sign簽名 再進(jìn)行訂單業(yè)務(wù)相關(guān)的處理

 String sing = restmap.get("sign"); // 返回的簽名
 restmap.remove("sign");
 String signnow = PayUtil.getSign(restmap, API_SECRET);
 if (signnow.equals(sing)) {
 // 進(jìn)行業(yè)務(wù)處理
 LOG.info("訂單支付通知: 支付成功,訂單號" + out_trade_no);

 // 處理成功后相應(yīng)給響應(yīng)xml 
 Map<String, String> respMap = new HashMap<>();
 respMap = new HashMap<String, String>(); 
 respMap.put("return_code", "SUCCESS"); //相應(yīng)給微信服務(wù)器
 respMap.put("return_msg", "OK"); 
 String resXml = XmlUtil.xmlFormat(restmap, true); 
 response.getWriter().write(resXml); 
 } else {
 LOG.info("訂單支付通知:簽名錯誤");
 }
 } else {
 LOG.info("訂單支付通知:支付失敗," + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }
 }

 /**
 * 訂單退款 需要雙向證書驗證
 * 
 * @param request
 * @param response
 * @param tradeno 微信訂單號
 * @param orderno 商家訂單號
 * @param callback
 */
 @RequestMapping(value = "/pay/refund", method = RequestMethod.POST)
 public void orderPayRefund(HttpServletRequest request, HttpServletResponse response, String tradeno, String orderno,
 String callback) {
 LOG.info("[/pay/refund]");
 if (StringUtil.isEmpty(tradeno) && StringUtil.isEmpty(orderno)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "訂單號不能為空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 try {
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("transaction_id", tradeno); 
 parm.put("out_trade_no", orderno);//訂單號
 parm.put("out_refund_no", PayUtil.getRefundNo()); //退款單號
 parm.put("total_fee", "10"); // 訂單總金額 從業(yè)務(wù)邏輯獲取
 parm.put("refund_fee", "10"); // 退款金額
 parm.put("op_user_id", MCH_ID);
 parm.put("refund_account", "REFUND_SOURCE_RECHARGE_FUNDS");//退款方式
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 //String restxml = HttpUtils.posts(ORDER_REFUND, XmlUtil.xmlFormat(parm, false));
 String restxml = HttpUtils.posts(ORDER_REFUND, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 Map<String, String> refundMap = new HashMap<>();
 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
 refundMap.put("transaction_id", restmap.get("transaction_id"));
 refundMap.put("out_trade_no", restmap.get("out_trade_no"));
 refundMap.put("refund_id", restmap.get("refund_id"));
 refundMap.put("out_refund_no", restmap.get("out_refund_no"));
 LOG.info("訂單退款:訂單" + restmap.get("out_trade_no") + "退款成功,商戶退款單號" + restmap.get("out_refund_no") + ",微信退款單號"
 + restmap.get("refund_id"));
 WebUtil.response(response,
 WebUtil.packJsonp(callback,
 JSON.toJSONString(new JsonResult(1, "訂單獲取成功", new ResponseData(null, refundMap)),
  SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("訂單退款失?。? + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "訂單退款失敗", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }

 /**
 * 訂單退款查詢
 * @param request
 * @param response
 * @param tradeid 微信訂單號
 * @param tradeno 商戶訂單號
 * @param refundid 微信退款號
 * @param refundno 商家退款號
 * @param callback
 */
 @RequestMapping(value = "/pay/refund/query", method = RequestMethod.POST)
 public void orderPayRefundQuery(HttpServletRequest request, HttpServletResponse response, String refundid,
 String refundno, String tradeid, String tradeno, String callback) {
 LOG.info("[/pay/refund/query]");
 if (StringUtil.isEmpty(tradeid) && StringUtil.isEmpty(tradeno)
 && StringUtil.isEmpty(refundno) && StringUtil.isEmpty(refundid)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "退單號或訂單號不能為空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 try {
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("transaction_id", tradeid);
 parm.put("out_trade_no", tradeno);
 parm.put("refund_id", refundid);
 parm.put("out_refund_no", refundno);
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 String restxml = HttpUtils.post(ORDER_REFUND_QUERY, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 Map<String, String> refundMap = new HashMap<>();
 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code")) && "SUCCESS".equals(restmap.get("result_code"))) {
 // 訂單退款查詢成功 處理業(yè)務(wù)邏輯
 LOG.info("退款訂單查詢:訂單" + restmap.get("out_trade_no") + "退款成功,退款狀態(tài)"+ restmap.get("refund_status_0"));
 refundMap.put("transaction_id", restmap.get("transaction_id"));
 refundMap.put("out_trade_no", restmap.get("out_trade_no"));
 refundMap.put("refund_id", restmap.get("refund_id_0"));
 refundMap.put("refund_no", restmap.get("out_refund_no_0"));
 refundMap.put("refund_status", restmap.get("refund_status_0"));
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(1, "訂單退款成功", new ResponseData(null, refundMap)), SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("訂單退款失?。? + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "訂單退款失敗", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }

}

微信支付接口參數(shù)含義具體參考微信APP支付文檔。

微信支付工具類

包含簽名、訂單號、退單號、隨機(jī)串、服務(wù)器ip地址、客戶端ip地址等方法。

package org.andy.wxpay.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

/**
 * 創(chuàng)建時間:2016年11月2日 下午7:12:44
 * 
 * @author andy
 * @version 2.2
 */

public class PayUtil {

 /**
 * 生成訂單號
 * 
 * @return
 */
 public static String getTradeNo() {
 // 自增8位數(shù) 00000001
 return "TNO" + DatetimeUtil.formatDate(new Date(), DatetimeUtil.TIME_STAMP_PATTERN) + "00000001";
 }

 /**
 * 退款單號
 * 
 * @return
 */
 public static String getRefundNo() {
 // 自增8位數(shù) 00000001
 return "RNO" + DatetimeUtil.formatDate(new Date(), DatetimeUtil.TIME_STAMP_PATTERN) + "00000001";
 }

 /**
 * 退款單號
 * 
 * @return
 */
 public static String getTransferNo() {
 // 自增8位數(shù) 00000001
 return "TNO" + DatetimeUtil.formatDate(new Date(), DatetimeUtil.TIME_STAMP_PATTERN) + "00000001";
 }

 /**
 * 返回客戶端ip
 * 
 * @param request
 * @return
 */
 public static String getRemoteAddrIp(HttpServletRequest request) {
 String ip = request.getHeader("X-Forwarded-For");
 if (StringUtil.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
 // 多次反向代理后會有多個ip值,第一個ip才是真實ip
 int index = ip.indexOf(",");
 if (index != -1) {
 return ip.substring(0, index);
 } else {
 return ip;
 }
 }
 ip = request.getHeader("X-Real-IP");
 if (StringUtil.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
 return ip;
 }
 return request.getRemoteAddr();
 }

 /**
 * 獲取服務(wù)器的ip地址
 * 
 * @param request
 * @return
 */
 public static String getLocalIp(HttpServletRequest request) {
 return request.getLocalAddr();
 }

 public static String getSign(Map<String, String> params, String paternerKey) throws UnsupportedEncodingException {
 return MD5Utils.getMD5(createSign(params, false) + "&key=" + paternerKey).toUpperCase();
 }

 /**
 * 構(gòu)造簽名
 * 
 * @param params
 * @param encode
 * @return
 * @throws UnsupportedEncodingException
 */
 public static String createSign(Map<String, String> params, boolean encode) throws UnsupportedEncodingException {
 Set<String> keysSet = params.keySet();
 Object[] keys = keysSet.toArray();
 Arrays.sort(keys);
 StringBuffer temp = new StringBuffer();
 boolean first = true;
 for (Object key : keys) {
 if (key == null || StringUtil.isEmpty(params.get(key))) // 參數(shù)為空不參與簽名
 continue;
 if (first) {
 first = false;
 } else {
 temp.append("&");
 }
 temp.append(key).append("=");
 Object value = params.get(key);
 String valueStr = "";
 if (null != value) {
 valueStr = value.toString();
 }
 if (encode) {
 temp.append(URLEncoder.encode(valueStr, "UTF-8"));
 } else {
 temp.append(valueStr);
 }
 }
 return temp.toString();
 }

 /**
 * 創(chuàng)建支付隨機(jī)字符串
 * @return
 */
 public static String getNonceStr(){
 return RandomUtil.randomString(RandomUtil.LETTER_NUMBER_CHAR, 32);
 }

 /**
 * 支付時間戳
 * @return
 */
 public static String payTimestamp() {
 return Long.toString(System.currentTimeMillis() / 1000);
 }
}

其他所需工具類參考項目源碼

支付結(jié)果

APP支付測試完成

源代碼地址:微信APP支付

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java如何通過裝飾器模式擴(kuò)展系統(tǒng)功能

    詳解Java如何通過裝飾器模式擴(kuò)展系統(tǒng)功能

    這篇文章主要為大家詳細(xì)介紹了Java如何通過裝飾器模式擴(kuò)展系統(tǒng)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • SpringBoot整合freemarker的講解

    SpringBoot整合freemarker的講解

    今天小編就為大家分享一篇關(guān)于SpringBoot整合freemarker的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java Hashtable機(jī)制深入了解

    Java Hashtable機(jī)制深入了解

    HashTable是jdk 1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會在面試中經(jīng)常被問到。本文就來帶大家一起深入了解一下Hashtable,需要的可以參考一下
    2022-09-09
  • Java設(shè)計模式之觀察者模式observer?pattern詳解

    Java設(shè)計模式之觀察者模式observer?pattern詳解

    這篇文章主要介紹了Java設(shè)計模式之觀察者模式observer?pattern詳解,當(dāng)一個對象發(fā)生數(shù)據(jù)變化時,通知其他相關(guān)的一系列對象,接受到通知的對象根據(jù)該對象的變化進(jìn)行相應(yīng)處理以響應(yīng)變化的過程,需要的朋友可以參考下
    2023-12-12
  • java如何獲取系統(tǒng)CPU、內(nèi)存占用

    java如何獲取系統(tǒng)CPU、內(nèi)存占用

    這篇文章主要介紹了java如何獲取系統(tǒng)CPU、內(nèi)存占用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot項目的漏洞修復(fù)經(jīng)驗分享

    SpringBoot項目的漏洞修復(fù)經(jīng)驗分享

    在局域網(wǎng)環(huán)境下,由于無法連接外網(wǎng)下載Maven包,常見解決方案是在外網(wǎng)環(huán)境搭建相同的開發(fā)環(huán)境以便更新Maven包,本次漏洞掃描包括Tomcat、jackson-databind、fastjson、logback等組件,通常解決方法是升級到更高版本
    2024-10-10
  • 使用SpringBoot注解方式處理事務(wù)回滾實現(xiàn)

    使用SpringBoot注解方式處理事務(wù)回滾實現(xiàn)

    這篇文章主要介紹了使用SpringBoot注解方式處理事務(wù)回滾實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java實現(xiàn)二分查找的變種

    Java實現(xiàn)二分查找的變種

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)二分查找的變種,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • springboot 接口返回字符串帶引號的問題解決

    springboot 接口返回字符串帶引號的問題解決

    本文主要介紹了springboot 接口返回字符串帶引號的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot項目配置明文密碼泄露問題的處理方式

    SpringBoot項目配置明文密碼泄露問題的處理方式

    這篇文章主要介紹了SpringBoot項目配置明文密碼泄露問題的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

沈阳市| 萝北县| 神池县| 宜都市| 洞口县| 来宾市| 西贡区| 丰镇市| 乌拉特前旗| 九台市| 梅州市| 盐源县| 花莲市| 彰化县| 芜湖县| 义乌市| 鹤岗市| 农安县| 缙云县| 沂南县| 乌拉特前旗| 浦北县| 光泽县| 商都县| 元阳县| 中方县| 云霄县| 五峰| 云阳县| 邹平县| 乌鲁木齐县| 石渠县| 岳西县| 镇原县| 抚州市| 比如县| 松原市| 公安县| 古蔺县| 永丰县| 化州市|