微信公众平台开发之微信红包的实现
首先需要了解一下微信红包的规则:
1、发送频率规则
◆ 每分钟发送红包数量不得超过1800个;◆ 同一个商户号,每分钟最多给同一个用户发送一个红包;
2、红包规则
◆ 单个红包金额介于[1.00元,200.00元]之间;◆ 同一个红包只能发送给一个用户;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)
以及商户侧调用红包接口流程
1.◆ 下载证书商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书2.◆ 充值发放现金红包将扣除商户的可用余额,请注意,可用余额并不是微信支付交易额,需要预先充值,确保可用余额充足。查看可用余额、充值、提现请登录微信支付商户平台,进入“资金管理”菜单,进行操作
微信红包接口调用流程
◆ 后台API调用:待进入联调过程时与开发进行详细沟通;
◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;
◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;
◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;
◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;
首先编写调用该接口所需要的工具类
package com.beitian.eshop.wx;import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;
import java.util.Map.Entry;import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;/*** 微信开发工具类* <p>作者:Afan</p>* <p>电子邮箱:fan.zt@qq.com</p>* <p>创建时间:2016-5-3 上午11:14:32</p>*/
public class WxFanztUtils {/*** sign签名* <p>Afan</p>* <p>2016-4-29 下午4:28:29</p>* @param map* @param key* @return*/public static String getSign(Map<String, String> map, String key) {String sign = "";Collection<String> keyset = map.keySet();List<String> list = new ArrayList<String>(keyset);// 对key键值按字典升序排序Collections.sort(list);String stringA = "";for (int i = 0; i < list.size(); i++) {if (null == map.get(list.get(i)) || "".equals(map.get(list.get(i)))) {continue;}stringA += list.get(i) + "=" + map.get(list.get(i)) + "&";}stringA += "key=" + key;sign = MD5(stringA).toUpperCase();return sign;}/*** MD5* <p>Afan</p>* <p>2016-5-3 上午9:53:01</p>* @param s* @return*/public static String MD5(String s) {char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try {byte[] btInput = s.getBytes("UTF-8");MessageDigest mdInst = MessageDigest.getInstance("MD5");mdInst.update(btInput);byte[] md = mdInst.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}/*** 生成随机字符* @param iLen :长度* @param iType:0--表示仅获得数字随机数,1--表示仅获得字符随机数,2--表示获得数字字符混合随机数* @return*/public static String BuildRadom(int iLen, int iType) {String strRandom = "";// 随机字符串Random rnd = new Random();if (iLen < 0) {iLen = 5;}if ((iType > 2) || (iType < 0)) {iType = 2;}switch (iType) {case 0:for (int iLoop = 0; iLoop < iLen; iLoop++) {strRandom += Integer.toString(rnd.nextInt(10));}break;case 1:for (int iLoop = 0; iLoop < iLen; iLoop++) {// 将得到的10到35之间的数字转成36进制表示,即a到z的表示strRandom += Integer.toString((10 + rnd.nextInt(26)), 36);}break;case 2:for (int iLoop = 0; iLoop < iLen; iLoop++) {strRandom += Integer.toString(rnd.nextInt(36), 36);}break;}return strRandom;}/*** 参数map转xml格式* * @param params* @return*/public static String paramsToXml(SortedMap<String, String> params) {Document doc = DocumentHelper.createDocument();Element root = doc.addElement("xml");Set<Entry<String, String>> es = params.entrySet();Iterator<Entry<String, String>> it = es.iterator();while (it.hasNext()) {Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();String tmpKey = (String) entry.getKey();String tmpValue = (String) entry.getValue();if (!StringUtils.isEmpty(tmpValue)) {root.addElement(tmpKey).addText(tmpValue);}}return doc.asXML();}
}
实现发红红包的代码:
package com.beitian.eshop.wx;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;import javax.net.ssl.SSLContext;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;/*** 微信开发-->微信现金红包* <p>作者:Afan</p>* <p>电子邮箱:fan.zt@qq.com</p>* <p>创建时间:2016-5-3 上午11:14:32</p>*/
public class WxRedPackageHelper {private final static String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";@SuppressWarnings("deprecation")public static void main(String[] args) throws Exception {Map<String, String> map = new HashMap<String, String>();map.put("nonce_str", WxFanztUtils.BuildRadom(32,2));//随机字符串map.put("mch_billno", "10000098201411111234567890");map.put("mch_id", WxConfig.WX_MERCH_ID);//商户号map.put("wxappid", WxConfig.WX_APPID);//公众账号appidmap.put("send_name", "安鑫宝");//商户名map.put("re_openid", "oA5zmtxy5NAuYF-Y_q9m5U--V4sE");//用户openidmap.put("total_amount", "100");//金额,单位分map.put("total_num", "1");//数量map.put("wishing", "感谢您参加猜灯谜活动,祝您元宵节快乐!");//红包祝福语map.put("client_ip", "192.168.0.1");map.put("act_name", "猜灯谜抢红包活动");//活动名称map.put("remark", "猜越多得越多,快来抢!");//备注String sign = WxFanztUtils.getSign(map, WxConfig.WX_MERCH_API_KEY);//keymap.put("sign", sign);SortedMap<String, String> map2 = new TreeMap<String, String>(map);String postXml = WxFanztUtils.paramsToXml(map2);KeyStore keyStore = KeyStore.getInstance("PKCS12");FileInputStream instream = new FileInputStream(new File("E:/Afan/weixin/apiclient_cert.p12"));try {keyStore.load(instream, WxConfig.WX_MERCH_ID.toCharArray());//WxConfig.WX_MERCH_ID//商户号} finally {instream.close();}SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, WxConfig.WX_MERCH_ID.toCharArray()).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {HttpPost httpost=new HttpPost(url);httpost.addHeader("Connection", "keep-alive");httpost.addHeader("Accept", "*/*");httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");httpost.addHeader("Host", "api.mch.weixin.qq.com");httpost.addHeader("X-Requested-With", "XMLHttpRequest");httpost.addHeader("Cache-Control", "max-age=0");httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");httpost.setEntity(new StringEntity(postXml, "utf-8"));CloseableHttpResponse response = httpclient.execute(httpost);try {HttpEntity entity = response.getEntity();System.out.println("----------------------------------------");System.out.println(response.getStatusLine());if (entity != null) {System.out.println("Response content length: " + entity.getContentLength());BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));String text;while ((text = bufferedReader.readLine()) != null) {System.out.println(text);}}EntityUtils.consume(entity);} finally {response.close();}}finally {httpclient.close();}}}
需要注意的是调用微信红包接口需要再本地导入证书,证书的下载微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>证书下载 。证书文件有四个:
双击导入apiclient_cert.p12,密码为你的商户号
运行main方法,服务器返回:
打开微信,收取红包。
微信公众平台开发之微信红包的实现相关推荐
- 视频教程-微信公众平台开发入门-微信开发
微信公众平台开发入门 订阅后,请点击此处观看大牛全套视频课程:课程播放页链接 价格可能因活动略有浮动 刘运强 ¥39.00 立即订阅视频课 订阅后:请点击此处观看视频课程 视频教程-微信公众平台开发入 ...
- 微信公众平台开发[2] —— 微信端分享功能
背景 初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客.问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的小白一点帮助. 今 ...
- php 微信公众平台开发之微信群发信息
这篇文章主要为大家详细介绍了php微信公众平台开发之微信群发信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片 ...
- 微信公众平台开发(110) 微信连Wi-Fi
微信连Wi-Fi是为商家的线下场所提供一套完整和便捷的微信连Wi-Fi的方案.商家接入微信连Wi-Fi后,顾客无需输入繁琐的Wi-Fi密码,通过微信扫二维码等方式即可快速上网.微信连Wi-Fi还帮助商 ...
- 微信公众平台开发(121) 微信二维码海报
关键字:微信公众平台 二维码 海报 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-poster.html 本文介绍微信公众平台下二维码海报的 ...
- java获取微信用户源码_Java微信公众平台开发(十)--微信用户信息的获取
前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...
- 微信公众平台开发 mysql_微信公众平台开发数据库操作
一.简介 前面讲解的功能开发都是简单的调用API 完成的,没有对数据库进行操作.在接下来的高级功能开发中,需要使用到数据库,所以在这一篇中,将对MySQL 数据库的操作做一下简单的介绍,以供读者参考. ...
- Java微信公众平台开发(十)--微信自定义菜单的创建实现
转自:http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自 ...
- 微信公众平台开发之微信access_token如何有效长期保存
随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数ac ...
- 微信公众平台开发(2)--微信认证流程图文详解
点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 微信认证的作用 2. 登录 3. 开始认证 4. 认证流程 4.1 准备资料 4.2 同意协议 4.3 ...
最新文章
- P2119 魔法阵(优化枚举,数学运算优化)难度⭐⭐⭐★
- 中国队刷新知识图谱“世界杯”,但点开冠军团队一看,我愣住了
- 让Socket穿透Windows防火墙
- 从java里调用r jri的设置方法_从Java里调用R – JRI的设置方法
- 微软把UWP定位成业务线应用程序开发平台
- 安全使用计算机事例,计算机安全案例分析.ppt
- uni-app中的样式
- mysql 大小写敏感设置_MySQL 中的大小写敏感设置
- Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源代码分析
- linux grep 正则 id,浅谈Linux grep与正则表达式
- 前端面试有这几篇就够了--HTML篇
- JAVA三大框架入门
- 密码正确登入不了网络计算机,windows远程登录密码正确但登录不上
- CPU性能测试分析MIPS、DMIPS
- 《计算机网络:自顶向下方法》阅读笔记
- 嵌入式Qt-做一个秒表
- mysql如何上传音频文件_如何上传本地音乐获取MP3外链(欢迎分享和转载)
- android7.1刷supersu,Android怎么刷SuperSU 安卓系统刷SuperSU Pro教程
- 如何升级npm的版本
- 凯光dk4000说明书_《凯光dk4000烟弹》用户正在提问-魔笛moti行业门户网