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

前言:发送微信模板消息首先需要用户去绑定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;@Autowiredpublic RedisTemplate redisTemplate;/*  @Autowiredprivate ITaskService taskService;@Autowiredprivate AsyncTaskManager asyncTaskManager;*/@Autowiredprivate 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有,直接走redisObject 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 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 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.万能模板的模板 根据 模板的详情内容编写代码就可以了

 

编辑不易,一键三连


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部