首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【微信开发】 红包接口开发

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

作者头像
冷冷
发布于 2018-02-08 03:33:39
发布于 2018-02-08 03:33:39
2.8K00
代码可运行
举报
文章被收录于专栏:冷冷冷冷
运行总次数:0
代码可运行

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

分装 红包工具类 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
@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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA移动支付微信和支付宝后台代码
前言:之前接APP支付,微信遇到了一点点坑,为了方便以后copy,把之前写的代码粘贴出来。需要的同学可以参考一下,具体参数说明还请详细查看官方文档:
王念博客
2019/07/25
5.1K0
微信支付-微信红包Java版本
扫描可以关注查看其它接口的demo效果 https://zb.oschina.net/market/opus/1325c0ab3ac1f4b6 代码链接,可根据需求出方案与代码。 需要有认证的公众号,
小帅丶
2018/02/09
12.5K0
微信支付-微信红包Java版本
微信公众号开发之现金红包
在使用现金红包之前,请前往开通现金红包功能。操作路径:【登录微信支付商户平台——>产品中心——>现金红包——>开通】。
Javen
2018/08/21
4.2K0
微信公众号开发之现金红包
Java微信支付快速入门&工具类
快速入门 1、微信支付官方在线API入口: https://pay.weixin.qq.com/wiki/doc/api/index.html 2、微信支付能力介绍: http://action.we
斯武丶风晴
2018/03/01
2.6K0
微信支付-Java-SpringMVC基础一些代码支持
官网文档和demo代码下载地址 https://mp.weixin.qq.com/htmledition/res/bussiness-faq/wx_app_pay.zip 1. 基础常量代码 package com.xiaoshuai.util; /** * 配置类 * @author 小帅帅 * @date 2016-7-5下午01:40:53 */ public class ConfigUtil { /** * 服务号相关信息 */ public final static S
小帅丶
2018/02/08
2K0
微信支付-Java-SpringMVC基础一些代码支持
从零玩转第三方登录之QQ登录
在真正开始对接之前,我们先来聊一聊后台的方案设计。既然是对接第三方登录,那就免不了如何将用户信息保存。首先需要明确一点的是,用户在第三方登录成功之后,
杨不易呀
2022/01/18
2.4K0
从零玩转第三方登录之QQ登录
手把手教你完成App支付JAVA微信支付
这篇内容看标题已经很明确了,由于微信是用xml通讯的,所以这一点比较恶心,各位可能需要在项目里导入一些解析xml的包。 首先放出工具类(包含支付宝用到的工具类),因为现在csdn下载都是扣积分的,因为工具类代码会在文尾贴出。
Java编程指南
2019/08/02
2.5K0
手把手教你完成App支付JAVA微信支付
对接微信付款到银行卡来实现资金提现功能
不管是做APP、电脑网站、手机网站还是小程序,为了推广基本上都离不开用户分佣的场景。
悟空码字
2023/05/26
2.2K1
对接微信付款到银行卡来实现资金提现功能
java接入微信支付的Native方式
前言: 微信有很多种方式,本文章只是讲解如何对接微信支付的Native方式 官方Native方式文档:https://pay.weixin.qq.com/wiki/doc/api/native.ph
蚊子.
2023/08/10
7040
java接入微信支付的Native方式
【java微信支付】微信支付之扫码支付相关代码
最近开发网站过程,需要引入支付过程,第三方支付中最火的莫过于支付宝支付和微信支付,下边借助微信支付官网上的文档,写一下接入微信支付之扫码支付的流程
用户5640963
2019/07/26
5.6K0
php微信公众号开发之现金红包
本文实例为大家分享了php微信公众号之现金红包的具体代码,供大家参考,具体内容如下
用户8664418
2021/07/13
9200
HttpClient 辅助类,简化调用
默认带有的INSTANCE 可以请求所有的HTTPS 和HTTP,使用带有证书的构造函数自己构建的client对象可以请求需要证书验证的HTTPS地址和HTTP。client对象为线程安全的,所以一个client允许在多个线程下使用。不要关闭client对象,否则多个线程使用同一个client就会有问题。
前Thoughtworks-杨焱
2021/12/08
9380
微信扫码支付
一,需要申请公司的微信公众号,以及商户号。然后在商户号中关联微信公众APPID。在商户平台添加扫码支付功能。
故久
2019/12/16
6.9K0
日常开发必备神器 HttpUtil 分享(超详细)
最近在工作中需要在后台调用各种上传、下载、以及第三方服务接口,经过研究决定使用 HttpClient,自己封装了一个 HttpClient 工具类,简单轻松的实现get、post、put、delete 以及上传、下载请求,在此分享给大家。
Java极客技术
2022/12/04
3.6K1
微信支付之微信退款
无论刷卡支付、微信公众号支付、扫码支付、H5支付、APP支付等都有申请退款API并且接口一样,本篇文章就拿刷卡支付中的申请退款API文档举例
Javen
2018/08/21
10.5K0
java-小程序微信支付
哈喽 我是你们的KingYiFan,一直说把微信支付给分享出来一直没有机会。终于闲下来了。听着音乐给你们分享一下。不懂可以随时联系我。。
猿码优创
2019/07/28
3.2K3
抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)
字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。
悟空码字
2021/02/05
5.9K0
微信扫码支付(模式一)微信扫码支付(模式一)
微信扫码支付(模式一) 官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 项目开源地址:http://git.o
Javen
2018/08/21
3.9K0
微信支付之企业付款
付款之前需要充值: 在调用API接口付款或通过微信支付商户平台网页功能操作付款之前需要登录微信支付商户平台,通过网页充值功能充值(商户平台-交易中心)
Javen
2018/08/21
3.4K0
微信支付之企业付款
秒懂HTTPS接口(接口测试篇)
在秒懂HTTPS接口(实现篇)中我们通过Java实现了一个简单的HTTPS项目示例,下面我们来测试下我们上面这个HTTPS接口(Java版)
高楼Zee
2019/07/17
3.4K0
秒懂HTTPS接口(接口测试篇)
相关推荐
JAVA移动支付微信和支付宝后台代码
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档