微信红包接口开发,其实不是很难,不要被他的表象吓到了,参考网上好几个版本的答案咯~,特地分享如下
分装 红包工具类 :
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中文网其它相关文章!
最佳 Windows 性能的顶级免费优化软件
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。