模板消息即将下线,于是将之前下发模板消息的地方全部替换成订阅消息,以下为其中一个案例;
你在小程序发布一条资讯信息,别人给你发布的资讯点赞或者评论(此处为点赞订阅消息提醒),你将收到一条订阅信息;
是否接收订阅消息,将在你发布资讯信息之前获取你的授权信息,允许接收或不允许,允许的情况下,一条资讯你将受到一条信息有且只有一条订阅消息提醒;
小程序实现
页面效果
编辑资讯信息,点击【发布】弹出授权信息;
允许或者拒绝,都将信息发布出来
代码实现
Page({
data: {
tmplIds: ['hHMctXahTUmll5uKu0p3uuNJCoKyCYqDzZSdo-7qzkk', 'RgVGpuKVA9RnR_KigeijXsITZTXPzFGcyEnIyAm6sxM']
},
/**
* 发布资讯提交
*/
informationSub: function() {
var that = this;
// 订阅消息授权
wx.requestSubscribeMessage({
tmplIds: that.data.tmplIds,
success(res) {
console.log(res);
// 资讯发布提交
that.informationPush();
},
fail(res) {
console.log(res)
// 资讯发布提交
that.informationPush();
}
})
},
后台实现
package com.jk.util;
import com.jk.entity.templateMessage.TemplateMessage;
import com.jk.entity.templateMessage.WxTemplate;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: jk
* @description: test
* @author: Mr.jkx
* @create: 2020/1/6 10:48
*/
public class TestJkx {
private static final Logger LOGGER = LoggerFactory.getLogger(TestJkx.class);
// 发送模板消息请求路径
private static final String APPLETS_SEND_TEMPLATE_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
// 模板消息模板ID
private static final String PRAISE_TEMPLATE_ID = "RgVGpuKVA9RnR_KigeijXsITZTXPzFGcyEnIyAm6sxM";
public static void main(String[] args) throws IOException {
sendMesdsageOfPraise();
}
public static JSONObject sendMesdsageOfPraise() throws IOException {
String accessToken = "25_gh32LhbE6T33FDxBsGBQJQKj8fOeCUDLYz9G4-15-P4N7A-zo7nkJ_r3hqxiExcWxK19MAE8AdW8o7KZa-gPoZPgmgAGFDbq0yy1FfFYupVmT8yg_DxWFoSEhsRpz57bvDhknnPHwWVRJ-raEZQhADARMD";
String oppenid = "obZoC0VkkUF9DovVLNHBVR9WzXrg";
// 请求发送模板消息
String sendUrl = APPLETS_SEND_TEMPLATE_MESSAGE_URL.replace("ACCESS_TOKEN", accessToken);
WxTemplate t = new WxTemplate();
t.setTouser(oppenid);
t.setTemplate_id(PRAISE_TEMPLATE_ID);
t.setPage("pages/index/discuss/discuss?tId=1&pId=2");
Map<String, TemplateMessage> m = new HashMap<>();
TemplateMessage thing3 = new TemplateMessage();
String tContent = "2020的第一场雪";
if (StringUtils.isNotBlank(tContent)) {
if (EmojiFilter.whetherToEncode(tContent)) {
thing3.setValue(strIntercept(EmojiFilter.codingEmoji(tContent)));
} else {
thing3.setValue(strIntercept(tContent));
}
} else {
thing3.setValue("我的图片或者视频");
}
m.put("thing3", thing3);
TemplateMessage name1 = new TemplateMessage();
String nickname = "稻草人";
if (StringUtils.isNotBlank(nickname)) {
if (EmojiFilter.whetherToEncode(nickname)) {
name1.setValue(EmojiFilter.codingEmoji(nickname));
} else {
name1.setValue(nickname);
}
} else {
name1.setValue("匿名");
}
m.put("name1", name1);
TemplateMessage date2 = new TemplateMessage();
date2.setValue(DateUtil.formatDate(new Date(), "yyyy年MM月dd日 HH:mm"));
m.put("date2", date2);
t.setData(m);
String sendData = JSONObject.fromObject(t).toString();
LOGGER.info("============此刻点赞,发送小程序订阅消息,请求参数{}", sendData);
JSONObject retStr1 = WinxinUtil.doPostStr(sendUrl, sendData);
LOGGER.info("============此刻点赞,发送小程序订阅消息,回执参数{}", retStr1.toString());
return retStr1;
}
/**
* @Description: 字符串截取
* @Author: Mr.Jkx
* @date: 2019/12/27 9:48
*/
public static String strIntercept(String str) {
String strData = "";
if (str.length() > 20) {
strData = str.substring(0, 17) + "...";
} else {
strData = str;
}
return strData;
}
}
工具类
package com.jk.util;
import org.apache.commons.lang.StringUtils;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
public class EmojiFilter {
private static final Base64.Decoder decoder = Base64.getDecoder();
private static final Base64.Encoder encoder = Base64.getEncoder();
private static final String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
public static boolean containsEmoji(String source) {
int len = source.length();
boolean isEmoji = false;
for (int i = 0; i < len; i++) {
char hs = source.charAt(i);
if (0xd800 <= hs && hs <= 0xdbff) {
if (source.length() > 1) {
char ls = source.charAt(i + 1);
int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
return true;
}
}
} else {
// non surrogate
if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
return true;
} else if (0x2B05 <= hs && hs <= 0x2b07) {
return true;
} else if (0x2934 <= hs && hs <= 0x2935) {
return true;
} else if (0x3297 <= hs && hs <= 0x3299) {
return true;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d
|| hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c
|| hs == 0x2b1b || hs == 0x2b50 || hs == 0x231a) {
return true;
}
if (!isEmoji && source.length() > 1 && i < source.length() - 1) {
char ls = source.charAt(i + 1);
if (ls == 0x20e3) {
return true;
}
}
}
}
return isEmoji;
}
private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}
/**
* 过滤emoji 或者 其他非文字类型的字符
*
* @param source
* @return
*/
public static String filterEmoji(String source) {
if (StringUtils.isBlank(source)) {
return source;
}
StringBuilder buf = null;
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (isEmojiCharacter(codePoint)) {
if (buf == null) {
buf = new StringBuilder(source.length());
}
buf.append(codePoint);
}
}
if (buf == null) {
return source;
} else {
if (buf.length() == len) {
buf = null;
return source;
} else {
return buf.toString();
}
}
}
/**
* @Description: 判断数据是否Base64编码
* @Author: Mr.Jkx
* @date: 2019/11/15 11:44
*/
public static boolean whetherToEncode(String name) {
boolean isLegal = false;
if (StringUtils.isNotBlank(name)) {
if (name.indexOf("+") != -1 || name.indexOf("=") != -1) {
// 判断微信名称是否Base64编码
isLegal = name.matches(base64Pattern);
}
}
return isLegal;
}
/**
* @Description: 将Base64编码的表情编码(展示正常的表情)
* @Author: Mr.Jkx
* @date: 2019/10/21 16:37
*/
public static String codingEmoji(String name) {
String codingName = "";
try {
if (StringUtils.isNotBlank(name)) {
if (name.indexOf("+") != -1 || name.indexOf("=") != -1) {
// 判断微信名称是否Base64编码
Boolean isLegal = name.matches(base64Pattern);
if (isLegal) {
//解码
codingName = new String(decoder.decode(name), "UTF-8");
}
} else {
codingName = name;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return codingName;
}
/**
* @Description: 表情包进行编码
* @Author: Mr.Jkx
* @date: 2019/11/15 11:49
*/
public static String toEncode(String name) throws UnsupportedEncodingException {
String str = "";
if (StringUtils.isNotBlank(name)) {
byte[] textByte = name.getBytes("UTF-8");
// 编码
str = encoder.encodeToString(textByte);
}
return str;
}
}
接收到的订阅消息
允许接收订阅消息时,有人点赞将收到订阅消息提醒
订阅消息模板信息
在小程序【订阅消息】中选在合适的模板添加到“我的模板”中
此案例存在点缺陷:允许授权之后,点赞接收订阅消息提醒只能接收一条,小编未找到解决方法,望广大网友提供可行性建议,以便后续完善;