首页 微信小程序 小程序开发 小程序之红包接口开发实例代码

小程序之红包接口开发实例代码

May 27, 2017 pm 02:25 PM

微信红包接口开发,其实不是很难,不要被他的表象吓到了,参考网上好几个版本的答案咯~,特地分享如下

分装 红包工具类 :

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;
}
}
登录后复制

调用:

@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);
}
登录后复制

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

【相关推荐】

1. 分享小程序开发调用接口的实例教程

2. 微信小程序支付接口的实例详解

3. 微信开发之微信支付

以上是小程序之红包接口开发实例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
使用Python开发微信小程序 使用Python开发微信小程序 Jun 17, 2023 pm 06:34 PM

随着移动互联网技术和智能手机的普及,微信成为了人们生活中不可或缺的一个应用。而微信小程序则让人们可以在不需要下载安装应用的情况下,直接使用小程序来解决一些简单的需求。本文将介绍如何使用Python来开发微信小程序。一、准备工作在使用Python开发微信小程序之前,需要安装相关的Python库。这里推荐使用wxpy和itchat这两个库。wxpy是一个微信机器

实现微信小程序中的卡片翻转特效 实现微信小程序中的卡片翻转特效 Nov 21, 2023 am 10:55 AM

实现微信小程序中的卡片翻转特效在微信小程序中,实现卡片翻转特效是一种常见的动画效果,可以提升用户体验和界面交互的吸引力。下面将具体介绍如何在微信小程序中实现卡片翻转的特效,并提供相关代码示例。首先,需要在小程序的页面布局文件中定义两个卡片元素,一个用于显示正面内容,一个用于显示背面内容,具体示例代码如下:&lt;!--index.wxml--&gt;&l

小程序能用react吗 小程序能用react吗 Dec 29, 2022 am 11:06 AM

小程序能用react,其使用方法:1、基于“react-reconciler”实现一个渲染器,生成一个DSL;2、创建一个小程序组件,去解析和渲染DSL;3、安装npm,并执行开发者工具中的构建npm;4、在自己的页面中引入包,再利用api即可完成开发。

支付宝上线'汉字拾光-生僻字”小程序,用于征集、补充生僻字库 支付宝上线'汉字拾光-生僻字”小程序,用于征集、补充生僻字库 Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,蚂蚁集团宣布启动“汉字拾光计划”,最近又迎来新进展:支付宝上线“汉字拾光-生僻字”小程序,用于向社会征集生僻字,补充生僻字库,同时提供不同的生僻字输入体验,以帮助完善支付宝内的生僻字输入方法。目前,用户搜索“汉字拾光”、“生僻字”等关键词就可以进入“生僻字”小程序。在小程序里,用户可以提交尚未被系统识别录入的生僻字图片,支付宝工程师在确认后,将会对字库进行补录入。本站注意到,用户还可以在小程序体验最新的拆字输入法,这一输入法针对读音不明确的生僻字设计。用户拆

uniapp如何实现小程序和H5的快速转换 uniapp如何实现小程序和H5的快速转换 Oct 20, 2023 pm 02:12 PM

uniapp如何实现小程序和H5的快速转换,需要具体代码示例近年来,随着移动互联网的发展和智能手机的普及,小程序和H5成为了不可或缺的应用形式。而uniapp作为一个跨平台的开发框架,可以在一套代码的基础上,快速实现小程序和H5的转换,大大提高了开发效率。本文将介绍uniapp如何实现小程序和H5的快速转换,并给出具体的代码示例。一、uniapp简介unia

用Python编写简单的聊天程序教程 用Python编写简单的聊天程序教程 May 08, 2023 pm 06:37 PM

实现思路x01服务端的建立首先,在服务端,使用socket进行消息的接受,每接受一个socket的请求,就开启一个新的线程来管理消息的分发与接受,同时,又存在一个handler来管理所有的线程,从而实现对聊天室的各种功能的处理x02客户端的建立客户端的建立就要比服务端简单多了,客户端的作用只是对消息的发送以及接受,以及按照特定的规则去输入特定的字符从而实现不同的功能的使用,因此,在客户端这里,只需要去使用两个线程,一个是专门用于接受消息,一个是专门用于发送消息的至于为什么不用一个呢,那是因为,只

教你如何在小程序中用公众号模板消息(附详细思路) 教你如何在小程序中用公众号模板消息(附详细思路) Nov 04, 2022 pm 04:53 PM

本篇文章给大家带来了关于微信小程序的相关问题,其中主要介绍了如何在小程序中用公众号模板消息,下面一起来看一下,希望对大家有帮助。

PHP与小程序的地理位置定位与地图显示 PHP与小程序的地理位置定位与地图显示 Jul 04, 2023 pm 04:01 PM

PHP与小程序的地理位置定位与地图显示地理位置定位与地图显示在现代科技中已经成为了必备的功能之一。随着移动设备的普及,人们对于定位和地图显示的需求也越来越高。在开发过程中,PHP和小程序是常见的两种技术选择。本文将为大家介绍PHP与小程序中的地理位置定位与地图显示的实现方法,并附上相应的代码示例。一、PHP中的地理位置定位在PHP中,我们可以使用第三方地理位

See all articles