使用JAVA代码实现发送订阅消息以及模板消息

 今天写了一个商品到货提醒的job任务,具体效果如下

60e2cf561f8a4816aade55ce903dabb0.jpg

这里用到了微信的发送订阅消息,主要代码是这一块的,最后我把发送了消息的订单存到表里,因为是定时任务,大家可不存

发送订阅消息 | 微信开放文档

   /*** 微信平台-商品到货通知*/public String uploadArrival(WxOrderArrivalDTO wxOrderArrivalDTO) throws ParseException {String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + wechatManager.getaccessToken();JSONObject body = new JSONObject();JSONObject data = new JSONObject();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date = sdf.format(DateUtil.now());data.put("time4",new JSONObject().fluentPut("value",date));data.put("character_string5", new JSONObject().fluentPut("value",wxOrderArrivalDTO.getPickupCode()));data.put("amount6",new JSONObject().fluentPut("value",wxOrderArrivalDTO.getOrderAmount() + "元"));data.put("thing7",new JSONObject().fluentPut("value",wxOrderArrivalDTO.getShopName()) );data.put("short_thing8", new JSONObject().fluentPut("value","自提"));body.put("data", data);body.put("touser", wxOrderArrivalDTO.getOpenId());body.put("miniprogram_state", "formal");body.put("lang", "zh_CN");body.put("template_id", "这里填模板id");String result = null;try {result = HttpUtil.createPost(url).body(body.toJSONString()).execute().body();log.info("通知微信平台 订单到货接口返回:" + result);OrderPushMsgDTO orderPushMsgDTO = new OrderPushMsgDTO();orderPushMsgDTO.setPushMsgId(UUIDUtils.getUUID());orderPushMsgDTO.setOrderId(wxOrderArrivalDTO.getOrderId());orderPushMsgDTO.setOrderType(CommonKey.CONSTANT_1);JSONObject jsonObject = JSON.parseObject(result);int errcode = jsonObject.getInteger("errcode");orderPushMsgDTO.setErrCode(String.valueOf(errcode));orderPushMsgBO.save(orderPushMsgDTO);} catch (Exception e) {throw new BizException(e.getMessage());}return result;}

这是微信公众号平台申请的模板,其中模板id填到上图中的template_id后面

63ab012c1aed4195aa905d810bf601d1.png

 这是微信官方文档的请求参数示例,主要是data里面的数据key是上图详细内容里的time4,thing7...e47dee90ade74836918ccb5bc95d9da6.png

 然后遇到一个问题,就是给data塞值的时候刚开始采用的是第二种方法,发现没塞进去,用下图框中的写法就可以了

022f5755fea148879ab9f6e71b63000d.png

后面又写了个公众号的,效果如下

这个用法的是微信的模板消息,大致写法都一样,就是tocken要用公众号的tocken,用小程序的tocken会报错48001,还有如果不是一个模板id代码里记得换,不然会报错40037。模板有数据是枚举的,拼接返回消息的时候要对应上

模板消息 | 微信开放文档

public String uploadArrivalOfficialAccountPush(WxOrderArrivalDTO wxOrderArrivalDTO){WechatInfoDTO weChatAccessToken = authUtil.getWeChatAccessToken();String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + weChatAccessToken.getAccessToken();List<OrderItemDTO> itemList= orderItemDao.queryListOrderItemByOrderIdList(Arrays.asList(wxOrderArrivalDTO.getOrderId()));List<ShopGoodsDTO> shopGoodsDTOS = this.shopGoodsBo.queryGoodsByIdList(itemList.stream().map(OrderItemDTO::getGoodsId).collect(Collectors.toList()));if (ObjectUtil.isNull(shopGoodsDTOS)) {return null;}Map<String, ShopGoodsDTO> shopGoodsDTOMap = shopGoodsDTOS.stream().distinct().collect(Collectors.toMap(ShopGoodsDTO::getGoodsId, Function.identity(), (oldValue, newValue) -> oldValue));List<ShopGoodsSpeciInfoDTO> speciInfoList= shopGoodsSpeciInfoBO.queryGoodsSpeciInfoByIdList(itemList.stream().map(OrderItemDTO::getGoodsSpeciId).collect(Collectors.toList()));StringBuffer goodNames=new StringBuffer();int size = speciInfoList.size();for (int i = 0; i < size; i++) {ShopGoodsSpeciInfoDTO temp = speciInfoList.get(i);String goodsName = shopGoodsDTOMap.get(temp.getGoodsId()).getGoodsName();goodNames.append(goodsName);if (i < size - 1) {goodNames.append("、");}}if(goodNames.toString().length()>20){wxOrderArrivalDTO.setItemDesc(goodNames.toString().substring(0,10)+ELLIPSIS_3);}else{wxOrderArrivalDTO.setItemDesc(goodNames.toString());}JSONObject body = new JSONObject();JSONObject data = new JSONObject();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date = sdf.format(DateUtil.now());data.put("time1",new JSONObject().fluentPut("value",date));data.put("thing2",new JSONObject().fluentPut("value",wxOrderArrivalDTO.getItemDesc()));data.put("amount3",new JSONObject().fluentPut("value",wxOrderArrivalDTO.getOrderAmount() + "元"));data.put("thing4",new JSONObject().fluentPut("value",wxOrderArrivalDTO.getShopName()) );data.put("const5", new JSONObject().fluentPut("value",CommonKey.CONSTANT_3.equals(wxOrderArrivalDTO.getDeliveryMethod()) ? "用户自提" : "商家配送"));body.put("data", data);body.put("url", officialAccountPushUrl);body.put("touser", wxOrderArrivalDTO.getOpenId());body.put("template_id", "这里填模板id");String result = null;try {result = HttpUtil.createPost(url).body(body.toJSONString()).execute().body();log.info("通知微信平台 订单到货接口返回:" + result);OrderPushMsgDTO orderPushMsgDTO = new OrderPushMsgDTO();orderPushMsgDTO.setPushMsgId(UUIDUtils.getUUID());orderPushMsgDTO.setOrderId(wxOrderArrivalDTO.getOrderId());orderPushMsgDTO.setOrderType(CommonKey.CONSTANT_1);JSONObject jsonObject = JSON.parseObject(result);orderPushMsgDTO.setPushType(CommonKey.CONSTANT_2);int errcode = jsonObject.getInteger("errcode");orderPushMsgDTO.setErrCode(String.valueOf(errcode));orderPushMsgBO.save(orderPushMsgDTO);} catch (Exception e) {throw new BizException(e.getMessage());}return result;}

获取公众号的tocken,要注意是url+json的形式

开始开发 / 获取 Stable Access token

 public WechatInfoDTO getWeChatAccessToken() {Map<String,Object> requestUrlParam=new HashMap<String,Object>();//appIdrequestUrlParam.put("appid", wechatAppId);//appSecretrequestUrlParam.put("secret", wechatSecret);//默认参数requestUrlParam.put("grant_type", "client_credential");ObjectMapper objectMapper = new ObjectMapper();String json = null;try {json = objectMapper.writeValueAsString(requestUrlParam);} catch (JsonProcessingException e) {e.printStackTrace();}//发送post请求读取调用微信接口获取accessToken信息String result = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/stable_token", json);JSONObject jsonObject = JSONObject.parseObject(result);Integer errcode = jsonObject.getInteger("errcode");if (errcode != null && errcode != 0) {String errmsg = jsonObject.getString("errmsg");log.error(result);throw new BizException(ResultCode.FAIL,errmsg);}return new WechatInfoDTO().setAccessToken(jsonObject.getString("access_token"));}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/360162.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<电力行业> - 《第1课:电力行业的五大四小》

1 什么是电力行业的五大四小&#xff1f; 我们常说的电力行业的五大四小&#xff0c;指的是电力行业有实力的公司&#xff0c;分为&#xff1a;较强梯队的五大集团、较弱梯队的四小豪门。 五个实力雄厚的集团&#xff0c;分别是&#xff1a; 中国华能集团公司中国大唐集团公…

公交行业系统特点及面临的挑战

在当前城市发展中&#xff0c;公交行业作为公共交通的重要组成部分&#xff0c;承担着重要的社会责任。随着科技的进步和城市化进程的加快&#xff0c;公交行业系统也在不断地发展和完善。然而&#xff0c;从目前的发展情况来看&#xff0c;公交行业系统也呈现出一些显著的特点…

怎么加密文件夹?文件夹加密软件推荐

文件夹加密是保护电脑数据的重要方法&#xff0c;那么你知道怎么加密文件夹吗&#xff1f;下面小编就为大家推荐两款文件夹加密软件&#xff0c;帮助你安全保护重要文件夹。 文件夹加密超级大师 在加密电脑文件夹时&#xff0c;文件夹加密超级大师是你必须要了解的文件夹加密软…

uniapp顶部导航栏实现自定义功能按钮+搜索框并监听响应事件

目录 第一步&#xff1a;先下载按钮需要展示的图标&#xff08;若不使用图标&#xff0c;直接使用文字可跳过这步&#xff09; 1、点击需要的图标&#xff0c;添加入库 2、点击旁边的购物车&#xff0c;在弹出的窗口中选择下载代码 3、解压下载的压缩包&#xff0c;将这几个…

鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二

一、鸿蒙应用界面开发 弹性布局-Flex 语法 /* 弹性容器组件 Flex() 位置&#xff1a; Flex默认主轴水平往右&#xff0c;交叉轴垂直向下&#xff08;类似Row&#xff09; 语法&#xff1a; Flex(参数对象){子组件1,子组件2,子组件3 } 属性方法&#xff1a; direction&#xf…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

达梦数据库(DM8)替换授权dm.key遇到的错误, lic info is different between dm.key and sysinfo.

1、报错贴图 2、报错日志提示 version info: security lic info is different between dm.key and sysinfo. 原因说明&#xff1a;dm.key授权与服务器的硬件环境不匹配引起的报错&#xff0c;如&#xff1a;cpu、操作系统版本有关。

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

嘀嗒出行项目管理专家和项目管理负责人王禹华受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 嘀嗒出行项目管理专家和项目管理负责人王禹华女士受邀为第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“AI时代项目经理挑战机会和个人成长”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; AI时代对互…

智能雷达在线编辑名片小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 智能雷达在线编辑名片小程序源码系统是一款集创新性、实用性和便捷性于一体的工具。它采用前后端分离的架构&#xff0c;为用户提供了一个强大的平台&#xff0c;可用于创建、编辑和管理个性化名片。 该系统旨在满足现代商业和社交需求&#xff0c;提供了一种高效、…

高校新生如何选择最优手机流量卡?

一年一度的高考已经结束了&#xff0c;愿广大学子金榜题名&#xff0c;家长们都给孩子准备好了手机&#xff0c;那么手机流量卡应该如何选择呢&#xff1f; 高校新生在选择手机流量卡时&#xff0c;需要综合考量流量套餐、费用、网络覆盖、售后服务等多方面因素&#xff0c;以下…

如何选择和优化谷歌外贸关键词?

长尾关键词是关键&#xff0c;长尾关键词是指由三个或更多词组成的更具体、更详细的搜索词组。与单个关键词相比&#xff0c;长尾关键词虽然搜索量较低&#xff0c;但往往能带来更高的转化率&#xff0c;因为它们更能精准地反映用户的搜索意图和需求 使用长尾关键词有几个优势…

全国计算机等级考试WPS如何报名

全国计算机等级考试WPS如何报名&#xff1f; 注册并登录 全国计算机等级考试官网选择 考试服务-在线报名选择报考省份-开始报名

qt经典界面框架

目的 其实就是一个简单的界面显示&#xff0c;是很常用的形式。 说起来简单也是简单&#xff0c;但当初&#xff0c;刚开始做时&#xff0c;感觉非常的复杂&#xff0c;不知如何下手。 现在感觉简单多了。 这个框架利用了QT的现成的MainWindow与QDockWidget&#xff0c;这样就…

Spring Boot 集成 MinIO 实现文件上传

Spring Boot 集成 MinIO 实现文件上传 一、 Minio 服务准备 MinIO的搭建过程参考 Docker 搭建 MinIO 对象存储。 登录MinIO控制台&#xff0c;新建一个 Bucket&#xff0c;修改 Bucket 权限为公开。 二、MinIO 集成 添加 MinIO 依赖 <!-- https://mvnrepository.com/ar…

【算法】数组-基础知识与应用

一.基础理论 数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标对应的数据。 数组下标都是从0开始的。数组内存空间的地址是连续的 因为数组在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c…

STM32 I2C总线锁死原因及解决方法

本文介绍STM32 I2C总线锁死原因及解决方法。 在使用STM32 I2C总线操作外设时&#xff0c;有时会遇到I2C总线锁死&#xff08;I2C总线为Busy状态&#xff09;的问题&#xff0c;即便复位MCU也无法解决&#xff0c;本文介绍其锁死的原因和解决方法&#xff0c;并给出相应的参考代…

干货分享 | TSMaster 中不同总线报文消息过滤的操作方式

TSMaster软件平台支持对不同总线&#xff08;CAN、LIN、FlexRay&#xff09;报文和信号的过滤&#xff0c;包括全局接收过滤、数据流过滤、窗口过滤、字符串过滤、可编程过滤&#xff0c;针对不同的总线信号过滤器的使用方法基本相同。今天重点和大家分享一下关于TSMaster中报文…

【数据结构】线性表之《队列》超详细实现

队列 一.队列的概念及结构二.顺序队列与链队列1.顺序队列2.链队列 三.链队列的实现1.创建队列2.初始化队列3.入队4.出队5.获取队头元素6.获取队尾元素7.队列的大小8.队列的判空9.清空队列10.销毁队列 四.队列的盲区五.模块化源代码1.Queue.h2.Queue.c3.test.c 六.栈和队列必做O…

FlinkCDC介绍及使用

CDC简介 什么是CDC&#xff1f; cdc是Change Data Capture(变更数据获取)的简称。核心思想是&#xff0c;监测并捕获数据库的 变动(包括数据或数据表的插入&#xff0c;更新以及删除等)&#xff0c;将这些变更按发生的顺序完整记录下来&#xff0c;写入到消息中间件以供其它服…