做了一個(gè)測(cè)試案例狂秦,用的沙箱測(cè)試賬號(hào)
可以去支付寶官網(wǎng)注冊(cè)一個(gè)開(kāi)發(fā)者賬號(hào),獲取沙箱賬號(hào)悬赏,地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info
注冊(cè)完之后會(huì)看到以下畫(huà)面:
上面兩個(gè)圖中脓匿,我們可以看到有這個(gè)幾個(gè)有用的信息:
1.APPID
2.支付寶網(wǎng)關(guān)
3.商家賬號(hào) 登錄密碼
4.買(mǎi)家賬號(hào) 登錄密碼 支付密碼
接下來(lái)压鉴,我們?cè)谏诚鋺?yīng)用里要設(shè)置一下RSA2公鑰
首先下載生成公鑰和私鑰的工具,地址:https://opendocs.alipay.com/open/291/105971#LDsXr
如上圖骤坐,只有windows版和macOs版绪杏,用linux的心疼一秒鐘,還好我有windows虛擬機(jī)纽绍。
如上圖蕾久,安裝之后,點(diǎn)擊生成秘鑰即可生成公鑰和私鑰拌夏,復(fù)制保存好這個(gè)公鑰和私鑰
接下來(lái)更改沙箱應(yīng)用中RSA2的公鑰僧著,把剛剛生成的公鑰復(fù)制到在線網(wǎng)站上保存。
到現(xiàn)在為止障簿,準(zhǔn)備工作已經(jīng)做完了盹愚。
在springboot上創(chuàng)建一個(gè)AlipayConfig類
package com.zhaohy.app.config;
import java.io.FileWriter;
import java.io.IOException;
public class AlipayConfig {
// 應(yīng)用ID,您的APPID,收款賬號(hào)既是您的APPID對(duì)應(yīng)支付寶賬號(hào)
public static String APP_ID = "";
// 商戶私鑰站故,您的PKCS8格式RSA2私鑰皆怕,這些就是我們剛才設(shè)置的
public static String RSA_PRIVATE_KEY = "";
// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm
// 對(duì)應(yīng)APPID下的支付寶公鑰。,這些就是我們剛才設(shè)置的
public static String ALIPAY_PUBLIC_KEY = "";
// 異步通知愈腾,再這里我們?cè)O(shè)計(jì)自己的后臺(tái)代碼
public static String notify_url = "http://www.zhaohy.org.cn";
// 頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面路徑 需http://格式的完整路徑朗兵,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問(wèn)
public static String return_url = "http://www.zhaohy.org.cn";
// 簽名方式
public static String SIGN_TYPE = "RSA2";
// 字符編碼格式
public static String CHARSET = "utf-8";
// 支付寶網(wǎng)關(guān) https://openapi.alipaydev.com/gateway.do https://openapi.alipay.com/gateway.do
public static String GATEWAYURL = "https://openapi.alipaydev.com/gateway.do";
// 支付寶網(wǎng)關(guān)
public static String LOG_PATH = "/home/zhaohy/alipayLog/";
public static String FORMAT = "json";
// ↑↑↑↑↑↑↑↑↑↑請(qǐng)?jiān)谶@里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
/**
* 寫(xiě)日志顶滩,方便測(cè)試(看網(wǎng)站需求余掖,也可以改成把記錄存入數(shù)據(jù)庫(kù))
*
* @param sWord 要寫(xiě)入日志里的文本內(nèi)容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(LOG_PATH + "alipay_log_" + System.currentTimeMillis() + ".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
把之前的appid,公鑰,私鑰和網(wǎng)關(guān)地址都填在上面代碼里
新建AlipayService類
package com.zhaohy.app.service;
import com.alipay.api.AlipayApiException;
public interface AlipayService {
/**
* web端訂單支付
*
* @param outTradeNo 訂單編號(hào)(唯一)
* @param totalAmount 訂單價(jià)格
* @param subject 商品名稱
*/
String webPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception;
/**
* app端訂單支付
*
* @param outTradeNo 訂單編號(hào)
* @param totalAmount 訂單價(jià)格
* @param subject 商品名稱
*/
String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception;
/**
* 退款
*
* @param outTradeNo 訂單編號(hào)
* @param refundReason 退款原因
* @param refundAmount 退款金額
* @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求礁鲁,同一筆交易多次退款需要保證唯一盐欺,如需部分退款,則此參數(shù)必傳
*/
String refund(String outTradeNo, String refundReason, Integer refundAmount, String outRequestNo)
throws AlipayApiException;
/**
* 交易查詢
*
* @param outTradeNo 訂單編號(hào)(唯一)
*/
String query(String outTradeNo) throws AlipayApiException;
/**
* 交易關(guān)閉
*
* @param outTradeNo訂單編號(hào)(唯一)
*/
String close(String outTradeNo) throws AlipayApiException;
/**
* 退款查詢
*
* @param outTradeNo 訂單編號(hào)(唯一)
* @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求仅醇,同一筆交易多次退款需要保證唯一冗美,如需部分退款,則此參數(shù)必傳
*/
String refundQuery(String outTradeNo, String outRequestNo) throws AlipayApiException;
}
新建AlipayServiceImpl實(shí)現(xiàn)類
package com.zhaohy.app.service.impl;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeCloseRequest;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.zhaohy.app.config.AlipayConfig;
import com.zhaohy.app.service.AlipayService;
import com.zhaohy.app.utils.AppFrameworkUtil;
@Service("AlipayService")
public class AlipayServiceImpl implements AlipayService {
/** 調(diào)取支付寶接口 web端支付 */
DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APP_ID,
AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGN_TYPE);
/** 調(diào)取支付寶接口app端支付 */
AlipayClient alipayClients = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APP_ID,
AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGN_TYPE);
/**
* web端訂單支付
*
* @param outTradeNo 訂單編號(hào)(唯一)
* @param totalAmount 訂單價(jià)格
* @param subject 商品名稱
*/
@Override
public String webPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
/** 同步通知析二,支付完成后粉洼,支付成功頁(yè)面 */
alipayRequest.setReturnUrl(AlipayConfig.return_url);
/** 異步通知,支付完成后叶摄,需要進(jìn)行的異步處理 */
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
Map<String, String> bizContentMap = new HashMap<String, String>();
bizContentMap.put("out_trade_no", outTradeNo);
bizContentMap.put("total_amount", totalAmount + "");
bizContentMap.put("subject", subject);
bizContentMap.put("body", "商品名稱");
bizContentMap.put("timeout_express", "90m");
bizContentMap.put("product_code", "FAST_INSTANT_TRADE_PAY");
String bizContentJson = AppFrameworkUtil.structureConfigParamsGroupJSONDataWithOutSimpleResultBean(bizContentMap);
alipayRequest.setBizContent(bizContentJson);
/** 轉(zhuǎn)換格式 */
String result = alipayClient.pageExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
return result;
}
/**
* 退款
*
* @param outTradeNo 訂單編號(hào)
* @param refundReason 退款原因
* @param refundAmount 退款金額
* @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求属韧,同一筆交易多次退款需要保證唯一,如需部分退款蛤吓,則此參數(shù)必傳
*/
@Override
public String refund(String outTradeNo, String refundReason, Integer refundAmount, String outRequestNo)
throws AlipayApiException {
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
/** 調(diào)取接口 */
alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"refund_amount\":\"" + refundAmount
+ "\"," + "\"refund_reason\":\"" + refundReason + "\"," + "\"out_request_no\":\"" + outRequestNo
+ "\"}");
String result = alipayClient.execute(alipayRequest).getBody();
return result;
}
/**
* 交易查詢
*
* @param outTradeNo 訂單編號(hào)(唯一)
*/
@Override
public String query(String outTradeNo) throws AlipayApiException {
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
/** 請(qǐng)求接口 */
alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");
/** 轉(zhuǎn)換格式 */
String result = alipayClient.execute(alipayRequest).getBody();
return result;
}
/**
* 交易關(guān)閉
*
* @param outTradeNo訂單編號(hào)(唯一)
*/
@Override
public String close(String outTradeNo) throws AlipayApiException {
AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();
alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"trade_no\":\"" + "" + "\"}");
String result = alipayClient.execute(alipayRequest).getBody();
return result;
}
/**
* 退款查詢
*
* @param outTradeNo 訂單編號(hào)(唯一)
* @param outRequestNo 標(biāo)識(shí)一次退款請(qǐng)求宵喂,同一筆交易多次退款需要保證唯一,如需部分退款会傲,則此參數(shù)必傳
*/
@Override
public String refundQuery(String outTradeNo, String outRequestNo) throws AlipayApiException {
AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();
/** 請(qǐng)求接口 */
alipayRequest.setBizContent(
"{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"out_request_no\":\"" + outRequestNo + "\"}");
/** 格式轉(zhuǎn)換 */
String result = alipayClient.execute(alipayRequest).getBody();
return result;
}
/**
* app端訂單支付
*
* @param outTradeNo 訂單編號(hào)
* @param totalAmount 訂單價(jià)格
* @param subject 商品名稱
*/
@Override
public String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
/** 同步通知锅棕,支付完成后,支付成功頁(yè)面 */
alipayRequest.setReturnUrl(AlipayConfig.return_url);
/** 異步通知淌山,支付完成后裸燎,需要進(jìn)行的異步處理 */
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
/** 銷售產(chǎn)品碼(固定) */
String productCode = "QUICK_WAP_WAY";
/** 進(jìn)行賦值 */
AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();
wapPayModel.setOutTradeNo(outTradeNo);
wapPayModel.setSubject(subject);
wapPayModel.setTotalAmount(totalAmount.toString());
wapPayModel.setBody("商品名稱");
wapPayModel.setTimeoutExpress("2m");
wapPayModel.setProductCode(productCode);
alipayRequest.setBizModel(wapPayModel);
/** 格式轉(zhuǎn)換 */
String result = alipayClients.pageExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
return result;
}
}
新建AlipayController
package com.zhaohy.app.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.zhaohy.app.service.AlipayService;
import com.zhaohy.app.utils.AppFrameworkUtil;
@Controller
public class AlipayController {
@Autowired
private AlipayService alipayService;
@RequestMapping("/alipayTest.do")
public String test(HttpServletRequest request) {
request.setAttribute("ctx", AppFrameworkUtil.getWebRootUrl(request, ""));
return "html/alipay";
}
/**
* web 訂單支付
*/
@RequestMapping("/alipay/getPagePay")
public void getPagePay(HttpServletRequest request, HttpServletResponse response) throws Exception {
/** 模仿數(shù)據(jù)庫(kù),從后臺(tái)調(diào)數(shù)據(jù) */
String outTradeNo = "19960310621211";
Integer totalAmount = 1;
String subject = "蘋(píng)果28";
String pay = alipayService.webPagePay(outTradeNo, totalAmount, subject);
System.out.println(pay);
Map<Object, Object> resultMap = new HashMap<>();
resultMap.put("data", pay);
AppFrameworkUtil.renderJSON(response, AppFrameworkUtil.structureConfigParamsGroupJSONData(resultMap));
}
/**
* app 訂單支付
*/
@RequestMapping("/alipay/getAppPagePay")
public void getAppPagePay(HttpServletRequest request, HttpServletResponse response) throws Exception {
/** 模仿數(shù)據(jù)庫(kù)泼疑,從后臺(tái)調(diào)數(shù)據(jù) */
String outTradeNo = "1312332";
Integer totalAmount = 1000;
String subject = "天貓超市014";
String pay = alipayService.appPagePay(outTradeNo, totalAmount, subject);
System.out.println(pay);
Map<Object, Object> resultMap = new HashMap<>();
resultMap.put("data", pay);
AppFrameworkUtil.renderJSON(response, AppFrameworkUtil.structureConfigParamsGroupJSONData(resultMap));
}
/**
* 交易查詢
*/
@RequestMapping("/alipay/aipayQuery")
public void alipayQuery(HttpServletRequest request, HttpServletResponse response) throws Exception {
/** 調(diào)取支付訂單號(hào) */
String outTradeNo = "13123";
String query = alipayService.query(outTradeNo);
//Object json = JSONObject.toJSON(query);
/*
* JSONObject jObject = new JSONObject(); jObject.get(query);
*/
AppFrameworkUtil.renderJSON(response, query);
}
/**
* 退款
*
* @throws AlipayApiException
*/
@RequestMapping("/alipay/alipayRefund")
public void alipayRefund(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException {
String outTradeNo = request.getParameter("outTradeNo");
String outRequestNo = request.getParameter("outRequestNo");
String refundAmount = request.getParameter("refundAmount");
/** 調(diào)取數(shù)據(jù) */
// String outTradeNo = "15382028806591197";
String refundReason = "用戶不想購(gòu)買(mǎi)";
// refundAmount = 1;
// outRequestNo = "22";
String refund = alipayService.refund(outTradeNo, refundReason, Integer.parseInt(refundAmount), outRequestNo);
System.out.println(refund);
AppFrameworkUtil.renderJSON(response, refund);
}
/**
* 退款查詢
*
* @throws AlipayApiException
*/
@RequestMapping("/alipay/refundQuery")
public void refundQuery(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException {
/** 調(diào)取數(shù)據(jù) */
String outTradeNo = "13123";
String outRequestNo = "2";
String refund = alipayService.refundQuery(outTradeNo, outRequestNo);
AppFrameworkUtil.renderJSON(response, refund);
}
/**
* 交易關(guān)閉
*
* @throws AlipayApiException
*/
@RequestMapping("/alipay/alipayclose")
public void alipaycolse(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException {
/** 調(diào)取數(shù)據(jù) */
String outTradeNo = "13123";
String close = alipayService.close(outTradeNo);
AppFrameworkUtil.renderJSON(response, close);
}
}
controller里getAppPagePay是app訂單支付德绿,里面寫(xiě)死的是測(cè)試數(shù)據(jù),如果正式用王浴,可以當(dāng)參數(shù)傳進(jìn)來(lái)脆炎。
演示app 訂單支付,因?yàn)閍pp訂單支付會(huì)跳轉(zhuǎn)到支付寶進(jìn)行登錄支付氓辣,如果沒(méi)有監(jiān)測(cè)到支付寶應(yīng)用秒裕,則用網(wǎng)頁(yè)版的支付寶進(jìn)行支付,會(huì)比較方便钞啸。
調(diào)用上面的/alipayTest.do接口會(huì)跳轉(zhuǎn)到html/alipay.html頁(yè)面
alipay.html代碼如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script th:src="@{${ctx} + '/js/jquery/jquery-3.2.1.min.js'}"></script>
<script th:src="@{${ctx} + '/js/common/common.js'}"></script>
<script>
$(function(){
let url = "http://127.0.0.1:8082/alipay/getAppPagePay";
let params = {}
let result = getData(params, url);
console.log(result)
$("#alipay").html(result.data);
})
function getData(dataArr, url){
let results = null;
$.ajax({
url:url,
data:JSON.stringify(dataArr),
contentType:'application/json',
dataType:'json',
async:false,
type:'post',
beforeSend: function(request) {
if(!booleanEmpty(localStorage.getItem("token"))){
request.setRequestHeader("token", localStorage.getItem("token"));
}
},
success:function(result){
if("403" == result.result_code){
alert(result.result_msg);
window.location.href = $("#rootPath").val() + "/user/loginPage.do"
} else{
results = result.data;
}
},
complete:function (){ //在數(shù)據(jù)加載完成之后几蜻,要?jiǎng)h除掉 正在加載的dom
}
});
return results;
};
</script>
</head>
<body>
<div id="alipay"></div>
</body>
</html>
可以看到喇潘,一進(jìn)來(lái)這個(gè)頁(yè)面會(huì)請(qǐng)求app訂單支付接口,那個(gè)接口會(huì)返回一個(gè)form表單梭稚,并提交給支付寶進(jìn)行支付颖低,那個(gè)form表單的html放到#alipay div中便會(huì)自動(dòng)執(zhí)行跳轉(zhuǎn).
啟動(dòng)項(xiàng)目,訪問(wèn)http://127.0.0.1:8082/alipayTest.do
如圖弧烤,電腦訪問(wèn)跳轉(zhuǎn)到了上圖頁(yè)面忱屑,點(diǎn)擊繼續(xù)瀏覽器付款,登錄沙箱買(mǎi)家賬號(hào)暇昂,輸入支付密碼即可
點(diǎn)擊確認(rèn)付款莺戒,輸入密碼
幾秒鐘后會(huì)跳轉(zhuǎn)回AlipayConfig里面設(shè)置的http:www.zhaohy.org.cn
至此,整個(gè)支付過(guò)程已經(jīng)完成~
=====2021年7月19日更新=====
補(bǔ)充一下AppFrameworkUtil工具類
package com.zhaohy.app.utils;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import org.springframework.context.ApplicationContext;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhaohy.app.service.UserService;
import flexjson.JSONSerializer;
import nl.bitwalker.useragentutils.UserAgent;
public class AppFrameworkUtil {
/**
* 四舍五入急波。保留num個(gè)小數(shù)點(diǎn)后的數(shù)字
*
* @param bh
* @param num
* @return
*/
public static String getNum(double bh, int num) {
String numstr = "";
numstr = new BigDecimal(bh).setScale(num, BigDecimal.ROUND_HALF_UP) + "";
return numstr;
}
/**
* 去替換橫杠
*
* @param str
* @param t_str
* @return
*/
public static String getReplaseStr(String str) {
String t_str = null;
if (str != null) {
t_str = str.replace("-", "");
}
return t_str;
}
/**
* 四舍五入从铲。保留num個(gè)小數(shù)點(diǎn)后的數(shù)字
*
* @param bh
* @param num
* @return
*/
public static String getNum(String bh, int num) {
if (AppFrameworkUtil.isEmpty(bh) || "-".equals(bh))
return "-";
if ("0.0".equals(bh) || "0".equals(bh))
return bh;
String numstr = "";
numstr = new BigDecimal(Double.parseDouble(bh)).setScale(num, BigDecimal.ROUND_HALF_UP) + "";
return numstr;
}
/**
* 字符串空判斷
*
* @param str
* @return
*/
public static boolean isEmpty(String str) {
boolean flag = true;
if (null != str && 0 != str.trim().length())
flag = false;
return flag;
}
/**
* 添加符號(hào)
*
* @param str
*/
public static String addSign(String str) {
if (!AppFrameworkUtil.isEmpty(str) && !str.contains("-")) {
str = "+" + str;
}
return str;
}
/**
* 添加千分位
*
* @param str
* @return
*/
public static String format(String str) {
if (!isEmpty(str) && !"-".equals(str)) {
DecimalFormat df = new DecimalFormat("###,###");
try {
str = df.format(Long.parseLong(str));
} catch (Exception e) {
return str;
}
}
return str;
}
/**
* response JSON數(shù)據(jù)
*
* @param response
* @param context
*/
public static void renderJSON(HttpServletResponse response, String context) {
PrintWriter out = null;
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
out = response.getWriter();
out.write(context);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}
/**
* 獲取外網(wǎng)IP
*
* @param request
* @return
*/
public static String getRemoteHost(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}
public static String getSystemDate() {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String curDate = s.format(calendar.getTime()); // 當(dāng)前日期
return curDate;
}
/**
*
* @param str
* @return
*/
public static boolean isBlank(String str) {
return (str == null || str.trim().length() == 0 || str.equals("undefined") || str.equals("null"));
}
/**
* 序列化集合成JSON字符
* @param list
* @return
*/
@SuppressWarnings("unchecked")
public static String structureConfigParamsGroupJSONData(Object obj) {
JSONSerializer serializer = new JSONSerializer();
String json = "";
@SuppressWarnings("rawtypes")
SimpleResultBean result = new SimpleResultBean();
result.setData(obj);
json = serializer.exclude("*.class").deepSerialize(result).replaceAll(":\\s*null\\s*", ":\"\"");
return json;
}
public static String structureConfigParamsGroupJSONDataWithOutSimpleResultBean(Object obj) {
JSONSerializer serializer = new JSONSerializer();
String json = "";
json = serializer.exclude("*.class").deepSerialize(obj).replaceAll(":\\s*null\\s*", ":\"\"");
return json;
}
/**
* 返回jsonObj參數(shù)
*
* @param request
* @return
*/
public static JSONObject getRequestParamsObj(HttpServletRequest request) {
JSONObject paramsObj = new JSONObject();
try {
BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null)
responseStrBuilder.append(inputStr);
paramsObj = JSONObject.parseObject(responseStrBuilder.toString());
} catch (Exception e) {
e.printStackTrace();
}
return paramsObj;
}
/**
* 判斷是否是ajax請(qǐng)求
*
* @param request
* @return
*/
public static boolean isAjax(HttpServletRequest request) {
String accept = request.getHeader("accept");
if (accept != null && accept.indexOf("application/json") != -1) {
return true;
} else {
return false;
}
}
/**
*
* 獲取用戶mac地址
*
* @param ip
* @return
*/
public static String getMacAddrByIp(String ip) {
String macAddr = null;
try {
String command = "nbtstat -a ";
if (!System.getProperty("os.name").contains("Windows")) {
command = "netstat -a ";
}
Process process = Runtime.getRuntime().exec(command + ip);
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
Pattern pattern = Pattern.compile("([A-F0-9]{2}-){5}[A-F0-9]{2}");
Matcher matcher;
for (String strLine = br.readLine(); strLine != null; strLine = br.readLine()) {
matcher = pattern.matcher(strLine);
if (matcher.find()) {
macAddr = matcher.group();
break;
}
}
} catch (IOException e) {
// e.printStackTrace();
}
return macAddr;
}
/**
* 獲取系統(tǒng)os名稱
*
* @param request
* @return
*/
public static String getOSName(HttpServletRequest request) {
String osName = null;
try {
String userAgentStr = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
osName = userAgent.getOperatingSystem().getName();
} catch (Exception e) {
}
return osName;
}
/**
* 獲取請(qǐng)求系統(tǒng)os名稱
*
* @param request
* @return
*/
public static Object getOSVersion(HttpServletRequest request) {
Object osVersion = null;
try {
String userAgentStr = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
osVersion = userAgent.getOperatingSystem().getId();
} catch (Exception e) {
}
return osVersion;
}
/**
* 獲取請(qǐng)求瀏覽器名稱
*
* @param request
* @return
*/
public static String getBrowserName(HttpServletRequest request) {
String name = null;
try {
String userAgentStr = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
name = userAgent.getBrowser().getName();
} catch (Exception e) {
}
return name;
}
/**
* 獲取請(qǐng)求瀏覽器版本
*
* @param request
* @return
*/
public static String getBrowserVersion(HttpServletRequest request) {
String version = null;
try {
String userAgentStr = request.getHeader("User-Agent");
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
version = userAgent.getBrowserVersion().getVersion();
} catch (Exception e) {
}
return version;
}
public static String getDevTypeById(String appType) {
String name = "";
if ("1".equals(appType)) {
name = "IPAD";
} else if ("5".equals(appType)) {
name = "IPHONE";
} else if ("6".equals(appType)) {
name = "ANDROID";
}
return name;
}
public static String formatLanguageType(String languageType) {
String value = "zh";
if (!AppFrameworkUtil.isBlank(languageType)) {
if ("ja".equals(languageType)) {
value = "ja";
}
}
return value;
}
/**
* txt格式轉(zhuǎn)String
*
* @param txtPath
* @return
* @throws IOException
*/
public static String txtToStr(String txtPath) throws IOException {
StringBuffer buffer = new StringBuffer();
BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(txtPath), "UTF-8"));
String str = null;
while ((str = bf.readLine()) != null) {// 使用readLine方法,一次讀一行
buffer.append(new String(str.getBytes(), "UTF-8"));
}
String xml = buffer.toString();
return xml;
}
public static boolean booleanUtf8(String txtPath) {
boolean flag = false;
// 原本這里的是gb2312澄暮,為了兼容更多名段,選擇了gbk
String code = "gbk";
byte[] head = new byte[3];
try {
File file = new File(txtPath);
InputStream inputStream = new FileInputStream(file);
inputStream.read(head);
if (head[0] == -1 && head[1] == -2) {
code = "UTF-16";
} else if (head[0] == -2 && head[1] == -1) {
code = "Unicode";
} else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
code = "UTF-8";
}
inputStream.close();
//System.out.println(code);
if (code.equals("UTF-8")) {
flag = true;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
public static boolean booleanUtf8(File file) {
boolean flag = false;
// 原本這里的是gb2312,為了兼容更多泣懊,選擇了gbk
String code = "gbk";
byte[] head = new byte[3];
try {
InputStream inputStream = new FileInputStream(file);
inputStream.read(head);
if (head[0] == -1 && head[1] == -2) {
code = "UTF-16";
} else if (head[0] == -2 && head[1] == -1) {
code = "Unicode";
} else if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
code = "UTF-8";
}
inputStream.close();
//System.out.println(code);
if (code.equals("UTF-8")) {
flag = true;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return flag;
}
public static boolean upLoadFile(File file, String pdfPath) {
boolean flag = false;
File dirFile = new File(pdfPath);
try {
if (!dirFile.exists()) {
dirFile.createNewFile();
}
flag = true;
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
InputStream input = null;
FileOutputStream output = null;
try {
input = new FileInputStream(file);
output = new FileOutputStream(dirFile);
byte[] bt = new byte[1024 * 1024 * 200];// 最大200m
int len = 0;
while ((len = input.read(bt)) != -1) {
output.write(bt, 0, len);
}
flag = true;
input.close();
output.flush();
output.close();
} catch (IOException e) {
flag = false;
e.printStackTrace();
}
return flag;
}
/**
* 分頁(yè)查詢
*
* @param request
* @param paramsMap
* @param list
* @param sqlSession
* @param string
* @return
*/
public static List<Map<String, Object>> pagedQuery(HttpServletRequest request, Map<String, Object> paramsMap,
List<Map<String, Object>> list, SqlSession sqlSession, String queryPosition) {
int pageIndex = Integer.parseInt(paramsMap.get("pageIndex").toString());// 當(dāng)前頁(yè)
int pageIndexSize = Integer.parseInt(paramsMap.get("pageIndexSize").toString());// 一頁(yè)條數(shù)
int beginNum = pageIndex * pageIndexSize - pageIndexSize;
int endNum = pageIndex * pageIndexSize;
int totalNum = 0;// 總條數(shù)
int pageCount = 0;// 總頁(yè)數(shù)
paramsMap.put("beginNum", beginNum);
paramsMap.put("endNum", endNum);
list = new ArrayList<Map<String, Object>>();
list = sqlSession.selectList(queryPosition, paramsMap);
if (list.size() > 0) {
totalNum = Integer.parseInt(list.get(0).get("TOTALNUM").toString());
if (totalNum > pageIndexSize) {
if (((double) totalNum / (double) pageIndexSize) > (double) (totalNum / pageIndexSize)) {
pageCount = totalNum / pageIndexSize + 1;
} else {
pageCount = totalNum / pageIndexSize;
}
} else {
pageCount = 1;
}
}
paramsMap.put("pageCount", pageCount);// 總頁(yè)數(shù)
paramsMap.put("totalNum", totalNum);// 總條數(shù)
return list;
}
public static void downloadFile(File file, HttpServletRequest request, HttpServletResponse response,
String fileName, String fileType) {
boolean success = false;
/* 設(shè)置文件ContentType類型伸辟,這樣設(shè)置,會(huì)自動(dòng)判斷下載文件類型 */
response.setContentType("multipart/form-data");
// response.setContentType("application/OCTET-STREAM;charset=UTF-8");
/* 設(shè)置文件頭:最后一個(gè)參數(shù)是設(shè)置下載文件名 */
try {
String formFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment;filename=" + formFileName + "." + fileType);
InputStream fis = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[1024 * 1024 * 200];
int len;
while ((len = fis.read(b)) > 0) {
os.write(b, 0, len);
}
os.flush();
os.close();
fis.close();
success = true;
} catch (Exception e) {
success = false;
e.printStackTrace();
}
}
// 處理導(dǎo)出的excel文件中的空格變成+號(hào)的問(wèn)題
public static String encodeExcelName(String excelName) {
try {
excelName = URLEncoder.encode(excelName, "utf-8");
excelName = excelName.replace("+", "%20");
} catch (final IOException e) {
e.printStackTrace();
// throw e;
} finally {
}
return excelName;
}
/**
* 參數(shù)加引號(hào)處理
*
* @param value
* @return
*/
public static String addQuotesToParameter(String ids) {
if (!AppFrameworkUtil.isBlank(ids)) {
String[] idsArr = ids.split(",");
if (idsArr.length > 0) {
StringBuffer idBuffer = new StringBuffer();
for (int i = 0; i < idsArr.length; i++) {
idBuffer.append("'" + idsArr[i] + "',");
}
ids = idBuffer.toString().substring(0, idBuffer.toString().length() - 1);
}
}
return ids;
}
/**
* 把string字符串寫(xiě)入文件
* @param html
* @param htmlPath
* @param string
* @return
*/
public static boolean writeStrToFile(String str, String path, String fileName) {
boolean success = false;
File dir = new File(path);
if(!dir.exists()) {
dir.mkdirs();
}
File file = new File(path + fileName);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// byte bytes[] = new byte[1024 * 1024 * 200];
// bytes = str.getBytes();
// int b = bytes.length; // 是字節(jié)的長(zhǎng)度嗅定,不是字符串的長(zhǎng)度
// FileOutputStream fos;
// 獲取該文件的緩沖輸出流
BufferedWriter bufferedWriter = null;
// 寫(xiě)入信息
try {
bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
bufferedWriter.write(str);
bufferedWriter.flush();// 清空緩沖區(qū)
bufferedWriter.close();// 關(guān)閉輸出流
success = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
* try {
* fos = new FileOutputStream(file);
* fos.write(bytes);
* fos.flush();
* fos.close();
* success = true;
* } catch (Exception e) {
* // TODO Auto-generated catch block
* e.printStackTrace();
* }
*/
return success;
}
/**
* 前端訪問(wèn)路徑
* @param request
* @param path
* @return
*/
public static String getCommonUrl(HttpServletRequest request, String path) {
// String scheme = request.getScheme();//http
// String serverName = request.getServerName();//localhost
// int serverPort = request.getServerPort();//8080
// String contextPath = request.getContextPath();//項(xiàng)目名
// String commonUrl = scheme+"://"+serverName+":"+serverPort+contextPath + "/" + PropertiesUtils.getWEB_STATICFILE_URL() + "/" + path;
String commonUrl = PropertiesUtils.getCOMMON_URL() + PropertiesUtils.getWEB_STATICFILE_URL() + "/" + path;
return commonUrl;
}
public static String getWebRootUrl(HttpServletRequest request, String path) {
// String scheme = request.getScheme();//http
// String serverName = request.getServerName();//localhost
// int serverPort = request.getServerPort();//8080
// String contextPath = request.getContextPath();//項(xiàng)目名
// String commonUrl = scheme+"://"+serverName+":"+serverPort+contextPath + "/" + path;
String commonUrl = PropertiesUtils.getCOMMON_URL() + path;
return commonUrl;
}
/**
* 過(guò)濾文件名特殊字符
* @param string
* @return
*/
public static String getFileNameFilterSpecialCharacters(String fileName) {
if(!AppFrameworkUtil.isBlank(fileName)) {
fileName = fileName.replace("\\", "").replace("/", "")
.replace(":", "").replace("*", "").replace("?", "").replace("\"", "").replace("<", "")
.replace(">", "").replace("|", "");
}
return fileName;
}
public static String formateDateType(HttpServletRequest request, String dateType) {
String requestType = null == request.getParameter("requestType") ? "pc" : request.getParameter("requestType");
if("app".equals(requestType)) {
dateType = null == dateType ? "" : dateType;
} else {
dateType = null == dateType ? "4" : dateType;
}
return dateType;
}
/**
* 店選中id勾選
* @param request
* @param paramsMap
* @param checkIds
* @param json
* @return
*/
public static String getDealerBoxCheck(HttpServletRequest request, Map<String, Object> paramsMap, String checkIds, String json) {
if(!AppFrameworkUtil.isBlank(checkIds)) {
String[] checkIdsArr = checkIds.split(",");
JSONObject jsonObj = JSONObject.parseObject(json);
JSONObject dataObj = jsonObj.getJSONObject("data");
JSONArray dataArr = dataObj.getJSONArray("data");
for(int i = 0; i < dataArr.size(); i++) {
JSONObject dataObj1 = dataArr.getJSONObject(i);
JSONArray childrenArr = dataObj1.getJSONArray("children");
for(int j = 0; j < childrenArr.size(); j++) {
JSONObject childrenObj = childrenArr.getJSONObject(j);
JSONArray childrenArr1 = childrenObj.getJSONArray("children");
for(int k = 0; k < childrenArr1.size(); k++) {
JSONObject childrenObj1 = childrenArr1.getJSONObject(k);
JSONArray childrenArr2 = childrenObj1.getJSONArray("children");
for(int l = 0; l < childrenArr2.size(); l++) {
JSONObject childrenObj2 = childrenArr2.getJSONObject(l);
childrenObj2.put("checked", false);
}
childrenObj1.put("checked", false);
}
childrenObj.put("checked", false);
}
dataObj1.put("checked", false);
}
first:for(int i = 0; i < dataArr.size(); i++) {
JSONObject dataObj1 = dataArr.getJSONObject(i);
for(int m = 0; m < checkIdsArr.length; m++) {
if(checkIdsArr[m].equals(dataObj1.getString("value"))) {
dataObj1.put("checked", true);
break first;
}
}
JSONArray childrenArr = dataObj1.getJSONArray("children");
for(int j = 0; j < childrenArr.size(); j++) {
JSONObject childrenObj = childrenArr.getJSONObject(j);
for(int m = 0; m < checkIdsArr.length; m++) {
if(checkIdsArr[m].equals(childrenObj.getString("value"))) {
childrenObj.put("checked", true);
dataObj1.put("checked", true);
break first;
}
}
JSONArray childrenArr1 = childrenObj.getJSONArray("children");
for(int k = 0; k < childrenArr1.size(); k++) {
JSONObject childrenObj1 = childrenArr1.getJSONObject(k);
for(int m = 0; m < checkIdsArr.length; m++) {
if(checkIdsArr[m].equals(childrenObj1.getString("value"))) {
childrenObj1.put("checked", true);
childrenObj.put("checked", true);
dataObj1.put("checked", true);
break first;
}
}
JSONArray childrenArr2 = childrenObj1.getJSONArray("children");
for(int l = 0; l < childrenArr2.size(); l++) {
JSONObject childrenObj2 = childrenArr2.getJSONObject(l);
for(int m = 0; m < checkIdsArr.length; m++) {
if(checkIdsArr[m].equals(childrenObj2.getString("value"))) {
childrenObj2.put("checked", true);
childrenObj1.put("checked", true);
childrenObj.put("checked", true);
dataObj1.put("checked", true);
break first;
}
}
}
}
}
}
json = jsonObj.toJSONString();
}
return json;
}
public static String getUserId(HttpServletRequest request) {
String userId = "";
String token = AppFrameworkUtil.getTokenFromRequest(request);
ServletContext context = request.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
JSONObject userObj = JSONObject.parseObject(redisTemplate.opsForValue().get(token));
userId = userObj.get("USER_ID").toString();
}
return userId;
}
public static String getUserTypeId(HttpServletRequest request) {
String userTypeId = "";
String token = AppFrameworkUtil.getTokenFromRequest(request);
ServletContext context = request.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
JSONObject userObj = JSONObject.parseObject(redisTemplate.opsForValue().get(token));
userTypeId = userObj.get("USER_TYPE_ID").toString();
}
return userTypeId;
}
public static String getUserName(HttpServletRequest request) {
String userName = "";
String token = AppFrameworkUtil.getTokenFromRequest(request);
ServletContext context = request.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
JSONObject userObj = JSONObject.parseObject(redisTemplate.opsForValue().get(token));
userName = userObj.get("USER_NAME").toString();
}
return userName;
}
public static String getTokenFromRequest(HttpServletRequest request) {
String token = null;
if(null != request.getHeader("token")) {
token = request.getHeader("token");
}
if(token == null) {
token = request.getParameter("token");
}
ServletContext context = request.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
StringRedisTemplate redisTemplate = ctx.getBean(StringRedisTemplate.class);
if(!AppFrameworkUtil.isBlank(token)) {
//去redis里找是否存在token
if(AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(token))) {
token = null;
}
// String userId = JWTUtil.verifyToken(token);
// String value = null;
// try {
// value = PropertiesUtils.getPropertiesFromFile(AppFrameworkUtil.getLoginDateKey(userId));
// } catch (IOException e) {
// value = null;
// e.printStackTrace();
// }
// userId = JWTUtil.verifyToken(token, value);
// if(null == userId) {
// return null;
// }
// ServletContext context = request.getServletContext();
// ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
// UserService userService = ctx.getBean(UserService.class);
// List<Map<String, Object>> list = userService.getUserByUserId(request, userId);
// if(list.size() > 0) {
// request.getSession().setAttribute(PropertiesUtils.getUSERSTR(), list);
// } else {
// token = null;
// }
} else {//如果沒(méi)傳token進(jìn)來(lái)自娩,去看看redis里有沒(méi)這個(gè)瀏覽器的sessionId
String sessionId = request.getSession().getId();
if(!AppFrameworkUtil.isBlank(redisTemplate.opsForValue().get(sessionId))) {
token = redisTemplate.opsForValue().get(sessionId);
}
}
if(AppFrameworkUtil.isBlank(token)) {
token = "";
}
return token;
}
//public static void main(String[] args) {
/*
* List<String> list = pdfPathToImagePaths("D://pdf/PowerPoint2013簡(jiǎn)介.pdf");
* for (int i = 0; i < list.size(); i++) {
* System.out.println("path==" + list.get(i));
* }
*/
/*
* String userPwd = "&";
* try {
* userPwd =URLEncoder.encode(userPwd, "UTF-8");
* } catch (UnsupportedEncodingException e) {
* // TODO Auto-generated catch block
* e.printStackTrace();
* }
* System.out.println(userPwd);
*/
//}
public static String getLoginDateKey(String userId) {
if(!AppFrameworkUtil.isBlank(userId)) {
return userId + "LOGIN_DATE";
} else {
return null;
}
}
public static String getLoginDateValue(HttpServletRequest request, String userId) {
if(!AppFrameworkUtil.isBlank(userId)) {
return CookieUtil.getCookieByName(request, AppFrameworkUtil.getLoginDateKey(userId));
}
return null;
}
}