使用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>();
        //appId
        requestUrlParam.put("appid", wechatAppId);
        //appSecret
        requestUrlParam.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"));
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue+canvas画布实现网页签名效果

1、签名自定义组件代码示例&#xff1a; qianMing.vue <template><!-- 容器&#xff0c;包含画布和清除按钮 --><div class"signature-pad-container"><!-- 画布元素&#xff0c;用于用户签名 --><canvasref"canvas" <!--…

领克杀入纯电赛道:年轻人想要一台什么样的大电轿?

‍作者 |老缅 编辑 |德新 6月12日&#xff0c;领克旗下首款纯电动车型在瑞典进行了全球首秀&#xff0c;该车正式定名为Z10。 Z10的字母「Z」&#xff0c;源自ZERO。 Zeal-激情&#xff0c;Enjoy-享受&#xff0c;Responsibility-责任&#xff0c;Original-原创&#xff0c;…

动态规划数字三角形模型——AcWing 275. 传纸条

动态规划数字三角形模型 定义 动态规划数字三角形模型是在一个三角形的数阵中&#xff0c;通过一定规则找到从顶部到底部的最优路径或最优值。 运用情况 通常用于解决具有递推关系、需要在不同路径中做出选择以达到最优结果的问题。比如计算最短路径、最大和等。 计算其他…

中国高分辨率土壤侵蚀因子K

土壤可蚀性因子&#xff08;K&#xff09;数据&#xff0c;基于多种土壤属性数据计算&#xff0c;所用数据包括土壤黏粒含量&#xff08;%&#xff09;、粉粒含量&#xff08;%&#xff09;、砂粒含量&#xff08;%&#xff09;、土壤有机碳含量&#xff08;g/kg&#xff09;、…

【新版本来袭】ONLYOFFICE桌面编辑器8.1 —— 重塑办公效率与体验

文章目录 一、功能完善的PDF编辑器&#xff1a;重塑文档处理体验编辑文本插入和修改各种对象&#xff0c;如表格、形状、文本框、图像、艺术字、超链接、方程式等添加、旋转和删除页面添加文本注释和标注 二、幻灯片版式设计&#xff1a;创意展示的无限舞台三、改进从右至左显示…

规则引擎-Aviator 表达式校验是否成立

目录 介绍特性使用更多文献支持 介绍 Aviator是一个轻量级、高性能的Java表达式执行引擎&#xff0c;它动态地将表达式编译成字节码并运行。 特性 支持绝大多数运算操作符&#xff0c;包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(~)、三元表达式(?:…

接口防篡改+防重放攻击

接口防止重放攻击&#xff1a;重放攻击是指攻击者截获了一次有效请求(如交易请求),并在之后的时间里多次发送相同的请求&#xff0c;从而达到欺骗系统的目的。为了防止重放攻击&#xff0c;通常需要在系统中引入一种机制&#xff0c;使得每个请求都有一个唯一的标识符(如时间戳…

Go 如何使用指针灵活操作内存

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

华为的开发语言有2中,分别是ArkTS和仓颉,他们的区别是什么?

华为的开发语言有2中&#xff0c;分别是ArkTS和仓颉&#xff0c;他们的区别在哪呢&#xff1f; ArkTS和仓颉&#xff08;cangjie&#xff09;他们的区别是什么&#xff1f; 华为的仓颉和 ArkTS 是两种不同的编程语言&#xff0c;它们有以下区别&#xff1a; 设计目的&#xff1…

emoji控必备:制作一个emoji面板插件

说在前面 &#x1f4bb;在数字时代&#xff0c;emoji表情符号已成为很多人沟通的重要工具&#xff0c;但是输入法中的emoji表情包可能不太够用&#xff0c;所以很多时候我会到在线的网站去复制emoji&#xff0c;然后再回来粘贴&#xff0c;这样操作感觉有点繁琐&#xff0c;所以…

在线朋友圈系统(Java Web)

本项目是一个基于Java Web技术栈开发的在线朋友圈系统&#xff0c;提供用户注册、登录、动态发布与评论、好友发现与管理等功能。通过Spring Boot、MySQL、MyBatis、Sa-token以及LayUI等技术实现&#xff0c;确保系统具有良好的性能和扩展性。 技术栈 后端技术 Spring Boot: …

问题-python-爬虫无法爬取外网资源问题(python爬虫)

方法一&#xff1a; 这个报错通过关掉梯子就能解决&#xff0c;目前不清楚具体原理。 后续了解具体原理了&#xff0c;我会在这篇文章上更新具体分析—— 方法二&#xff1a; 也可以把这个东西打开&#xff0c;但是用完建议关掉。

红酒品鉴新手速成:一键解锁味觉密码,让你秒变品鉴达人

红酒&#xff0c;这被誉为“液体宝石”的美酒&#xff0c;承载着丰富的口感和深邃的文化。对于许多人来说&#xff0c;品鉴红酒既是一种享受&#xff0c;也是一门艺术。然而&#xff0c;对于初学者来说&#xff0c;如何开始这场美妙的味觉之旅呢&#xff1f;今天&#xff0c;就…

vite项目自定义端口号

server.port​ 类型&#xff1a; number默认值&#xff1a; 5173 指定开发服务器端口。 注意&#xff1a;如果端口已经被使用&#xff0c;Vite 会自动尝试下一个可用的端口&#xff08;5174&#xff09;&#xff0c;所以这可能不是开发服务器最终监听的实际端口。 在vite.con…

【金】02Y90-60 大数据-HivetoMysQL

1、安装 Java 程序&#xff08;jdk&#xff09; 2、添加以下JAR包 3、确认配置成自己的数据库 ....

jenkins api部署时,一直提示pending-Finished waiting

问题&#xff1a; 调用jenkins api部署时&#xff0c;一直提示pending-Finished waiting 解决方案&#xff1a; 这个问题困扰了很久&#xff0c;一直没有思路&#xff0c;后面看到调用jenkinsAPI本身会出现一段提示&#xff0c;pending in the quiet period&#xff0c;通过搜…

NAS安全存储怎样实现更精细的数据权限管控?

NAS存储&#xff0c;即网络附属存储&#xff08;Network Attached Storage&#xff09;&#xff0c;是一种专用数据存储服务器&#xff0c;其核心特点在于将数据存储设备与网络相连&#xff0c;实现集中管理数据的功能。 NAS存储具有以下明显优势&#xff0c;而被全球范围内的企…

PostgreSQL 17 Beta 1 发布!

PostgreSQL 全球开发小组宣布&#xff0c;PostgreSQL 17 的第一个测试版本现已可供下载。此版本包含 PostgreSQL 17 正式发布时将提供的所有功能的预览&#xff0c;但测试期间版本的某些细节可能会发生变化。 #PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证 您…

标准立项 | 湖库沉积物微生物多样性监测规程

饮用水水源地保护是饮用水安全保障中最重要的一个环节&#xff0c;其水质状况直接关系到供水区人民群众的身体健康。我国水资源存在水质差、资源短缺、资源时间空间分布不合理等问题。而近些年由水源地污染引发的饮用水安全事件&#xff0c;给居民的生产生活造成一定程度的影响…