All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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("
"); for (int i = 0; i < keys.size(); i++) { String name = (String) keys.get(i); String value = (String) sPara.get(name); sbHtml.append(""); } // submit按钮控件请不要含有name属性 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("
"); for (int i = 0; i < keys.size(); i++) { String name = (String) keys.get(i); String value = (String) sPara.get(name); sbHtml.append(""); } sbHtml.append(""); // submit按钮控件请不要含有name属性 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(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy