微信小程序模板消息发送功能实现

2023-11-08

前言:发送微信模板消息首先需要用户去绑定openId和serverOpenId才能推送模板消息.

1.微信配置项

 

1.微信小程序根据前端返回的code去获取unionId和openid 通过type=0的接口去请求

 

 

2.用户获取到unionId和openId之后插入表中 就是用户登录微信小程序时 请求的是type=0的接口

 3.得到用户的open和unionId之后 去请求type=1的接口 获取到serverOpenId(重点),通过unionId找到用户并且插入serverOpenId进去

4.做完准备工作之后,我们就需要完成下面真正的功能了  发送微信模板公众号 ,请求三方接口的工具类

 

package cn.abtu.config;


import cn.abtu.parent.mapper.TaskMapper;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Component
public class WechatApi {
    @Value("${wechat.server.appid}")
    private String appid;

    @Value("${wechat.server.secret}")
    private String secret;

    @Value("${wechat.template_id0}")
    private String template_id0;

    @Value("${wechat.template_id1}")
    private String template_id1;

    @Value("${wechat.template_id2}")
    private String template_id2;

    @Value("${wechat.template_id3}")
    private String template_id3;
    @Autowired
    public RedisTemplate redisTemplate;

  /*  @Autowired
    private ITaskService taskService;

    @Autowired
    private AsyncTaskManager asyncTaskManager;*/

    @Autowired
    private TaskMapper taskMapper;

    public static void main(String[] args) {
        System.out.println("====");
        WechatApi wa = new WechatApi();
        wa.appid = "wx43a4c47b16c76ff2";
        wa.secret = "5ebdcd41ebb802eeb2057c6d5a221243";
        wa.get_access_token();

    }

    public static String sendRequest(String urlParam,String requestType) {

        HttpURLConnection con = null;

        BufferedReader buffer = null;
        StringBuffer resultBuffer = null;

        try {
            URL url = new URL(urlParam);
            //得到连接对象
            con = (HttpURLConnection) url.openConnection();
            //设置请求类型
            con.setRequestMethod(requestType);
            //设置请求需要返回的数据类型和字符集类型
            con.setRequestProperty("Content-Type", "application/json;charset=GBK");
            //允许写出
            con.setDoOutput(true);
            //允许读入
            con.setDoInput(true);
            //不使用缓存
            con.setUseCaches(false);
            //得到响应码
            int responseCode = con.getResponseCode();

            if(responseCode == HttpURLConnection.HTTP_OK){
                //得到响应流
                InputStream inputStream = con.getInputStream();
                //将响应流转换成字符串
                resultBuffer = new StringBuffer();
                String line;
                buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK"));
                while ((line = buffer.readLine()) != null) {
                    resultBuffer.append(line);
                }
                return resultBuffer.toString();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    public String get_access_token() {
        try {
            // 如果redis有,直接走redis
            Object access_token = redisTemplate.opsForValue().get("access_token");
            System.err.println(access_token);
            if(access_token != null){
                return access_token.toString();
            }
            Integer t=7000;
            // 没有验证数据库
            JSONObject wx_access_token = taskMapper.getWxAccessToken();
            if (wx_access_token == null){
                if(taskMapper.checkWxAccessToken() == 0){
                    taskMapper.insertAccessToken("");
                }
                String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;
                String req = sendRequest(url,"GET");
                JSONObject object = JSONObject.parseObject(req);
                System.out.println(object);
                if(object.get("access_token") == null){
                    return null;
                }
                access_token = object.getString("access_token");
                taskMapper.setWxAccessToken((String)access_token);
                redisTemplate.opsForValue().set("access_token", access_token, 6900, TimeUnit.SECONDS);
                return (String) access_token;
            }else{
                access_token = wx_access_token.get("config_value");
                // 获取剩余过期时间戳
                t = wx_access_token.getInteger("t");
                if(t > 60){
                    redisTemplate.opsForValue().set("access_token", access_token, t, TimeUnit.SECONDS);
                }
                return (String) access_token;
            }


        } catch (Exception e) {
            e.printStackTrace();
            System.err.println(e.getMessage());
            return null;
        }
    }
    /**
     * 示例json格式如下
     {
         "first": {
             "value": "test",
             "color": "#173177"
         },
         "keyword1": {
             "value": "aaa",
             "color": "#173177"
         }
         "remark":{
             "value":"TEST",
             "color":"#173177"
         }
     }
     {
         "touser":"o3Yg26IyKm_7CwsxU7Y1SmWzhZe8",
         "template_id":"o2Fi5wI-H5s2ca3e5Iw0cBK_bM22egafOnrrvjWSAjk",
         "url":"http://weixin.qq.com/download",
         "topcolor":"#FF0000",
         "data":{
             "first": {
                 "value": "test",
                 "color": "#173177"
             },
             "keyword1": {
                 "value": "aaa",
                 "color": "#173177"
             }
             "remark":{
                 "value":"TEST",
                 "color":"#173177"
             }
        }
     }
     */
    /**
     * 直接发送消息的方法
     * @param openid  用的openid
     * @param data 模板消息的data
     * 示例格式如下,根据模板需求传具体的值,一般会有多个keyword, 如keyword1, keyword2
     *       {
     *          "first": {
     *              "value": "test",
     *              "color": "#173177"
     *          },
     *          "keyword1": {
     *              "value": "aaa",
     *              "color": "#173177"
     *          }
     *          "remark":{
     *              "value":"TEST",
     *              "color":"#173177"
     *          }
     *      }
     * @param url 模板消息跳转的地址,可以为空或null
     * @param topcolor 颜色 可以为空或null
     * @return
     */
    public String send_temp_msg(String openid, JSONObject data, String url, String topcolor, Integer type){
        String[] msgtype = {template_id0, template_id1,template_id2,template_id3};
        JSONObject jsonobj =new JSONObject();
        jsonobj.put("touser", openid);
        jsonobj.put("template_id", msgtype[type]);
        jsonobj.put("url", url != null ? url :"");
        jsonobj.put("topcolor", topcolor != null ? topcolor :"#173177");
        jsonobj.put("data", data);
        try {
            String access_token = get_access_token();
            //System.err.println("access_token"+ access_token);
            if (access_token == null) {
                return "access_token获取失败";
            }
            String baseurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
            //System.err.println(baseurl);
            HttpClient httpClient = new HttpClient();
            httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000);
            PostMethod postMethod = new PostMethod(baseurl);
            postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000);
            //System.out.println(jsonobj);
            System.err.println(jsonobj.toString());
            postMethod.setRequestBody(jsonobj.toString());
            postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8");
            httpClient.executeMethod(postMethod);
            String result = postMethod.getResponseBodyAsString();
            postMethod.releaseConnection();
            System.out.println(result);
            return result;
        }catch (Exception e){
            System.err.println("send_temp_msg error:"+e.getMessage());
            return e.getMessage();
        }
    }

   /* public String SendMsg(List<WxTemplateContent> list){
        if(list.size() ==0){
            return "";
        }
        String taskId = UUID.randomUUID().toString();
        Task task = new Task();
        task.setTaskId(taskId);
        task.setStatus(0);
        task.setMsg("开始执行任务");
        String tousers= list.stream().map(WxTemplateContent::getTouser).collect(Collectors.toList()).toString();
        JSONObject send_data = new JSONObject();
        send_data.put("to_users", tousers);
        send_data.put("count", list.size());
        task.setInfo(send_data.toString());
        task.setProgress(0);
        if(taskService.insertTask(task) == 1){
            Task task1 = asyncTaskManager.submit(() -> {
                Task asynctask =  taskService.get_task(taskId);
                asynctask.setStatus(1);
                System.out.println("_____start_____");
                List<JSONObject> info = new ArrayList<>();
                for (int i = 0; i < list.size(); i++) {
                    JSONObject result = new JSONObject();
                    String res = send_temp_msg(list.get(i).getTouser(), new JSONObject(list.get(i).getData()),list.get(i).getUrl(),list.get(i).getTopcolor(), 0);
                    asynctask.setTaskId(taskId);
                    asynctask.setMsg("正在执行第!"+(i+1)+"个");
                    asynctask.setProgress(((i+1)/list.size()* 100));
                    taskService.updateTask(asynctask);
                    result.put("openid", list.get(i).getTouser());
                    result.put("res", res);
                    info.add(result);
                }
                asynctask.setMsg("任务执行完成");
                asynctask.setStatus(3);
                asynctask.setRes(info.toString());
                taskService.updateTask(asynctask);
                System.out.println("_____end_____");
            }, taskId);

        }
        return taskId;
    }*/

}
 

5.根据业务场景去发送模板消息这里就举例子一个万能模板 wechatApi.send_temp_msg

if (wechatApi.get_access_token() != null) {
    JSONObject res = new JSONObject();
    res.put("openid", teacher != null ? teacher.getServerOpenId() : "");
    res.put("book_name", kidBook != null ? bookName : "");
    res.put("kid_name", logininfo != null ? logininfo.getName() : "");
    if (res != null) {

        System.err.println(res);
        String openid = res.getString("openid");
        String book_name = res.getString("book_name");
        String kid_name = res.getString("kid_name");
        if (openid != null ) {
            //调用任务管理器中的submit去提交一个异步任务
            String taskId = UUID.randomUUID().toString();
            Task task = new Task();
            task.setTaskId(taskId);
            task.setStatus(0);
            task.setMsg("开始发送微信模板消息");
            task.setInfo("");
            task.setProgress(0);
            if (taskService.insertTask(task) == 1) {
                Task task1 = asyncTaskManager.submit(() -> {
                    System.out.println("_____start_____");
                    Task asynctask = taskService.get_task(taskId);
                    JSONObject data = new JSONObject();
                    data.put("first", new WxMsg("请审核学生的预约借书", null));
                    data.put("keyword1", new WxMsg(kid_name, null));
                    data.put("keyword2", new WxMsg(cn.abtu.config.DateUtil.getTime(), null));
                    data.put("keyword3", new WxMsg("发起了"+book_name+"预约借书", null));
                    //data.put("time", new WxMsg("尽快", null));
                    // data.put("location", new WxMsg("借阅地点", null));
                    data.put("remark", new WxMsg(kid_name + "发起了图书:" + book_name + "的预约审核", null));
                    asynctask.setMsg("已执行发送");
                    asynctask.setStatus(3);
                    asynctask.setRes(wechatApi.send_temp_msg(openid, data, "", "", 3));
                    taskService.updateTask(asynctask);
                    System.out.println("_____end_____");
                }, taskId);
                if (task1 == null) {
                    throw new BusinessExeption("201", "微信模板消息发送失败!");
                }
            }
        }
    }

6.模板配置

# 模板消息 0催还通知 1活动未完成提醒
wechat.template_id0: 
wechat.template_id1: 90O9OofmDvCXRt-
#万能模板
wechat.template_id2: -3Ww
#借还书模板三
wechat.template_id3: 

7.万能模板的模板 根据 模板的详情内容编写代码就可以了

 

编辑不易,一键三连

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序模板消息发送功能实现 的相关文章

随机推荐

  • 期货开户水滴石穿知行合一

    上千年来 人生价值一直都在改变 唯一没有改变的就是价值本身的规律 如果从另一个角度去观察 或许会有另外一番心境 有句老话叫做后生可畏 也许后生并不可畏 真正让人可畏可敬的或许是代表一个时代的思想和精神 如果相信自己能活着 那么只要不放弃 就
  • (转载)谈SDH、MSTP、OTN和PTN的区别和联系

    http tech c114 net 169 a892299 html width 250 height 24 frameborder 0 allowtransparency true marginwidth 0 marginheight
  • BarTender.Application COM 多次调用引发后台进程数不断增加的问题

    引用文章方法测试 目前未发现问题 Closing Instance Of Bartender BarTender Support Portal seagullscientific com Closing Instance Of Barten
  • angular:路由直接import xxx-route.module文件的坑

    问题 惰性加载可以直接import xxx route module 而且可能一开始始不报错 如果在html使用第三方库的组件时 在xxx module中import对应的module 报错仍然不能解决 解决办法 const routes
  • java白盒测试代码_junit白盒测试Java.doc

    计算机科学与技术系 实 验 报 告 专业名称 软件工程 课程名称 软件测试 项目名称 白盒测试之赋税管理系统 班 级 12级软件工程 学 号 1204091034 姓 名 常成 同组人员 实验日期 2014 10 13 一 实验内容 利用白
  • 基于HAL库的FREERTOS----------一.任务

    FreeROTS 就是一个免费的 RTOS 类系统 这里要注意 RTOS 不是指某一个确定的系统 而是指一类系统 比如 UCOS FreeRTOS RTX RT Thread 等这些都是 RTOS 类操作系统 FreeRTOS 是 RTOS
  • Vue中的自定义指令——全局和局部

    Vue中的自定义指令 一 注册全局指令 二 注册局部指令 通过自定义指令 我们可以对DOM进行更多的底层操作 这样不仅可以在某些场景下为我们提供解决问题的思路 而且让我们对vue的底层有了进一步的了解 一 注册全局指令 通过Vue dire
  • 怎么解决Visual Studio无法打开源文件“stdio.h“问题

    CUDA文件中无法打开源文件 stdio h 混元太极马保国的博客 CSDN博客 以上链接的解决办法最好 1 不用管它 也可以正常运行cu项目 2 按上述链接处理 项目 属性 常规 启动托管增量生成 改为 是 也可以消除波浪线 这篇文章主要
  • Java内存溢出问题深入探究及其解决策略

    文章目录 引言 一 Java内存模型与溢出的根源 1 1 Java内存模型 1 2 内存溢出的根源 二 诊断内存溢出 三 解决策略 3 1 优化代码 3 2 调整堆大小 3 3 使用内存友好的数据结构和算法 3 4 优化并发 四 代码示例
  • [非线性控制理论]8_三种鲁棒控制器的比较

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • Docker高级:Compose 容器编排

    目录 一 Docker Compose 概述 二 使用 Docker Compose 三 常用命令 四 编排微服务 搭建微服务 编写Dockerfile构建镜像 启动容器 测试服务 使用Compose编排容器 五 总结 一 Docker C
  • 10个顶级的CSS UI开源框架

    随着CSS3和HTML5的流行 我们的WEB页面不仅需要更人性化的设计理念 而且需要更酷的页面特效和用户体验 作为开发者 我们需要了解一些宝贵的CSS UI开源框架资源 它们可以帮助我们更快更好地实现一些现代化的界面 包括一些移动设备的网页
  • 模式识别课程:目标检测①创建PASCAL VOC数据集

    title 目标检测 创建数据集 目标检测实验报告 检测所用软硬件 云服务器 硬件 macOS或者windows电脑 软件 pycharm 生成的测试集 云服务器 滴滴云 https www didiyun com activity htm
  • 二.信息化与系统集成技术

    项目经理考试学习笔记 二 信息化与系统集成技术 考试 6分左右 信息化5分左右 1 信息化 1 1 政府信息化与电子政务 1 2 企业资源管理 ERP 1 2 1 ERP的定义 1 2 3 ERP的思想 1 3 客户管理关系 CRM 职能
  • Git中忽略文件常见内容, git中的一些操作记录

    jar war class lock DS Store swp out target iml ipr iws bak settings classpath project metadata idea logs log dependency
  • Win10 开发者模式开启

    使用注册表方式 建立一个注册表DWORD为1键值 HKLM SOFTWARE Microsoft Windows CurrentVersion AppModelUnlock AllowAllTrustedApps建立一个注册表DWORD为1
  • 短视频、直播程序、一对一社交app--老外们玩嗨的程序竟然多半来自“中国的程序猿们开发”...

    短视频 直播程序 一对一社交app 老外们玩嗨的程序竟然多半来自 中国的程序猿们开发 在过去的2017年可以说是中国短视频 直播程序 一对一社交app极为火爆的一年 国内市场的厮杀一直没有停止过 很多投资者在国内那是一片红海 短视频 直播程
  • STM32 学习笔记 -- Keil 5调试STM32控制器,出现错误提示“Error: Encountered an improper argument”的原因参考

    最近在使用MDK调试STM32控制器 当下载完成 需要使用ST LINK进行程序仿真时 MDK偶尔会出现错误提示 Error Encountered an improper argument 大概意思是说 错误 遇到不正确的参数 出现这种情
  • 音频放大器的设计

    摘要 进入21世纪以后 各种便携式的电子设备成为了电子设备的一种重要的发展趋势 从作为通信工具的手机 到作为娱乐设备的MP3播放器 已经成为差不多人人具备的便携式电子设备 所有这些便携式的电子设备的一个共同点 就是都有音频输出 也就是都需要
  • 微信小程序模板消息发送功能实现

    前言 发送微信模板消息首先需要用户去绑定openId和serverOpenId才能推送模板消息 1 微信配置项 1 微信小程序根据前端返回的code去获取unionId和openid 通过type 0的接口去请求 2 用户获取到unionI