2025年微信订阅号发送模板消息

微信订阅号发送模板消息参考的链接 微信公众平台测试号 模板消息发送 Demo a 的博客 CSDN 博客 开放接口 微信开放文档 微信公众平台 功能一 代码实现发送微信公众平台配置的模板消息 1 事先获取好 appID 和 appsecret 2 书写发送的工具类 package com talk915 common templateMsg

大家好,我是讯享网,很高兴认识大家。

参考的链接:

微信公众平台测试号——模板消息发送Demo_a的博客-CSDN博客

开放接口 | 微信开放文档

微信公众平台

功能一:代码实现发送微信公众平台配置的模板消息

1、事先获取好appID和appsecret

2、书写发送的工具类

package com.talk915.common.templateMsg; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.talk915.common.redis.RedisUtil; import com.talk915.model.pojo.WxAccessToken; import com.talk915.model.pojo.WxOpenIdInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; / * @ClassName : WxTemplateMsgUtil * @Author : cong * @Date : 2021/11/16 17:33 * @Description : 微信模板消息工具类 */ @Slf4j public class WxTemplateMsgUtil { / * @param * @return * @Author LK * @Description 获取accessToken * @Date 2021/7/26 17:36 */ public static WxAccessToken getAccessToken() { WxAccessToken cacheInfo = RedisUtil.getWxAccessToken(); if(cacheInfo != null){ Long expiresIn = cacheInfo.getExpiresIn(); if (expiresIn > 150){ return cacheInfo; } } //重新请求 String url = "https://api.weixin..com/cgi-bin/token?grant_type=client_credential&appid=" + WxTemplateMsgConstant.WX_TEMPLATE_MSG_APP_ID + "&secret=" + WxTemplateMsgConstant.WX_TEMPLATE_MSG_APP_SECRET; String ret = HttpUtil.get(url); if (StringUtils.isBlank(ret)) { return null; } Map<String, Object> map = JSONObject.parseObject(ret, Map.class); String errCode = String.valueOf(map.get("errcode")); if (StringUtils.isNotBlank(errCode) && !"null".equals(errCode)) { String errMsg = String.valueOf(map.get("errmsg")); log.error("微信获取AssessToken失败,错误码:" + errCode + ";错误消息:" + errMsg); return null; } String accessToken = String.valueOf(map.get("access_token")); String expiresIn = String.valueOf(map.get("expires_in")); WxAccessToken wxAccessToken = new WxAccessToken(); wxAccessToken.setAccessToken(accessToken); wxAccessToken.setExpiresIn(Long.parseLong(expiresIn)); //设置缓存 RedisUtil.setWxAccessToken(wxAccessToken); return wxAccessToken; } / * @param * @return * @Author LK * @Description 模板消息 * @Date 2021/7/26 18:37 */ public static String sendMsg(TemplateMessage templateMessage) { WxAccessToken accessTokenInfo = getAccessToken(); String accessToken = accessTokenInfo.getAccessToken(); String url = "https://api.weixin..com/cgi-bin/message/template/send?access_token=" + accessToken; String paramStr = JSON.toJSONString(templateMessage); String ret = HttpUtil.post(url, paramStr); if (StringUtils.isBlank(ret)) { log.error("微信模板消息推送失败!"); return ""; } Map<String, Object> retMap = JSONObject.parseObject(ret, Map.class); Integer errCode = (Integer) retMap.get("errcode"); if (errCode != 0) { String errMsg = String.valueOf(retMap.get("errmsg")); log.error("微信模板消息推送失败!,错误信息:" + errMsg); return ""; } return String.valueOf(retMap.get("msgid")); } } 
讯享网

3、书写模板类

 

讯享网package com.talk915.common.templateMsg; import org.springframework.beans.factory.annotation.Value; / * @ClassName : TemplateMsgContent * @Author : cong * @Date : 2021/11/16 16:54 * @Description : */ public class TemplateMsgContent { private static boolean allowSiteEnvironment; //补偿课时通知(测试) public static String CLASS_COMPENSATE_MSG = "ygJSffhiKZOp5BjreTk3GSurJ8vqWticSbzaTEW5Nwc"; //课程取消通知(测试) private static String CLASS_CANCEL_MSG = "7L3Zel6GFltH0xrf4-qNxC_wE22f_9t-Yi_-O8hT0xw"; / * @param * @return * @Author cong * @Description 课时补偿通知 * @Date 2021/11/11 16:43 */ public static TemplateMessage getCompensateClassTime(String compensationNum, String userName, String openId) { First first = new First("亲,您有" + compensationNum + "个课时返还信息!"); Keyword[] keywords = new Keyword[2]; Keyword keyword1 = new Keyword(compensationNum, "#"); Keyword keyword2 = new Keyword(userName, "#"); keywords[0] = keyword1; keywords[1] = keyword2; Remark remark = new Remark("感谢您的支持!"); Data data = new Data(first, remark, keywords); return new TemplateMessage(openId, CLASS_COMPENSATE_MSG, data); } / * @param * @return * @Author cong * @Description 取消课程通知 * @Date 2021/11/11 16:43 */ public static TemplateMessage getCancelClass(String className, String userName, String reason, String classTime, String openId) { First first = new First("你好,你的课程已被取消!"); Keyword[] keywords = new Keyword[4]; Keyword keyword1 = new Keyword(className, "#"); Keyword keyword2 = new Keyword(userName, "#"); Keyword keyword3 = new Keyword(reason, "#"); Keyword keyword4 = new Keyword(classTime, "#"); keywords[0] = keyword1; keywords[1] = keyword2; keywords[2] = keyword3; keywords[3] = keyword4; Remark remark = new Remark("敬请谅解,有疑问请联系管理员!"); Data data = new Data(first, remark, keywords); return new TemplateMessage(openId, CLASS_CANCEL_MSG, data); } / * @param * @return * @Author cong * @Description 正式服的相关配置 * @Date 2021/3/20 10:21 */ @Value("${allow.site.environment}") private void setAllowSend(boolean allowSiteEnvironment) { TemplateMsgContent.allowSiteEnvironment = allowSiteEnvironment; if (allowSiteEnvironment) { CLASS_COMPENSATE_MSG = "*"; CLASS_CANCEL_MSG = "*"; } } } 
public class First { private String value; private String color; public First (String value){ this.value = value; } } public class Remark { private String value; private String color; public Remark (String value){ this.value = value; } } public class Data { private First first; private Keyword keyword1; private Keyword keyword2; private Keyword keyword3; private Keyword keyword4; private Remark remark; public Data(First first, Remark remark, Keyword... keyword) { this.first = first; int count = 1; for (Keyword keyword1 : keyword) { if (count == 1) { this.keyword1 = keyword1; } else if (count == 2) { this.keyword2 = keyword1; } else if (count == 3) { this.keyword3 = keyword1; } else if (count == 4) { this.keyword4 = keyword1; } count++; } this.remark = remark; }

功能二:代码实现输入关键字推送对应的内容

1、首先在微信公众平台配置回调地址         url/weChat/check

2、编写接收的接口逻辑

讯享网package com.talk915.async.controller.wx; import cn.hutool.crypto.SecureUtil; import com.talk915.async.service.UserBindService; import com.talk915.common.templateMsg.AesException; import com.talk915.common.templateMsg.SHA1; import com.talk915.common.templateMsg.WxMsgInfo; import com.talk915.common.templateMsg.WxTemplateMsgConstant; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.IOException; import java.io.StringWriter; import java.util.Date; / * @ClassName : WeChatController * @Author : cong * @Date : 2021/11/12 14:41 * @Description : 微信服务号使用 */ @RestController @RequestMapping(value = "/weChat") public class WeChatController { @Autowired private UserBindService userBindService; / * 微信加密字符串 */ private static final String token = "talk915"; / * @param * @return * @Author LK * @Description 接收微信发送数据 * @Date 2021/8/12 14:44 */ @PostMapping(value = "/check",produces = MediaType.APPLICATION_XML_VALUE) public String wxPostConnect(HttpServletRequest request) { try { Marshaller marshaller; Unmarshaller unmarshal; //解析对象 JAXBContext jaxbContext = JAXBContext.newInstance(WxMsgInfo.class); unmarshal = jaxbContext.createUnmarshaller(); //xml解码成bean对象 WxMsgInfo wxMsgInfo = (WxMsgInfo) unmarshal.unmarshal(request.getInputStream()); String event = wxMsgInfo.getEvent(); String msgType = wxMsgInfo.getMsgType(); //关注用户openId String fromUserName = wxMsgInfo.getFromUserName(); //接收的内容 String msg = wxMsgInfo.getContent(); //判断 1.关注/取关 2.发送消息 3.找不到相应的就推送客服链接 // 判断是否为关注,subscribe(订阅)、unsubscribe(取消订阅) String content = ""; if (StringUtils.isNotBlank(event)){ //关注 boolean isSubscribe = "subscribe".equals(event); //关注或取关 boolean subscribe = "subscribe".equals(event) || "unsubscribe".equals(event); //推送默认消息 if (isSubscribe) { content = WxTemplateMsgConstant.createTextMsg(1,""); } //添加/编辑 关注/取关记录 if (subscribe){ userBindService.addOrEditSubscribeStatus(fromUserName,isSubscribe); } } else if (StringUtils.isNotBlank(msgType) && "text".equals(msgType) && WxTemplateMsgConstant.BIND_TEXT.contains(msg)) { content = WxTemplateMsgConstant.createTextMsg(2, SecureUtil.md5(fromUserName + "TaLk#915")); } else if (StringUtils.isNotBlank(msgType) && "text".equals(msgType) && WxTemplateMsgConstant.UN_BIND_TEXT.contains(msg)){ content = WxTemplateMsgConstant.createTextMsg(3,""); } else if (StringUtils.isNotBlank(msgType) && "text".equals(msgType) && StringUtils.isNotBlank(WxTemplateMsgConstant.checkUnBindText(msg))){ //解除绑定 content = userBindService.unBindAccount(WxTemplateMsgConstant.checkUnBindText(msg),fromUserName); } else { content = WxTemplateMsgConstant.createTextMsg(4,""); } WxMsgInfo msgInfo = new WxMsgInfo(); msgInfo.setFromUserName(wxMsgInfo.getToUserName()); msgInfo.setToUserName(wxMsgInfo.getFromUserName()); msgInfo.setCreateTime(new Date().getTime()); msgInfo.setMsgType("text"); msgInfo.setContent(content); marshaller = jaxbContext.createMarshaller(); StringWriter writer = new StringWriter(); marshaller.marshal(msgInfo, writer); return writer.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } } 
package com.talk915.common.templateMsg;

import com.talk915.common.pattern.PatternCheckUtil;
import com.talk915.common.util.FileUrlConstant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;

import java.util.Arrays;
import java.util.List;

/
 * @ClassName : WxTemplateMsgConstant
 * @Author : cong
 * @Date : 2021/11/10 18:14
 * @Description : 微信模板信息
 */

public class WxTemplateMsgConstant {

    private static boolean allowSiteEnvironment;

    /
     * 测试服appId
     */
    public static String WX_TEMPLATE_MSG_APP_ID = "wx11d4e0f54f0cbbbb";

    /
     * 测试服appSecret
     */
    public static String WX_TEMPLATE_MSG_APP_SECRET = "774b8b69b473fd2b03930f6bfe80010b";

    /
     * 客服地址
     */
    public static final String DEFAULT_CS_LINK = "服务号暂时不支持其他功能,正在完善中!若您有其他问题,您可以咨询 <a href=\"https://platform.usongshu.com/im/index.html#/robot?platformType=0&platformUserId=&platformUserType=7&platformPhone=&platformNickName=&platformTerminalType=1\">在线客服</a>";

    /
     * 账号绑定基础链接
     */
    private static final String  BIND_BASE_URL = FileUrlConstant.getPrefixUrl() + "h5/wxBind?code=";



    //前缀
    private static final String BIND_URL_PREFIX = "<a href=\"";

    //后缀
    private static final String BIND_URL_SUFFIX = "\">点击完成账号绑定</a>";

    /
     * 账号绑定关键词
     */
    public static final List<String> BIND_TEXT = Arrays.asList("账号绑定","绑定账号","账号关联","关联","上课提醒","绑定","通知");

    /
     * 账号解绑
     */
    public static final List<String> UN_BIND_TEXT = Arrays.asList("账号解绑","解绑账号","解绑");



    /
     * @Author  LK
     * @Description  创建文本消息
     * @Date 2021/8/16 10:18
     * @param
     * @return
     */
    public static String createTextMsg(int type,String baseContent) {
        String content = "";
        switch (type) {
            //1.关注默认消息
            case 1:
                //content = "感谢您关注说客英语服务号!目前服务号提供上课提醒功能,回复 绑定账号,根据提示完成账号绑定即可!";
                content = "感谢您关注说客英语服务号!" +
                        "目前服务号提供课前提醒和上课迟到提醒,回复:绑定,根据提示完成帐号绑定即可接收推送信息." +
                        "如需解绑,回复:解绑_帐号,例如:解绑_12345678901";
                break;
            //2.账号绑定
            case 2:
                content = BIND_URL_PREFIX + BIND_BASE_URL + baseContent + BIND_URL_SUFFIX;
                break;
            //账号解绑
            case 3:
                content = "按照如下格式输入您需要解绑的账号即可:解绑_13700000001";
                break;
            //其他内容暂时推送客服链接
            default:
                content = DEFAULT_CS_LINK;
        }
        return content;
    }


    /
     * @Author  LK
     * @Description  检测解绑格式
     * @Date 2021/8/24 18:06
     * @param
     * @return
     */
    public static String checkUnBindText(String text){
        if (StringUtils.isBlank(text)){
            return "";
        }
        boolean contains = text.contains("_");
        if(!contains){
            return "";
        }
        String[] arr = StringUtils.split(text, "_");
        if (!arr[0].equals("解绑")){
            return "";
        }
        String account = arr[1];
        if (StringUtils.isBlank(account)){
            return "";
        }
        boolean checked = PatternCheckUtil.isPhone(account);
        if (!checked){
            return "";
        }
        return account;
    }

    /
     * @param
     * @return
     * @Author cong
     * @Description 正式服的相关配置
     * @Date 2021/3/20 10:21
     */
    @Value("${allow.site.environment}")
    private void setAllowSend(boolean allowSiteEnvironment) {
        WxTemplateMsgConstant.allowSiteEnvironment = allowSiteEnvironment;
        if (allowSiteEnvironment) {
            WX_TEMPLATE_MSG_APP_ID = "*";
            WX_TEMPLATE_MSG_APP_SECRET = "*";
        }
    }
}
小讯
上一篇 2025-02-28 13:34
下一篇 2025-04-10 12:15

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/19475.html