微信H5支付和支付寶手機支付 前臺+後臺

前臺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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章