前臺JS:
if ("wx" == zf_vallue) {
var url = host + "/server/weixin/wxPayH5";
url =url+'room_order_id='+order_info.order_id+'&trade_type=NATIVE&zf_vallue=wx'
window.location.href=url;
//判斷是微信還是支付寶--->是支付寶
}else if("zfb"==zf_vallue){
var url = host + "/server/zfb/goAlipay";
url = url+'?room_order_id='+order_info.order_id + '&hotel_id=' +
hotel.hotelgroup_id + '&hotel_name=' + hotel.hotelgroup_name
window.location.href=url;
} else {
$(location).attr('href', 'index.html');
}
1 微信H5支付後臺:
/**
* 微信H5支付
*
* @param request
* @param response
* @param model
* @throws Exception
*/
@RequestMapping("/server/weixin/wxPayH5")
public void wxPayH5(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {
Map<String, Object> result = new HashMap<String, Object>();
result.put("success", false);
try {
// 訂單號
String room_order_id = request.getParameter("room_order_id");
// 付款金額,必填
// double total = Constant.map_order.get(room_order_id);
// total=total*100;
// int total_fee = new Double(total).intValue();
int total_fee = 1;
logger.error("==========/server/weixin/wxPayH5:" + total_fee + "========");
String zf_vallue = request.getParameter("zf_vallue");
// ip地址獲取
String basePath = request.getServerName() + ":" + request.getServerPort();
// 賬號信息
String appid = PayConfig.APP_ID; // appid
String mch_id = PayConfig.MCH_ID; // 商業號
String key = PayConfig.API_KEY; // key
String currTime = PayCommonUtil.getCurrTime();
String strTime = currTime.substring(8, currTime.length());
String strRandom = PayCommonUtil.buildRandom(4) + "";
String nonce_str = strTime + strRandom;
// 價格 注意:價格的單位是分
String order_price = String.valueOf(total_fee);
// 獲取發起電腦 ip
String spbill_create_ip = HttpUtil.getRealIp(request);
// 回調接口
String notify_url = PayConfig.NOTIFY_URL_H5.replaceAll("localhostUrl", basePath);
// String notify_url = PayConfig.NOTIFY_URL_H5.replaceAll("localhostUrl",
// basePath) + getCurrentUser().getId();
// 頁面跳轉同步通知頁面路徑
String trade_type = "MWEB";
// 設置package訂單參數
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
// 生成簽名的時候需要你自己設置隨機字符串
packageParams.put("nonce_str", nonce_str);
packageParams.put("out_trade_no", room_order_id);
packageParams.put("total_fee", order_price);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", notify_url);
packageParams.put("trade_type", trade_type);
packageParams.put("body", PayConfig.BODY);
packageParams.put("scene_info",
"{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"https://www.XXXXX.com\",\"wap_name\": \"熙康雲舍\"}}");
String sign = PayCommonUtil.createSign("UTF-8", packageParams, key);
packageParams.put("sign", sign);
String requestXML = PayCommonUtil.getRequestXml(packageParams);
String resXml = HttpUtil.postData(PayConfig.UFDODER_URL, requestXML);
Map map = XMLUtil.doXMLParse(resXml);
String urlCode = (String) map.get("code_url");
// 確認支付過後跳的地址,需要經過urlencode處理
String url = "https://www.XXXX.com/index2.html";
String urlString = URLEncoder.encode(url, "UTF-8");
String mweb_url = map.get("mweb_url") + "&redirect_url=" + urlString;
response.sendRedirect(mweb_url);
logger.info("==========/server/weixin/wxPayH5======== " + "verify_result = " + zf_vallue);
result.put("sHtmlText", urlCode);
result.put("success", true);
} catch (Exception e) {
logger.error("==========/server/weixin/wxPayH5:" + e.getMessage() + "========");
result.put("errormsg", e.getMessage());
}
}
/**
* 執行回調 確認支付後處理事件 例如添加金額到數據庫等操作
*
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("/server/weixin/WxQuery")
public void weixin_notify(HttpServletRequest request, HttpServletResponse response, ModelMap model)
throws Exception {
System.out.println("進入支付h5回調=====================");
String xmlMsg = readData(request);
System.out.println("pay notice---------" + xmlMsg);
Map params = XMLUtil.doXMLParse(xmlMsg);
// String appid = params.get("appid");
// //商戶號
// String mch_id = params.get("mch_id");
String result_code = params.get("result_code") + "";
// String openId = params.get("openid");
// //交易類型
// String trade_type = params.get("trade_type");
// //付款銀行
// String bank_type = params.get("bank_type");
// // 總金額
// String total_fee = params.get("total_fee");
// //現金支付金額
// String cash_fee = params.get("cash_fee");
// // 微信支付訂單號
// String transaction_id = params.get("transaction_id");
// 商戶訂單號
String out_trade_no = params.get("out_trade_no") + "";
// // 支付完成時間,格式爲yyyyMMddHHmmss
// String time_end = params.get("time_end");
///////////////////////////// 以下是附加參數///////////////////////////////////
String attach = params.get("attach") + "";
// String fee_type = params.get("fee_type");
// String is_subscribe = params.get("is_subscribe");
// String err_code = params.get("err_code");
// String err_code_des = params.get("err_code_des");
HealthUserOrder order = hotelMapper.selOrderInfo(out_trade_no);
String hotel_id = order.getHotel_id();
String userid = null;
try {
// 過濾空 設置 TreeMap
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
Iterator it = params.keySet().iterator();
while (it.hasNext()) {
String parameter = (String) it.next();
String parameterValue = params.get(parameter) + "";
String v = "";
if (null != parameterValue) {
v = parameterValue.trim();
}
System.out.println("key==========" + parameter + "value========" + v);
packageParams.put(parameter, v);
}
// 查看回調參數
// LogUtil.writeMsgToFile(packageParams.toString());
double total_fee = Double.parseDouble(
new BigDecimal((String) packageParams.get("total_fee")).divide(new BigDecimal(100)).toString());
userid = (String) packageParams.get("userid");
// 賬號信息
String resXml = "";
// ------------------------------
// 處理業務開始
// ------------------------------
if ("SUCCESS".equals((String) packageParams.get("result_code"))) {
// 這裏是支付成功
try {
depositOrder(out_trade_no, total_fee, hotel_id);
} catch (Exception e) {
logger.error("=======WeiXinController/server/weixin/WxQuery:" + "========" + e.getMessage());
}
////////// 執行自己的業務邏輯////////////////
// 通知微信.異步確認成功.必寫.不然會一直通知後臺.八次之後就認爲交易失敗了.
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
} else {
model.put("sHtmlText", "付款失敗");
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();
logger.error("=======WeiXinController/server/weixin/WxQuery:" + "========" + e.getMessage());
}
}
public static String readData(HttpServletRequest request) {
BufferedReader br = null;
try {
StringBuilder result = new StringBuilder();
br = request.getReader();
for (String line; (line = br.readLine()) != null;) {
if (result.length() > 0) {
result.append("\n");
}
result.append(line);
}
return result.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (br != null)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
PayConfig
public class PayConfig {
// 微信號
public static String APP_ID = "XXXX";
// 應用對應的憑證
// public static String APP_SECRET = "XXXX";
// 商戶密鑰
public static String API_KEY = "XXXX";
// 商業號
public static String MCH_ID = "XXXXX";
// 回調地址
public static String NOTIFY_URL = "http://localhostUrl/resourceManager/xxxxxx?userid=";
// 微信支付h5 回調地址
public static String NOTIFY_URL_H5 = "https://www.XXXXXX.com/server/weixin/WxQuery";
// 商品名稱
public static String BODY = "熙康雲舍";
// 請求地址
public static String UFDODER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// 微信支付V2賬單查詢接口
public static String ORDERQUERY = "https://api.mch.weixin.qq.com/pay/orderquery";
}
HttpUtil工具類:
package com.cloud.server.utils.weixin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
/**
* Http客戶端工具類<br/>
* 這是內部調用類,請不要在外部調用。
*
* @author miklchen
*
*/
public class HttpUtil {
private final static int CONNECT_TIMEOUT = 5000; // in milliseconds
private final static String DEFAULT_ENCODING = "UTF-8";
public static String postData(String urlStr, String data) {
return postData(urlStr, data, null);
}
public static String postData(String urlStr, String data, String contentType) {
BufferedReader reader = null;
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setConnectTimeout(CONNECT_TIMEOUT);
conn.setReadTimeout(CONNECT_TIMEOUT);
if (contentType != null)
conn.setRequestProperty("content-type", contentType);
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
if (data == null)
data = "";
writer.write(data);
writer.flush();
writer.close();
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\r\n");
}
return sb.toString();
} catch (IOException e) {
} finally {
try {
if (reader != null)
reader.close();
} catch (IOException e) {
}
}
return null;
}
/**
* 獲取真實ip地址 通過阿帕奇代理的也能獲取到真實ip
* @param request
* @return
*/
public static String getRealIp(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;
}
}
PayCommonUtil工具類
package com.cloud.server.utils.weixin;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
public class PayCommonUtil {
/**
* 是否簽名正確,規則是:按參數名稱a-z排序,遇到空值的參數不參加簽名。
*
* @return boolean
*/
public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (!"sign".equals(k) && null != v && !"".equals(v)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + API_KEY);
// 算出摘要
String mysign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();
String tenpaySign = ((String) packageParams.get("sign")).toLowerCase();
// System.out.println(tenpaySign + " " + mysign);
return tenpaySign.equals(mysign);
}
/**
* @author
* @date 2016-4-22
* @Description:sign簽名
* @param characterEncoding
* 編碼格式
* @param parameters
* 請求參數
* @return
*/
public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + API_KEY);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
/**
* @author
* @date 2016-4-22
* @Description:將請求參數轉換爲xml格式的string
* @param parameters
* 請求參數
* @return
*/
public static String getRequestXml(SortedMap<Object, 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 k = (String) entry.getKey();
String v = (String) entry.getValue();
if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
} else {
sb.append("<" + k + ">" + v + "</" + k + ">");
}
}
sb.append("</xml>");
return sb.toString();
}
/**
* 取出一個指定長度大小的隨機正整數.
*
* @param length
* int 設定所取出隨機數的長度。length小於11
* @return int 返回生成的隨機數。
*/
public static int buildRandom(int length) {
int num = 1;
double random = Math.random();
if (random < 0.1) {
random = random + 0.1;
}
for (int i = 0; i < length; i++) {
num = num * 10;
}
return (int) ((random * num));
}
/**
* 獲取當前時間 yyyyMMddHHmmss
*
* @return String
*/
public static String getCurrTime() {
Date now = new Date();
SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String s = outFormat.format(now);
return s;
}
}
XMLUtil工具類
package com.cloud.server.utils.weixin;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
/**
* xml工具類
*
* @author miklchen
*
*/
public class XMLUtil {
/**
* 解析xml,返回第一級元素鍵值對。如果第一級元素有子節點,則此節點的值是子節點的xml數據。
*
* @param strxml
* @return
* @throws JDOMException
* @throws IOException
*/
public static Map doXMLParse(String strxml) throws JDOMException, IOException {
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 = XMLUtil.getChildrenText(children);
}
m.put(k, v);
}
// 關閉流
in.close();
return m;
}
/**
* 獲取子結點的xml
*
* @param children
* @return String
*/
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(XMLUtil.getChildrenText(list));
}
sb.append(value);
sb.append("</" + name + ">");
}
}
return sb.toString();
}
}
MD5Util工具類
package com.cloud.server.utils.weixin;
import java.security.MessageDigest;
/**
* @author create by yaoyuan
* @date 2017年6月5日 下午8:13:09
*/
public class MD5Util {
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];
}
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 final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}
2 支付寶支付後臺:
/**
*
* @Title: AlipayController.java
* @Package com.sihai.controller
* @Description: 前往支付寶第三方網關進行支付 Copyright: Copyright (c) 2017
* Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY
*
* @author sihai
* @date 2017年8月23日 下午8:50:43
* @version V1.0
*/
@RequestMapping(value = "/server/zfb/goAlipay")
public void goAlipay(Order order, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
throws Exception {
// 獲得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGNTYPE);
// 設置請求參數
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();// 創建API對應的request
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
// 商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
String out_trade_no = order.getRoom_order_id();
// 付款金額,必填
double total_amount = Constant.map_order.get(out_trade_no);
total_amount=0.01;
// 訂單名稱,必填
String subject = order.getHotel_name();
// 該筆訂單允許的最晚付款時間,逾期將關閉交易。取值範圍:1m~15d。m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。
// 該參數數值不接受小數點, 如 1.5h,可轉換爲 90m。
String timeout_express = "1c";
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount
+ "\"," + "\"subject\":\"" + subject + "\"," + "\"timeout_express\":\"" + timeout_express + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
String form = "";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); // 調用SDK生成表單
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
httpResponse.getWriter().write(form);// 直接將完整的表單html輸出到頁面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
// 支付寶異步請求,返回參數
@RequestMapping("/server/zfb/alipayQuery")
@ResponseBody
public String paynotify(HttpServletRequest request,HttpServletResponse response) throws Exception {
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] + ",";
}
//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
params.put(name, valueStr);
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
logger.info("==========/server/zfb/alipayQuery======== "+"Key = " + name + ", Value = " + valueStr);
}
//商戶訂單號
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
// String out_trade_no="O181102112027243644";
logger.info("==========/server/zfb/alipayQuery======== "+"out_trade_no = " + out_trade_no);
//支付寶實際付款金額
// String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
String total_amount = "0.01";
double total_order_money=Double.parseDouble(total_amount);
logger.info("==========/server/zfb/alipayQuery======== "+"total_order_money = " + total_order_money);
HealthUserOrder order = hotelMapper.selOrderInfo(out_trade_no);
String hotel_id=order.getHotel_id();
logger.info("==========/server/zfb/alipayQuery======== "+"hotel_id = " + hotel_id );
//計算得出通知驗證結果
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
logger.info("==========/server/zfb/alipayQuery======== "+"verify_result = " + verify_result);
String ret="";
if(verify_result){//驗證成功
depositOrder(out_trade_no,total_order_money,hotel_id);
// out.clear();
// out.println("success"); //請不要修改或刪除
System.out.println("success");
ret="success";
}else{//驗證失敗
System.out.println("fail");
ret="fail";
}
return ret;
}
AlipayConfig配置:
public class AlipayConfig {
// 商戶appid
public static String APPID = "201802280XXXXXXX";
// 私鑰 pkcs8格式的
public static String RSA_PRIVATE_KEY = "XXXXXX;
// 服務器異步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
public static String notify_url = "http://www.XXXXX.com/server/zfb/alipayQuery";
// 頁面跳轉同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
// 商戶可以自定義同步跳轉地址
public static String return_url = "http://www.xXXXXXX.com/index2.html";
// 請求網關地址
public static String URL = "https://openapi.alipay.com/gateway.do";
// 沙箱地址
// public static String URL = "https://openapi.alipaydev.com/gateway.do";
// 編碼
public static String CHARSET = "UTF-8";
// 返回格式
public static String FORMAT = "json";
// 支付寶公鑰
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0yr87C6BYyHzAmvHZR4d5XCs0AluXhFm7xb4Z9fEMJM1dPxu82KlBcJGy26wnhbprWbex0xzy+vy8YdRF8CLbqFWZC9CpSnNLgBBcIVpsGC5WxAJmZXeYeq6fWq8ycbV72DP07PSLW8TLV6OT8FBBFGWFBfzZUK6Ou37iAlKb+mboODWg9tIt7rps+xsm5kxnH4sJAzbeV0nkh+kk+cLJauqOkrLJnm/bFe2eArJJ9ZOWYbUgE9m35wQwOVsBd89MD4Lx7MwVVyyKn3EdjvXU4xAOgrcCPKr7f5NGk+TnjJt+RLH5ziwCSZXeI9yU4XI3zl28yz13toVMigahdRRTQIDAQAB";
// 日誌記錄目錄
public static String log_path = "/log";
// RSA2
public static String SIGNTYPE = "RSA2";
}
轉載地址:https://blog.csdn.net/leigelg/article/details/80456758
支付寶回調通知頻率:25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h)