com.alipay.util.AlipaySubmit Maven / Gradle / Ivy
/**
* Copyright (c) 2012-present 铭软科技(mingsoft.net)
* 本软件及相关文档文件(以下简称“软件”)的版权归 铭软科技 所有
* 遵循 铭软科技《服务协议》中的《保密条款》
*/
package com.alipay.util;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import com.alipay.sign.MD5;
import net.mingsoft.base.constant.Const;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
/* *
*类名:AlipaySubmit
*功能:支付宝各接口请求提交类
*详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据
*版本:3.3
*日期:2012-08-13
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipaySubmit {
/**
* 支付宝提供给商户的服务接入网关URL(新)
*/
private static final String ALIPAY_GATEWAY_NEW = "https://mapi.alipay.com/gateway.do?";
/**
* 生成签名结果
*
* @param sPara
* 要签名的数组
* @return 签名结果字符串
*/
public static String buildRequestMysign(Map sPara, String key) {
String prestr = AlipayCore.createLinkString(sPara); // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
String mysign = MD5.sign(prestr, key, Const.UTF8);
return mysign;
}
/**
* 生成要请求给支付宝的参数数组
*
* @param sParaTemp
* 请求前的参数数组
* @return 要请求的参数数组
*/
private static Map buildRequestPara(Map sParaTemp) {
String key = sParaTemp.get("ckey")+"";
// 除去数组中的空值和签名参数
Map sPara = AlipayCore.paraFilter(sParaTemp);
// 生成签名结果
String mysign = buildRequestMysign(sPara, key);
// 签名结果与签名方式加入请求提交参数组中
sPara.put("sign", mysign);
sPara.put("sign_type","MD5");
return sPara;
}
/**
* 建立请求,以表单HTML形式构造(默认)
*
* @param sParaTemp
* 请求参数数组
* @param strMethod
* 提交方式。两个值可选:post、get
* @param strButtonName
* 确认按钮显示文字
* @return 提交表单HTML文本
*/
public static String buildRequest(Map sParaTemp, String strMethod, String strButtonName) {
// 待请求参数数组
Map sPara = buildRequestPara(sParaTemp);
List keys = new ArrayList(sPara.keySet());
StringBuffer sbHtml = new StringBuffer();
sbHtml.append("");
sbHtml.append("");
return sbHtml.toString();
}
/**
* 建立请求,以表单HTML形式构造,带文件上传功能
*
* @param sParaTemp
* 请求参数数组
* @param strMethod
* 提交方式。两个值可选:post、get
* @param strButtonName
* 确认按钮显示文字
* @param strParaFileName
* 文件上传的参数名
* @return 提交表单HTML文本
*/
public static String buildRequest(Map sParaTemp, String strMethod, String strButtonName,
String strParaFileName) {
// 待请求参数数组
Map sPara = buildRequestPara(sParaTemp);
List keys = new ArrayList(sPara.keySet());
StringBuffer sbHtml = new StringBuffer();
sbHtml.append("");
return sbHtml.toString();
}
/**
* 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
* 如果接口中没有上传文件参数,那么strParaFileName与strFilePath设置为空值 如:buildRequest("",
* "",sParaTemp)
*
* @param strParaFileName
* 文件类型的参数名
* @param strFilePath
* 文件路径
* @param sParaTemp
* 请求参数数组
* @return 支付宝处理结果
* @throws Exception
*/
public static String buildRequest(String strParaFileName, String strFilePath, Map sParaTemp)
throws Exception {
// 待请求参数数组
Map sPara = buildRequestPara(sParaTemp);
cn.hutool.http.HttpRequest r = cn.hutool.http.HttpRequest
.post(ALIPAY_GATEWAY_NEW + "_input_charset=" + Const.UTF8)
.form(sPara)
.header("Content-Type",
"application/x-www-form-urlencoded; text/html; charset=" + Const.UTF8)
.header("User-Agent", "Mozilla/4.0");
cn.hutool.http.HttpResponse res = r.execute();
if (res == null) {
return null;
}
return res.body();
}
/**
* MAP类型数组转换成NameValuePair类型
*
* @param properties
* MAP类型数组
* @return NameValuePair类型数组
*/
private static NameValuePair[] generatNameValuePair(Map properties) {
NameValuePair[] nameValuePair = new NameValuePair[properties.size()];
int i = 0;
for (Map.Entry entry : properties.entrySet()) {
nameValuePair[i++] = new BasicNameValuePair(entry.getKey(), entry.getValue());
}
return nameValuePair;
}
/**
* 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 注意:远程解析XML出错,与服务器是否支持SSL等配置有关
*
* @return 时间戳字符串
* @throws IOException
* @throws DocumentException
* @throws MalformedURLException
*/
public static String queryTimestamp() throws MalformedURLException, DocumentException, IOException {
// 构造访问query_timestamp接口的URL串
String strUrl = ALIPAY_GATEWAY_NEW + "service=query_timestamp&partner=" + "测试-商家合作编号" + "&_input_charset"
+ Const.UTF8;
StringBuffer result = new StringBuffer();
SAXReader reader = new SAXReader();
Document doc = reader.read(new URL(strUrl).openStream());
List nodeList = doc.selectNodes("//alipay/*");
for (Node node : nodeList) {
// 截取部分不需要解析的信息
if (node.getName().equals("is_success") && node.getText().equals("T")) {
// 判断是否有成功标示
List nodeList1 = doc.selectNodes("//response/timestamp/*");
for (Node node1 : nodeList1) {
result.append(node1.getText());
}
}
}
return result.toString();
}
}