java请求https

// 这是微信的请求发红包的接口,需要下载秘钥文件的

package com.wx.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Properties;
import java.util.UUID;

import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class SendRedBagUtils {
	private static Properties prop = new Properties();
	static {
		try {
			// 读取属性文件a.properties
			InputStream in = SendRedBagUtils.class
					.getResourceAsStream("/redBagConfig.properties");
			BufferedReader bf = new BufferedReader(new    InputStreamReader(in)); 
			prop.load(bf);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	// 全局数组
	private static final String mchId = prop.getProperty("mchId"); // 商户号
	private static final String wxappid = prop.getProperty("wxappid");
	private static final String nickName = prop.getProperty("nickName");// 提供方名称
	private static final String sendName = prop.getProperty("sendName");// 商户名称
	private static final String totalAmount = prop.getProperty("totalAmount"); // 付款金额
	private static final String minValue = prop.getProperty("minValue");// 最小红包金额
	private static final String maxValue = prop.getProperty("maxValue");// 最大红包金额
	private static final String totalNum = prop.getProperty("totalNum");// 红包发送人数
	private static final String wishing = prop.getProperty("wishing");// 祝福语
	private static final String clientIp = prop.getProperty("clientIp");// 调用接口的地址ip
	private static final String actName = prop.getProperty("actName");// 活动名字
	private static final String remark = prop.getProperty("remark");// 备注
	private static final String actId = prop.getProperty("actId");// 活动ID
	private static final String key = prop.getProperty("key");// 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

	// 发送红包的方法 URLEncoder.encode("", "UTF-8")
	public static void sendRedEn(HttpServletRequest request, String reOpenid)
			throws Exception {
		// 存放键值对的map
		HashMap<String, String> hm = getSign(reOpenid);
		// 设置请求参数
		StringBuffer sb = new StringBuffer();
		sb.append("<xml>");
		sb.append("<sign><![CDATA[" + hm.get("sign") + "]]></sign>");
		sb.append("<mch_billno><![CDATA[" + hm.get("mch_billno")
				+ "]]></mch_billno>");
		sb.append("<mch_id><![CDATA[" + hm.get("mch_id") + "]]></mch_id>");
		sb.append("<wxappid><![CDATA[" + hm.get("wxappid") + "]]></wxappid>");
		sb.append("<nick_name><![CDATA[" + hm.get("nick_name")
				+ "]]></nick_name>");
		sb.append("<send_name><![CDATA[" + hm.get("send_name")
				+ "]]></send_name>");
		sb.append("<re_openid><![CDATA[" + hm.get("re_openid")
				+ "]]></re_openid>");
		sb.append("<total_amount><![CDATA[" + hm.get("total_amount")
				+ "]]></total_amount>");
		sb.append("<min_value><![CDATA[" + hm.get("min_value")
				+ "]]></min_value>");
		sb.append("<max_value><![CDATA[" + hm.get("max_value")
				+ "]]></max_value>");
		sb.append("<total_num><![CDATA[" + hm.get("total_num")
				+ "]]></total_num>");
		sb.append("<wishing><![CDATA[" + hm.get("wishing") + "]]></wishing>");
		sb.append("<client_ip><![CDATA[" + hm.get("client_ip")
				+ "]]></client_ip>");
		sb.append("<act_name><![CDATA[" + hm.get("act_name") + "]]></act_name>");
		sb.append("<act_id><![CDATA[" + hm.get("act_id") + "]]></act_id>");
		sb.append("<remark><![CDATA[" + hm.get("remark") + "]]></remark>");
		sb.append("<nonce_str><![CDATA[" + hm.get("nonce_str")
				+ "]]></nonce_str>");
		sb.append("</xml>");
		System.out.println(sb.toString());
		System.setProperty("proxyHost", "proxy.zte.com.cn");
		System.setProperty("proxyPort", "80");
		System.setProperty("proxyUser", "0236000061");
		System.setProperty("proxyPassword", "lijielove520!");

		KeyStore keyStore = KeyStore.getInstance("PKCS12");
		String realPath = request.getSession().getServletContext()
				.getRealPath("")
				+ File.separator + "file";
		FileInputStream instream = new FileInputStream(new File(realPath
				+ File.separator + "apiclient_cert.p12"));
		try {
			keyStore.load(instream, mchId.toCharArray());
		} finally {
			instream.close();
		}

		// Trust own CA and all self-signed certs
		SSLContext sslcontext = SSLContexts.custom()
				.loadKeyMaterial(keyStore, mchId.toCharArray()).build();
		// Allow TLSv1 protocol only
		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
				sslcontext, new String[] { "TLSv1" }, null,
				SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

		CloseableHttpClient httpclient = HttpClients.custom()
				.setSSLSocketFactory(sslsf).build();

		HttpPost httppost = new HttpPost(
				"https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
		StringEntity entity = new StringEntity(sb.toString(), "utf-8");
		httppost.setEntity(entity);
		HttpResponse response = httpclient.execute(httppost);
		HttpEntity resEntity = response.getEntity();
		if (resEntity != null) {
			String result = EntityUtils.toString(resEntity);
			System.out.println(result);
		}
	}

	/**
	 * 获取32随机码
	 * 
	 * @return
	 */
	public static String getRand() {
		String uuid = UUID.randomUUID().toString();
		uuid = uuid.replaceAll("-", "");
		return uuid;
	}

	/**
	 * 获取商户订单号 mch_id+yyyymmdd+10位一天内不能重复的数字。
	 * 
	 * @param args
	 */
	public static String getMchBillno(String mchId) {
		StringBuffer sb = new StringBuffer();
		sb.append(mchId);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String time = sdf.format(new Date());
		sb.append(time);
		// 获取10位不重复数据
		String rand = getRand();
		rand = rand.substring(0, 10);
		sb.append(rand);
		return sb.toString();
	}

	/**
	 * 获取sign值
	 * 
	 * @param args
	 */
	public static HashMap<String, String> getSign(String reOpenid) {
		HashMap<String, String> hm = new HashMap<String, String>();
		ArrayList<String> kl = new ArrayList<String>();
		// 随机数
		String nonceStr = getRand();
		hm.put("nonce_str", nonceStr);
		kl.add("nonce_str");
		// 商户号
		hm.put("mch_id", mchId);
		kl.add("mch_id");
		// 商品订单号
		String mchBillno = getMchBillno(mchId);
		hm.put("mch_billno", mchBillno);
		kl.add("mch_billno");
		// 公众账号appid
		hm.put("wxappid", wxappid);
		kl.add("wxappid");
		// 提供方名称
		hm.put("nick_name", nickName);
		kl.add("nick_name");
		// 商户名称
		hm.put("send_name", sendName);
		kl.add("send_name");
		// 接受红包的用户openid
		hm.put("re_openid", reOpenid);
		kl.add("re_openid");
		// 付款金额
		hm.put("total_amount", totalAmount);
		kl.add("total_amount");
		// 最小红包金额
		hm.put("min_value", minValue);
		kl.add("min_value");
		// 最大红包金额
		hm.put("max_value", maxValue);
		kl.add("max_value");
		// 红包发送人数
		hm.put("total_num", totalNum);
		kl.add("total_num");
		// 祝福语
		hm.put("wishing", wishing);
		kl.add("wishing");
		// 调用接口的地址ip
		hm.put("client_ip", clientIp);
		kl.add("client_ip");
		// 活动名字
		hm.put("act_name", actName);
		kl.add("act_name");
		// 备注
		hm.put("remark", remark);
		kl.add("remark");
		// 活动ID
		hm.put("act_id", actId);
		kl.add("act_id");
		// 排序
		String[] kls = kl.toArray(new String[] {});
		Arrays.sort(kls);
		// 拼接处待加密的String
		StringBuffer sb = new StringBuffer();
		for (String k : kls) {
			sb.append(k);
			sb.append("=");
			sb.append(hm.get(k));
			sb.append("&");
		}
		// 把stringA与上key
		String stringSignTemp = sb.toString() + "key=" + key;
		System.out.println(stringSignTemp);
		// 进行MD5加密然后转为大写
		String sign = DigestUtils.md5Hex(stringSignTemp);
		hm.put("sign", sign.toUpperCase());
		return hm;
	}
}

猜你喜欢

转载自lijie-insist.iteye.com/blog/2236364