小程序下发订阅消息

模板消息即将下线,于是将之前下发模板消息的地方全部替换成订阅消息,以下为其中一个案例;
你在小程序发布一条资讯信息,别人给你发布的资讯点赞或者评论(此处为点赞订阅消息提醒),你将收到一条订阅信息;
是否接收订阅消息,将在你发布资讯信息之前获取你的授权信息,允许接收或不允许,允许的情况下,一条资讯你将受到一条信息有且只有一条订阅消息提醒;

小程序实现

页面效果

编辑资讯信息,点击【发布】弹出授权信息;
小程序触发授权
允许或者拒绝,都将信息发布出来
在这里插入图片描述

代码实现

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;
    }
}

接收到的订阅消息

允许接收订阅消息时,有人点赞将收到订阅消息提醒
在这里插入图片描述

订阅消息模板信息

在小程序【订阅消息】中选在合适的模板添加到“我的模板”中
在这里插入图片描述
此案例存在点缺陷:允许授权之后,点赞接收订阅消息提醒只能接收一条,小编未找到解决方法,望广大网友提供可行性建议,以便后续完善;

发布了35 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43948057/article/details/103852469