================================================ ================================================ ======
AlipayFunction.java
package com.test.util.alipay;
import java.io.FileWriter;
import java.io.IOException;
import https://www.wendangku.net/doc/1012307842.html,.MalformedURLException;
import https://www.wendangku.net/doc/1012307842.html,.URL;
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;
public class AlipayFunction {
/**
* 功能:生成签名结果
* @param sArray 要签名的数组
* @param key 安全校验码
* @return签名结果字符串
*/
public static String BuildMysign(Map sArray, String key) {
String prestr = CreateLinkString(sArray); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
prestr = prestr + key; //把拼接后的字符串再与安全校验码直接连接起来
String mysign = Md5Encrypt.md5(prestr);
return mysign;
}
/**
* 功能:除去数组中的空值和签名参数
* @param sArray 签名参数组
* @return去掉空值与签名参数后的新签名参数组
*/
public static Map ParaFilter(Map sArray){
List keys = new ArrayList(sArray.keySet());
Map sArrayNew = new HashMap();
for(int i = 0; i < keys.size(); i++){
String key = (String) keys.get(i);
String value = (String) sArray.get(key);
if( value == null|| value.equals("") ||
key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign _type")){
continue;
}
sArrayNew.put(key, value);
}
return sArrayNew;
}
/**
* 功能:把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param params 需要排序并参与字符拼接的参数组
* @return拼接后字符串
*/
public static String CreateLinkString(Map params){
List keys = new ArrayList(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;
}
/**
* 功能:写日志,方便测试(看网站需求,也可以改成把记录存入数据库)* @param sWord 要写入日志里的文本内容
*/
public static void LogResult(String sWord){
// 该文件存在于和应用服务器启动文件同一目录下,文件名是alipay log加服务器时间
try{
FileWriter writer = new FileWriter("D:\\alipay_log" + System.curr entTimeMillis() + ".txt");
writer.write(sWord);
writer.close();
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* 功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数* 注意:远程解析XML出错,与服务器是否支持SSL等配置有关
* @param partner 合作身份者ID
* @return时间戳字符串
* @throws IOException
* @throws DocumentException
* @throws MalformedURLException
*/
public static String query_timestamp(String partner)
throws MalformedURLException, DocumentException, IOException {
String strUrl = "https://https://www.wendangku.net/doc/1012307842.html,/gateway.do?service=query_times tamp&partner="+partner;
StringBuffer buf1 = new StringBuffer();
SAXReader reader = new SAXReader();
Document doc = reader.read(new URL(strUrl).openStream());
List
for(Node node : nodeList) {
// 截取部分不需要解析的信息
if(node.getName().equals("is_success")
&& node.getText().equals("T")) {
// 判断是否有成功标示
List
for(Node node1 : nodeList1) {
buf1.append(node1.getText());
}
}
}
return buf1.toString();
}
}
================================================ ================================================ ======
AlipayNotify.java
package com.test.util.alipay;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import https://www.wendangku.net/doc/1012307842.html,.HttpURLConnection;
import https://www.wendangku.net/doc/1012307842.html,.URL;
import java.util.Map;
import com.test.constants.AlipayConfig;
public class AlipayNotify {
/**
* *功能:根据反馈回来的信息,生成签名结果
* @param Params 通知返回来的参数数组
* @param key 安全校验码
* @return生成的签名结果
*/
public static String GetMysign(Map Params, String key){
Map sParaNew = AlipayFunction.ParaFilter(Params);//过滤空值、sign与sign_type参数
String mysign = AlipayFunction.BuildMysign(sParaNew, key);//获得签名结果
return mysign;
}
/**
* *功能:获取远程服务器ATN结果,验证返回URL
* @param notify_id 通知校验ID
* @return服务器ATN结果
* 验证结果集:
* invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空
* true 返回正确信息
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
public static String Verify(String notify_id){
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
String transport = AlipayConfig.transport;
String partner = AlipayConfig.partner;
String veryfy_url = "";
if(transport.equalsIgnoreCase("https")){
veryfy_url = "https://https://www.wendangku.net/doc/1012307842.html,/cooperate/gateway.do?service =notify_verify";
} else{
veryfy_url = "https://www.wendangku.net/doc/1012307842.html,/trade/notify_query.do?";
}
veryfy_url = veryfy_url + "&partner=" + partner + "?ify_id=" + notif y_id;
String responseTxt = CheckUrl(veryfy_url);
return responseTxt;
}
/**
* *功能:获取远程服务器ATN结果
* @param urlvalue 指定URL路径地址
* @return服务器ATN结果
* 验证结果集:
* invalid命令参数不对出现这个错误,请检测返回处理中partner和key是否为空
* true 返回正确信息
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
public static String CheckUrl(String urlvalue){
String inputLine = "";
try{
URL url = new URL(urlvalue);
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream()));
inputLine = in.readLine().toString();
} catch(Exception e) {
e.printStackTrace();
}
return inputLine;
}
}
================================================ ================================================ ======
AlipayService.java
package com.test.util.alipay;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayService {
/**
* 功能:构造表单提交HTML
* @param partner 合作身份者ID
* @param seller_email 签约支付宝账号或卖家支付宝帐户
* @param return_url 付完款后跳转的页面要用以http开头格式的完整路径,不允许加?id=123这类自定义参数
* @param notify_url 交易过程中服务器通知的页面要用以http开格式的完整路径,不允许加?id=123这类自定义参数
* @param show_url 网站商品的展示地址,不允许加?id=123这类自定义参数
* @param out_trade_no 请与贵网站订单系统中的唯一订单号匹配
* @param subject 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
* @param body 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
* @param total_fee 订单总金额,显示在支付宝收银台里的“应付总额”里* @param paymethod 默认支付方式,四个值可选:bankPay(网银); cartoo n(卡通); directPay(余额); CASH(网点支付)
* @param defaultbank 默认网银代号,代号列表见https://www.wendangku.net/doc/1012307842.html,/read.ph p?tid=8681379
* @param encrypt_key 防钓鱼时间戳
* @param exter_invoke_ip 买家本地电脑的IP地址
* @param extra_common_param 自定义参数,可存放任何内容(除等特殊字符外),不会显示在页面上
* @param buyer_email 默认买家支付宝账号
* @param royalty_type 提成类型,该值为固定值:10,不需要修改
* @param royalty_parameters 提成信息集,与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
* @param input_charset 字符编码格式目前支持GBK 或utf-8
* @param key 安全校验码
* @param sign_type 签名方式不需修改
* @param key 安全校验码
* @return表单提交HTML文本
*/
public static String BuildForm(String partner,
String seller_email,
String return_url,
String notify_url,
String show_url,
String out_trade_no,
String subject,
String body,
String total_fee,
String paymethod,
String defaultbank,
String anti_phishing_key,
String exter_invoke_ip,
String extra_common_param,
String buyer_email,
String royalty_type,
String royalty_parameters,
String input_charset,
String key,
String sign_type,
String it_b_pay){
Map sPara = new HashMap();
sPara.put("service","create_direct_pay_by_user");
sPara.put("payment_type","1");
sPara.put("partner", partner);
sPara.put("seller_email", seller_email);
sPara.put("return_url", return_url);
sPara.put("notify_url", notify_url);
sPara.put("_input_charset", input_charset);
sPara.put("show_url", show_url);
sPara.put("out_trade_no", out_trade_no);
sPara.put("subject", subject);
sPara.put("body", body);
sPara.put("total_fee", total_fee);
sPara.put("paymethod", paymethod);
sPara.put("defaultbank", defaultbank);
sPara.put("anti_phishing_key", anti_phishing_key);
sPara.put("exter_invoke_ip", exter_invoke_ip);
sPara.put("extra_common_param", extra_common_param);
sPara.put("buyer_email", buyer_email);
sPara.put("royalty_type", royalty_type);
sPara.put("royalty_parameters", royalty_parameters);
sPara.put("it_b_pay", it_b_pay);
Map sParaNew = AlipayFunction.ParaFilter(sPara); //除去数组中的空值和签名参数
String mysign = AlipayFunction.BuildMysign(sParaNew, key);//生成签名结果
StringBuffer sbHtml = new StringBuffer();
List keys = new ArrayList(sParaNew.keySet());
String gateway = "https://https://www.wendangku.net/doc/1012307842.html,/cooperate/gateway.do?";
//GET方式传递
//sbHtml.append("