前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【微信开发】 红包接口开发

【微信开发】 红包接口开发

作者头像
冷冷
发布2018-02-08 11:33:39
2.4K0
发布2018-02-08 11:33:39
举报
文章被收录于专栏:冷冷冷冷

参考网上好几个版本的答案咯~

分装 红包工具类 :

代码语言:javascript
复制
package com.tepusoft.web.weixin.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;

import javax.net.ssl.SSLContext;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
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;
/**
 * @author wangiegie
 * @date 2015年10月19日下午2:07:11
 * @description
 */
public class HongBaoUtil {
	public static final String MCH_ID = ""; // 商户号
	public static final String WXAPPID = ""; // 公众账号appid
	public static final String NICK_NAME = "潍坊特普软件开发有限公司"; // 提供方名称
	public static final String SEND_NAME = "潍坊特普软件"; // 商户名称
	public static final int MIN_VALUE = ; // 红包最小金额 单位:分
	public static final int MAX_VALUE = ; // 红包最大金额 单位:分
	public static final int TOTAL_NUM = 1; // 红包发放人数
	public static final String WISHING = "生日快乐"; // 红包祝福语
	public static final String CLIENT_IP = "182.41.214.82"; // 调用接口的机器IP
	public static final String ACT_NAME = "測試"; // 活动名称
	public static final String REMARK = "红包测试"; // 备注
	public static final String KEY = ""; // 秘钥

	public static final int FAIL = 0; // 领取失败
	public static final int SUCCESS = 1; // 领取成功
	public static final int LOCK = 2; // 已在余额表中锁定该用户的余额,防止领取的红包金额大于预算

	/**
	 * 对请求参数名ASCII码从小到大排序后签名
	 * 
	 * @param params
	 */
	public static void sign(SortedMap<String, String> params) {
		Set<Entry<String, String>> entrys = params.entrySet();
		Iterator<Entry<String, String>> it = entrys.iterator();
		StringBuffer result = new StringBuffer();
		while (it.hasNext()) {
			Entry<String, String> entry = it.next();
			result.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
		}
		result.append("key=").append(KEY);
		params.put("sign", DigestUtils.md5Hex(result.toString()));
	}

	/**
	 * 生成提交给微信服务器的xml格式参数
	 * 
	 * @param params
	 * @return
	 */
	public static String getRequestXml(SortedMap<String, String> params) {
		StringBuffer sb = new StringBuffer();
		sb.append("<xml>");
		Set es = params.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			if ("nick_name".equalsIgnoreCase(k) || "send_name".equalsIgnoreCase(k) || "wishing".equalsIgnoreCase(k)
					|| "act_name".equalsIgnoreCase(k) || "remark".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
				sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
			} else {
				sb.append("<" + k + ">" + v + "</" + k + ">");
			}
		}
		sb.append("</xml>");
		return sb.toString();
	}

	/**
	 * 创建map
	 * 
	 * @param billNo
	 * @param openid
	 * @param userId
	 * @param amount
	 * @return
	 */
	public static SortedMap<String, String> createMap(String openid, String userId, int amount) {
		SortedMap<String, String> params = new TreeMap<String, String>();
		params.put("wxappid", WXAPPID);
		params.put("nonce_str", createNonceStr());
		params.put("mch_billno", createBillNo(userId));
		params.put("mch_id", MCH_ID);
		params.put("nick_name", NICK_NAME);
		params.put("send_name", SEND_NAME);
		params.put("re_openid", openid);
		params.put("total_amount", amount + "");
		params.put("min_value", amount + "");
		params.put("max_value", amount + "");
		params.put("total_num", TOTAL_NUM + "");
		params.put("wishing", WISHING);
		params.put("client_ip", CLIENT_IP);
		params.put("act_name", ACT_NAME);
		params.put("remark", REMARK);
		return params;
	}

	/**
	 * 生成随机字符串
	 * 
	 * @return
	 */
	public static String createNonceStr() {
		return UUID.randomUUID().toString().toUpperCase().replace("-", "");
	}

	/**
	 * 生成商户订单号
	 * 
	 * @param mch_id
	 *            商户号
	 * @param userId
	 *            该用户的userID
	 * @return
	 */
	public static String createBillNo(String userId) {
		// 组成: mch_id+yyyymmdd+10位一天内不能重复的数字
		// 10位一天内不能重复的数字实现方法如下:
		// 因为每个用户绑定了userId,他们的userId不同,加上随机生成的(10-length(userId))可保证这10位数字不一样
		Date dt = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyymmdd");
		String nowTime = df.format(dt);
		int length = 10 - userId.length();
		return MCH_ID + nowTime + userId + getRandomNum(length);
	}

	/**
	 * 生成特定位数的随机数字
	 * 
	 * @param length
	 * @return
	 */
	private static String getRandomNum(int length) {
		String val = "";
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			val += String.valueOf(random.nextInt(10));
		}
		return val;
	}

	/**
	 * post提交到微信服务器
	 *
	 * @param requestXML
	 * @param instream  传入的在微信支付的PKCS12证书的位置
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws CertificateException
	 * @throws IOException
	 * @throws KeyManagementException
	 * @throws UnrecoverableKeyException
	 * @throws KeyStoreException
	 */
	public static String post(String requestXML, InputStream instream) throws Exception {
		KeyStore keyStore = KeyStore.getInstance("PKCS12");
		try {
			keyStore.load(instream, MCH_ID.toCharArray());
		} finally {
			instream.close();
		}
		SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, MCH_ID.toCharArray()).build();
		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
				SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
		CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
		String result = "";
		try {
			HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
			StringEntity reqEntity = new StringEntity(requestXML, "utf-8"); // 如果此处编码不对,可能导致客户端签名跟微信的签名不一致
			reqEntity.setContentType("application/x-www-form-urlencoded");
			httpPost.setEntity(reqEntity);
			CloseableHttpResponse response = httpclient.execute(httpPost);
			try {
				HttpEntity entity = response.getEntity();
				if (entity != null) {
					BufferedReader bufferedReader = new BufferedReader(
							new InputStreamReader(entity.getContent(), "UTF-8"));
					String text;
					while ((text = bufferedReader.readLine()) != null) {
						result += text;
					}
				}
				EntityUtils.consume(entity);
			} finally {
				response.close();
			}
		} finally {
			httpclient.close();
		}
		return result;
	}
}

调用:

代码语言:javascript
复制
@Test
	public void testHongBao() throws Exception {
		SortedMap<String, String> sortedMap = HongBaoUtil.createMap(openId, userId, money);
		HongBaoUtil.sign(sortedMap);
		String postXML = HongBaoUtil.getRequestXml(sortedMap);
		FileInputStream instream = new FileInputStream(new File("证书文件地址"));
		HongBaoUtil.post(postXML, instream);
	}

好咯  ...别被微信支付后台的那么多的配置和参数吓到 ,微信红包开发就是这么简单  ~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档