package me.xhh.alipay.util; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; /** *功能:支付宝接口公用函数 *详细:该页面是请求、通知返回两个文件所调用的公用函数核心处理文件,不需要修改 *版本:3.0 *修改日期:2010-07-16 '说明: '以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 '该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayBase { /** * 功能:生成签名结果 * @param sArray 要加密的数组 * @param key 安全校验码 * @return 签名结果字符串 */ public static String BuildMysign(Map<String, String> sArray, String key) { String prestr = CreateLinkString(sArray); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 prestr = prestr + key; //把拼接后的字符串再与安全校验码直接连接起来 String mysign = Md5Encrypt.md5(prestr); return mysign; } /** * 功能:除去数组中的空值和签名参数 * @param sArray 加密参数组 * @return 去掉空值与签名参数后的新加密参数组 */ public static Map<String, String> ParaFilter(Map<String, String> sArray){ List<String> keys = new ArrayList<String>(sArray.keySet()); Map<String, String> sArrayNew = new HashMap<String, String>(); for(int i = 0; i < keys.size(); i++){ String key = keys.get(i); String value = sArray.get(key); if(value.equals("") || value == null || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){ continue; } sArrayNew.put(key, value); } return sArrayNew; } /** * 功能:把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * @param params 需要排序并参与字符拼接的参数组 * @return 拼接后字符串 */ public static String CreateLinkString(Map<String, String> params){ List<String> keys = new ArrayList<String>(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = (String) keys.get(i); String value = (String) params.get(key); if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } /** * 功能:把数组所有元素按照“参数=参数值”的模式用“&”字符拼接成字符串 * 应用场景:使用场景:GET方式请求时,对URL的中文进行编码 * @param params 需要排序并参与字符拼接的参数组 * @param input_charset 编码格式 * @return 拼接后字符串 */ public static String CreateLinkString_urlencode(Map<String, String> params, String input_charset){ List<String> keys = new ArrayList<String>(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = (String) keys.get(i); String value = (String) params.get(key); try { prestr = prestr + key + "=" + URLEncoder.encode(value,input_charset) + "&"; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return prestr; } /** * 功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 * 注意:远程解析XML出错,与服务器是否支持SSL等配置有关 * @param partner 合作身份者ID * @return 时间戳字符串 * @throws IOException * @throws DocumentException * @throws MalformedURLException */ @SuppressWarnings("unchecked") public static String query_timestamp(String partner) throws MalformedURLException, DocumentException, IOException { String strUrl = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner; StringBuffer buf1 = new StringBuffer(); SAXReader reader = new SAXReader(); Document doc = reader.read(new URL(strUrl).openStream()); List<Node> nodeList = doc.selectNodes("//alipay/*"); for (Node node : nodeList) { // 截取部分不需要解析的信息 if (node.getName().equals("is_success") && node.getText().equals("T")) { // 判断是否有成功标示 List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*"); for (Node node1 : nodeList1) { buf1.append(node1.getText()); } } } return buf1.toString(); } }