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();
}
}