首页

源码搜藏网

首页 > 微信小程序 > 微信小程序开发教程 >

微信小程序开发使用企业支付接口来实现发红包示例教程

创建时间:2018-08-09 16:22  浏览

文章开头先提一点,如果小程序可以开通企业支付接口,那推荐直接使用企业支付接口来实现红包的功能,小程序链接公众号通过公众号的红包接口来实现是非常坑爹的一件事。

微信企业支付接口:https://pay.weixin.qq.com/wiki/d ... ay.php?chapter=14_1,使用这个接口需要开通支付权限。

本文说下如果联通小程序和公众号来实现发红包。

首先你需要一个公众号和小程序。在小程序中发送必须先关注公众号。这样你就可以使用公众号的红包接口给用户发送红包。

原理:

微信小程序开发使用企业支付接口来实现发红包示例教程 

当小程序和公众号关联时,每一个用户在小程序和公众号共有一个union_id,但open_id是不同的,所以在需要发红包是首先获得小程序的open_id和union_id,根据union_id的唯一性获取公众号的open_id,再调用公众号的红包接口(https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack)就可以实现.

附上参数对象代码:
  1. //创建参数Map
  2. public static SortedMap<Object, Object> getWithdrawParam(String openid, int value) {
  3.     SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
  4.     parameters.put("mch_appid", PropertyUtil.getInstance().getProperty("wx.appid"));//公众号appid
  5.     parameters.put("mchid", PropertyUtil.getInstance().getProperty("wx.mchid"));//绑定的商户号
  6.     parameters.put("nonce_str", StringUtil.getRandomString(16));随机字符串16位
  7.     parameters.put("partner_trade_no", RandomStringUtils.randomAlphanumeric(20));//商户订单号
  8.     parameters.put("openid", openid);//用户open_id
  9.     parameters.put("check_name", "NO_CHECK");//是否对用户实名认证,NO_CHECK表示否。
  10.     parameters.put("amount", value);//金额
  11.     parameters.put("desc", "红包");//描述信息
  12.     parameters.put("spbill_create_ip", PropertyUtil.getInstance().getProperty("wx.requestUrl"));//Ip地址,这个IP必须在公众号的白名单中,否则会失败!!!
  13.     return parameters;
  14. }
  15. //创建sign ,参数为UTF-8编码和上面的参数Map
  16.  
  17. public static String createSign(String characterEncoding, SortedMap<String, Object> parameters) {
  18.     StringBuffer sb = new StringBuffer();
  19.     Set es = parameters.entrySet();
  20.     Iterator it = es.iterator();
  21.     while (it.hasNext()) {
  22.         Map.Entry entry = (Map.Entry) it.next();
  23.         String k = (String) entry.getKey();
  24.         Object v = entry.getValue();
  25.         if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  26.             sb.append(k + "=" + v + "&");
  27.         }
  28.     }
  29.     sb.append("key=" + PropertyUtil.getInstance().getProperty("wx.key"));
  30.     String sign = Md5Util.md5Encode(sb.toString(), characterEncoding).toUpperCase();
  31.     return sign;
  32. }
复制代码

将上面得到的sign放到Map中,param.put("sign", sign);

将Map转换为XML
  1. public static String getRequestXml(SortedMap<String, Object> param) {
  2.     StringBuffer sb = new StringBuffer();
  3.     sb.append("<xml>");
  4.     Set es = parameters.entrySet();
  5.     Iterator it = es.iterator();
  6.     while (it.hasNext()) {
  7.         Map.Entry entry = (Map.Entry) it.next();
  8.         String k = "" + entry.getKey();
  9.         String v = "" + entry.getValue();
  10.         if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) {
  11.             sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
  12.         } else {
  13.             sb.append("<" + k + ">" + v + "</" + k + ">");
  14.         }
  15.     }
  16.     sb.append("</xml>");
  17.     return sb.toString();
  18. }
复制代码

发送post请求到https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack,参数为上面的XML即可。

要实现上面的红包功能,最好还有个定时任务,可以把公众号的用户列表和用户数据实时新增到数据库中,以便根据唯一的union_id查找对应的两个open_id.

附上同步代码

获取access_token,最好和公众号共享一个,因为access_token每天限定获取2000次,每次过期时间为2小时,发生变动时的5分钟内新旧access_token都可以使用。
  1. public String getAccessToken(){
  2.     String tokenUrl = PropertyUtil.getInstance().getProperty("wx.tokenURL") +
  3.             "?appid=" + PropertyUtil.getInstance().getProperty("red.wx.appid") + "&secret=" +
  4.             PropertyUtil.getInstance().getProperty("red.wx.appSecret") + "&grant_type=client_credential";
  5.     JSONObject tokenResult = JSONObject.parseObject(HttpUtils.get(tokenUrl));
  6.     if (tokenResult.getString("errmsg") != null) {
  7.         log.info("获取AccessToken失败,请检查失败原因, {}", tokenResult.getString("errmsg"));
  8.         return null;
  9.     }
  10.  
  11.     log.info("tokenResult="+tokenResult.toString());
  12.     String access_token = tokenResult.getString("access_token");
  13.     stringRedisTemplate.opsForValue().set(redisKey, access_token, 100*60, TimeUnit.SECONDS);
  14.     return access_token;
  15. }
复制代码

有了access_token就可以获取用户列表了,限定一次最多获取10000个,可以根据next_openid设置起始位置。

地址:https://api.weixin.qq.com/cgi-bin/user/get,参数access_token和next_openid
  1. String userListUrl = PropertyUtil.getInstance().getProperty("wx.userListURL") +
  2.         "?access_token=" + access_token + "&next_openid=" + next_openid;
  3. JSONObject userListResult = JSONObject.parseObject(HttpUtils.get(userListUrl))
复制代码

得到open_id集合就可以继续获取用户详细信息,可以单独也可以批量,批量最多100个一次。

批量获取地址:https://api.weixin.qq.com/cgi-bin/user/info/batchget,参数user_list(100个用户的openid)和access_token
代码就不加了,基本操作。

在分享个按指定大小,分隔集合,将集合按规定个数分为n个部分的方法,用来分隔10000个open_id为100的list,方便批量获取
  1. public static  List<List<String>> splitList(List<String> list, int len) {
  2.     if (list == null || list.size() == 0 || len < 1) {
  3.         return null;
  4.     }
  5.     List<List<String>> result = new ArrayList<List<String>>();
  6.  
  7.     int size = list.size();
  8.     int count = (size + len - 1) / len;
  9.  
  10.     for (int i = 0; i < count; i++) {
  11.         List<String> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
  12.         result.add(subList);
  13.     }
  14.     return result;
  15. }
复制代码

好了,具体就这么多了,详细的可以根据开发文档和本文参考对照完成。
上一篇:没有了
下一篇:看完你就会的微信小程序微信授权登录具体实现步骤

相关内容