微信小程序如何发红包?
敲重点:若商户号有开通商家转账到零钱(原企业付款到零钱)接口权限的,推荐小程序可以直接调用此接口变通实现红包功能,若开发者无法提供含(小程序红包、现金红包、商家转账到零钱)任一接口权限的商户号,可以使用第三方api代发接口解决商户号无权限问题;api代发接口可以赋予小程序、H5、APP等应用发放红包的能力;api代发接口是推出的一个可以被开发者调用的开放接口,聚合了现金红包与商家转账到零钱(企业付款到零钱)接口。
本文介绍一下小程序如何调用现金红包接口实现红包功能。
原理:
附上参数对象代码:
//创建sign ,参数为UTF-8编码和上面的参数Map
public static String createSign(String characterEncoding, SortedMap<String, Object> parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + PropertyUtil.getInstance().getProperty("wx.key"));
String sign = Md5Util.md5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
将上面得到的sign放到Map中,param.put("sign", sign);
将Map转换为XML
public static String getRequestXml(SortedMap<String, Object> param) {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = "" + entry.getKey();
String v = "" + entry.getValue();
if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) {
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
} else {
sb.append("<" + k + ">" + v + "</" + k + ">");
}
}
sb.append("</xml>");
return sb.toString();
}
附上同步代码
public String getAccessToken(){
String tokenUrl = PropertyUtil.getInstance().getProperty("wx.tokenURL") +
"?appid=" + PropertyUtil.getInstance().getProperty("red.wx.appid") + "&secret=" +
PropertyUtil.getInstance().getProperty("red.wx.appSecret") + "&grant_type=client_credential";
JSONObject tokenResult = JSONObject.parseObject(HttpUtils.get(tokenUrl));
if (tokenResult.getString("errmsg") != null) {
log.info("获取AccessToken失败,请检查失败原因, {}", tokenResult.getString("errmsg"));
return null;
}
log.info("tokenResult="+tokenResult.toString());
String access_token = tokenResult.getString("access_token");
stringRedisTemplate.opsForValue().set(redisKey, access_token, 100*60, TimeUnit.SECONDS);
return access_token;
}
有了access_token就可以获取用户列表了,限定一次最多获取10000个,可以根据next_openid设置起始位置。
String userListUrl = PropertyUtil.getInstance().getProperty("wx.userListURL") +
"?access_token=" + access_token + "&next_openid=" + next_openid;
JSONObject userListResult = JSONObject.parseObject(HttpUtils.get(userListUrl))
得到open_id集合就可以继续获取用户详细信息,可以单独也可以批量,批量最多100个一次。
代码就不加了,基本操作。
在分享个按指定大小,分隔集合,将集合按规定个数分为n个部分的方法,用来分隔10000个open_id为100的list,方便批量获取
public static List<List<String>> splitList(List<String> list, int len) {
if (list == null || list.size() == 0 || len < 1) {
return null;
}
List<List<String>> result = new ArrayList<List<String>>();
int size = list.size();
int count = (size + len - 1) / len;
for (int i = 0; i < count; i++) {
List<String> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
result.add(subList);
}
return result;
}
上一篇:
uniapp开发微信小程序-2.页面制作
下一篇:
微信小程序日期时间加减
