微信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/bFe2eArJJ9ZOWY9m35wQwOVsBd89MD4Lx7MwVVyyKn3EdjvXU4xAOgrcCPKr7f5NGk+TnjJt+RLH5ziwCSZXeI9yU4XI3zl28yz13toVMigahdRRTQIDAQAB";
	// 日志记录目录
	public static String log_path = "/log";
	// RSA2
	public static String SIGNTYPE = "RSA2";

}

 

支付宝回调通知频率:25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动端H5调用微信支付宝支付是一种简单方便的支付方式。用户在网页中选择微信支付宝支付后,会被引导到微信支付宝支付页面,输入支付密码或确认支付即可完成支付。对于商家来说,只需在网页中添加相应的支付接口和配置相关信息,就可以实现H5调用微信支付宝支付功能。这种支付方式适用于各类移动端应用,如电商平台、小程序、线下商户等。 在实现H5调用微信支付宝支付的过程中,需要注意保障支付安全和用户隐私。商家需要通过微信支付宝的官方平台获得相关权限和密钥,确保支付接口的可信性和安全性。同时,还需要遵守相关的法律法规和隐私政策,保护用户的个人信息和支付数据。另外,商家还可以通过设置不同的支付方式、优惠券等方式来吸引用户,提高支付转化率和用户满意度。 在移动端H5调用微信支付宝支付的过程中,还需要考虑支付的实时性和用户体验。商家需要保证支付的及时性和可靠性,避免因网络延迟或其他原因导致支付失败或出现异常情况。同时,还需要考虑用户的支付习惯和支付环境,提供简洁明了的支付流程和友好的界面设计,提高用户支付的便捷性和舒适度。通过合理规划和技术实现,移动端H5调用微信支付宝支付可以成为一种便捷、安全、高效的支付方式,为用户和商家带来更好的支付体验和商业价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值