微信扫码支付和H5支付,开箱即用
支付步骤
1获取微信签名
2发起支付
3处理回调
支付所需工具类
package com.zjy.xzlive.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.jdom.Element;
import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.*;
public class WXAllUitls {
public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
*/
public static String createSign(String characterEncoding, SortedMap<String, Object> parameters, String apiKey) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + apiKey);
System.out.println(sb.toString());
String sign = MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
public static String getRequestXml(SortedMap<String, Object> parameters) {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
if ("attach".equalsIgnoreCase(key) || "body".equalsIgnoreCase(key) || "sign".equalsIgnoreCase(key)) {
sb.append("<" + key + ">" + "<![CDATA[" + value + "]]></" + key + ">");
} else {
sb.append("<" + key + ">" + value + "</" + key + ">");
}
}
sb.append("</xml>");
return sb.toString();
}
public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
//请求方法
public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
try {
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
return buffer.toString();
} catch (ConnectException ce) {
System.out.println("连接超时:{}" + ce);
} catch (Exception e) {
System.out.println("https请求异常:{}" + e);
}
return null;
}
//随机字符串生成
public static String getRandomString(int length) { //length表示生成字符串的长度
String base = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
public static Map doXMLParse(String strxml) throws Exception {
strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
if (null == strxml || "".equals(strxml)) {
return null;
}
Map m = new HashMap();
InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while (it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = "";
List children = e.getChildren();
if (children.isEmpty()) {
v = e.getTextNormalize();
} else {
v = getChildrenText(children);
}
m.put(k, v);
}
//关闭流
in.close();
return m;
}
public static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if (!children.isEmpty()) {
Iterator it = children.iterator();
while (it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append("<" + name + ">");
if (!list.isEmpty()) {
sb.append(getChildrenText(list));
}
sb.append(value);
sb.append("</" + name + ">");
}
}
return sb.toString();
}
/**
* XML格式字符串转换为Map
*
* @param strXML XML字符串
* @return XML数据转换后的Map
* @throws Exception
*/
public static Map<String, String> xmlToMap(String strXML) throws Exception {
Map<String, String> data = new HashMap<String, String>();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
org.w3c.dom.Document doc = documentBuilder.parse(stream);
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getDocumentElement().getChildNodes();
for (int idx=0; idx<nodeList.getLength(); ++idx) {
Node node = nodeList.item(idx);
if (node.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element element = (org.w3c.dom.Element) node;
data.put(element.getNodeName(), element.getTextContent());
}
}
try {
stream.close();
}
catch (Exception ex) {
}
return data;
}
public static String generateString(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(allChar.charAt(random.nextInt(allChar.length())));
}
return sb.toString();
}
public static JSONObject httpsRequestALiYun(String url){
URL uri = null;
JSONObject result = null;
try {
uri = new URL(url);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String lines = "";
while ((lines = reader.readLine()) != null) {
result = JSON.parseObject(lines);
}
reader.close();
conn.disconnect();
}catch (Exception e){
e.printStackTrace();
}
return result;
}
public static String querySjNum(){
String a = "0123456789abcdefghijklmnopqrstuvwxyz";
String sjNumber="";
char[] rands = new char[32];
for (int i = 0; i < rands.length; i++)
{
int rand = (int) (Math.random() * a.length());
rands[i] = a.charAt(rand);
}
for(int i=0;i<rands.length;i++){
sjNumber += rands[i];
}
return sjNumber;
}
}
微信扫码支付和H5的签名
//获取微信sign--H5支付
public String querySignH5(PayWechat payWechat,String price,String ip,String WXNonceStr,String WXOutTradeNo){
String sign = "";
SortedMap<String, Object> mapSign = new TreeMap<>();
mapSign.put("appid", payWechat.getAppid());
mapSign.put("mch_id", payWechat.getMchId());
mapSign.put("nonce_str", WXNonceStr);
mapSign.put("body", WXBody);
mapSign.put("out_trade_no", WXOutTradeNo);
mapSign.put("total_fee", price);
mapSign.put("spbill_create_ip", ip);
mapSign.put("notify_url", WXNotifyUrl);
mapSign.put("trade_type", trade_type_H5);
sign = WXAllUitls.createSign("UTF-8", mapSign, payWechat.getApiKey());
return sign;
}
//获取微信sign--扫码支付
public String querySignSaoma(PayWechat payWechat,String price,String ip,String WXNonceStr,String WXOutTradeNo){
String sign = "";
SortedMap<String, Object> mapSign = new TreeMap<>();
mapSign.put("appid", payWechat.getAppid());
mapSign.put("mch_id", payWechat.getMchId());
mapSign.put("nonce_str", WXNonceStr);
mapSign.put("body", WXBody);
mapSign.put("out_trade_no", WXOutTradeNo);
mapSign.put("total_fee", price);
mapSign.put("spbill_create_ip", ip);
mapSign.put("notify_url", WXNotifyUrl);
mapSign.put("trade_type", trade_type_SM);
sign = WXAllUitls.createSign("UTF-8", mapSign, payWechat.getApiKey());
return sign;
}
//获取公网ip,注意格式
public static String getPublicIp() {
try {
String path = "http://2018.ip138.com/ic.asp";// 要获得html页面内容的地址
//String path = "https://www.jiatui.com/new/js/city-picker.data.js";
URL url = new URL(path);//
// 创建url对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 打开连接
conn.setRequestProperty("contentType", "GBK"); // 设置url中文参数编码
conn.setConnectTimeout(5 * 1000);// 请求的时间
conn.setRequestMethod("GET");// 请求方式
InputStream inStream = conn.getInputStream();
// readLesoSysXML(inStream);
BufferedReader in = new BufferedReader(new InputStreamReader(
inStream, "GBK"));
StringBuffer buffer = new StringBuffer();
String line = "";
// 读取获取到内容的最后一行,写入
while ((line = in.readLine()) != null) {
buffer.append(line);
}
String str = buffer.toString();
Document doc = Jsoup.parse(str);
Elements e = doc.select("center");
// System.out.println("str======"+str);
// String ipString1 = str.substring(str.indexOf("您的IP是:["));
// // 获取你的IP是中间的[182.149.82.50]内容
// String ipsString2 = ipString1.substring(ipString1.indexOf("[") + 1,
// ipString1.lastIndexOf("]"));
// //获取当前IP地址所在地址
// String ipsString3=ipString1.substring(ipString1.indexOf(": "),ipString1.lastIndexOf("</center>"));
// System.err.println(ipsString3);
// 返回公网IP值
return e.text();
} catch (Exception e) {
System.out.println("获取公网IP连接超时");
return "";
}
}
发起支付
@ResponseBody
@RequestMapping("/sendWXpay")
public WXPayDto sendWXpay(String userGid, String price, String type, String loginName){
WXPayDto wXPayDto = new WXPayDto();
wXPayDto.setUserGid(userGid);
Double money = 0.0;
String code_url = null;
String ip = PublicInterIp.getPublicIp();
int first = ip.lastIndexOf("[");
int last = ip.lastIndexOf("]");
ip = ip.substring(first+1,last);
String WXNonceStr = WXAllUitls.getRandomString(32);
wXPayDto.setWXNonceStr(WXNonceStr);
String WXOutTradeNo =String.valueOf(System.currentTimeMillis());
wXPayDto.setWXOutTradeNo(WXOutTradeNo);
SortedMap<String, Object> mapSign = new TreeMap<String, Object>();
PayWechat payWechat = payWechatService.selectByPrimaryKey();
mapSign.put("appid", payWechat.getAppid());
mapSign.put("mch_id", payWechat.getMchId());
mapSign.put("nonce_str", WXNonceStr);
mapSign.put("body", WXBody);
mapSign.put("out_trade_no", WXOutTradeNo);//订单号(我方)
mapSign.put("total_fee", price);
mapSign.put("spbill_create_ip", ip);
mapSign.put("notify_url", WXNotifyUrl);
if(type.equals("1")){//扫码支付
String sign = querySignSaoma(payWechat,price,ip,WXNonceStr,WXOutTradeNo);
mapSign.put("trade_type", trade_type_SM);
mapSign.put("sign",sign);
String requestXML = WXAllUitls.getRequestXml(mapSign);
System.out.println(requestXML);
String result = WXAllUitls.httpsRequest(WXPayUrl, "POST", requestXML);
System.out.println(result);
Map<String, String> map = new HashMap<>();
try {
map = WXAllUitls.doXMLParse(result);
String return_code = map.get("return_code");
if (return_code.contains("SUCCESS")) {
code_url = map.get("code_url");//获取到code_url
code_url = imgUrl(code_url,userGid);
wXPayDto.setCodeUrl(code_url);
}
}catch (Exception e){
e.printStackTrace();
}finally {
}
}else{//H5支付
String sign = querySignH5(payWechat,price,ip,WXNonceStr,WXOutTradeNo);
mapSign.put("trade_type", trade_type_H5);
mapSign.put("sign",sign);//scene_info
//mapSign.put("scene_info",scene_info);
String requestXML = WXAllUitls.getRequestXml(mapSign);
System.out.println(requestXML);
String result = WXAllUitls.httpsRequest(WXPayUrl, "POST", requestXML);
System.out.println(result);
Map<String, String> map = new HashMap<>();
try {
map = WXAllUitls.doXMLParse(result);
String return_code = map.get("return_code");
if (return_code.contains("SUCCESS")) {
code_url = map.get("mweb_url");//获取到mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟
wXPayDto.setCodeUrl(code_url);
}
}catch (Exception e){
e.printStackTrace();
}finally {
}
}
//处理业务信息
return null;
}
回调
推荐一个内网穿透地址https://www.ngrok.cc/
//支付完成回调
@RequestMapping("/WXCallBack")
public String payReturnRequest(HttpServletRequest request,HttpServletResponse response){
System.out.println("进入回调");
String tradState = "";
String xmlString = "";
String resXml = "";
try {
xmlString = getXmlString(request);
System.out.println("微信返回的回调结果是:::::::" + xmlString);
// 先解析返回的数据
Map<String, String> dataMap = WXAllUitls.xmlToMap(xmlString);
String returnCode = dataMap.get("return_code");//返回码
String outTradeNo = dataMap.get("out_trade_no");//商户订单号
String transactionId = dataMap.get("transaction_id");//微信支付订单号
String nonceStr = dataMap.get("nonce_str");//随机字符串
//
//查询微信订单号状态 tradState
// SUCCESS—支付成功
//
//REFUND—转入退款
//
//NOTPAY—未支付
//
//CLOSED—已关闭
//
//REVOKED—已撤销(刷卡支付)
//
//USERPAYING--用户支付中
//
//PAYERROR--支付失败(其他原因,如银行返回失败)
tradState = setQueryWXOrderInfo(userGid, outTradeNo,nonceStr);
System.out.println("该微信订单号状态:"+tradState);
// 通知微信闭嘴,交易完成无需回调
if("SUCCESS".equals(returnCode)){
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
//处理业务
}else{
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
//处理业务
}
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
}catch (Exception e){
e.printStackTrace();
}
return tradState;
}
//查询订单状态
@RequestMapping("/taskQueryOrderStatu")
public String setQueryWXOrderInfo(String gid,String WXOutTradeNo,String WXNonceStr){
String path = ServiceImgUrl+gid+".jpg";
String trade_state = "";
SortedMap<String, Object> mapSign = new TreeMap<String, Object>();
PayWechat payWechat = payWechatService.selectByPrimaryKey();
mapSign.put("appid", payWechat.getAppid());
mapSign.put("mch_id", payWechat.getMchId());
mapSign.put("nonce_str", WXNonceStr);
mapSign.put("out_trade_no", WXOutTradeNo);//订单号
String sign = WXAllUitls.createSign("UTF-8", mapSign, payWechat.getApiKey());
mapSign.put("sign",sign);
String requestXML = WXAllUitls.getRequestXml(mapSign);
String result = WXAllUitls.httpsRequest(queryWXOrderInfo, "POST", requestXML);
System.out.println(result);
Map<String, String> map = new HashMap<>();
try {
map = WXAllUitls.doXMLParse(result);
String return_code = map.get("return_code");
if (return_code.contains("SUCCESS")) {
trade_state = map.get("trade_state");//获取到code_url
File file = new File(path);
if(file.exists()){
file.delete();
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
}
return trade_state;
}
二维码图片使用流返回即可
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zjy</groupId>
<artifactId>xzlive</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>xzlive</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
<swagger.version>2.7.0</swagger.version>
<google.guava>18.0</google.guava>
<fastjson.version>1.2.47</fastjson.version>
<poi.version>3.17</poi.version>
<jwt.version>0.9.0</jwt.version>
<mybatis.version>1.3.2</mybatis.version>
</properties>
<dependencies>
<!-- web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.0.9]</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>net.glxn.qrgen</groupId>
<artifactId>javase</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 支付宝即时到账接口 -->
<dependency>
<groupId>com.pentahohub.nexus</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>20150820220052</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${google.guava}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
<!-- <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId>
</dependency> -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-security</artifactId>-->
<!--</dependency>-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-jexl -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
版权声明:本文为qq_38108719原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。