【Java】Java实现微信小程序发送服务通知

文章目录

  • 前言
  • 一、文档来源
  • 二、JAR包引入
  • 三、后端工作
  • 四、编写配置文件
    • 配置一:WxConfig
    • 配置二:WxProperties
  • 五、代码编写

前言

在上个月接到一个需求,大概是需要计算一条数据的最大办理时间从而发送任务超期的微信小程序服务通知,也是第一次接触到需要调用微信的API去进行发送消息,该博客记录此次功能开发的过程。

一、文档来源

本身微信的官方文档是提供了采用http调用的方式去进行调用微信的API微信小程序官方文档
但是俺想着都已经是什么年代了,于是找到了GitHub上的一个资料GitHub地址

我们可以看到几乎涵盖了所有微信相关的API
在这里插入图片描述

可以理解为不同的jar包对应引入了不从的SDK库,使调用的更方便,更简洁,下面就来依次讲解吧:

二、JAR包引入

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>4.0.0</version>
</dependency>

准备工作当然不止后端的JAR包引入,我们还需要选择一个将要发送消息通知的模板,此步如果是全栈大怨种就看该官方文档,很详细选择服务通知模板,如果是后端好哥们,就让前端自己研究,宗旨是需要拿到模板ID很重要!!见下图,为我圈中的那个ID,需要被后端拿到。

在这里插入图片描述

三、后端工作

我们先看我们所需要的所有配置,笔者均写到了yml中,可能不是太好看,见谅~

wx:
  miniapp:
    #上面拿到的很重要的那个模板ID
    template-id: g19lTFku79jXC58CDzTnoIeazJC8HHvbW82apat_vgs 
    configs:
      #微信小程序的appid 开发者工具拿到
      appid: wx05e2612sfav212bddev12
      #开发者工具拿到Secret
      secret: 91b5a9e5645e8cf2123213safasfgwgf
      #微信小程序消息服务器配置的token
      token: 123
      #微信小程序消息服务器配置的EncodingAESKey
      aesKey: 
      msgDataFormat: JSON

四、编写配置文件

该配置文件笔者这里为两个,大家也可以只写一个,主要目的是为了注入引入的JAR包中的WxMaService,只有用这个,我们才能进行调用API

配置一:WxConfig

这里需要注意的是笔者的WxProperties是写的另一个配置文件,如果大家觉得写配置文件很麻烦,也可以写一个,采用手动注入值的放肆,这个WxProperties见下一个配置文件:

@Slf4j
@Configuration
@EnableConfigurationProperties(WxProperties.class)
public class WxConfig {
    private final WxProperties properties;

    @Autowired
    public WxConfig(WxProperties properties) {
        this.properties = properties;
    }

    @Bean
    public WxMaService getService() {
        if (properties == null || properties.getAppid() == null || properties.getSecret() == null) {
            throw new WxRuntimeException("required wechat param not found");
        }
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid(properties.getAppid());
        config.setSecret(properties.getSecret());
        config.setToken(properties.getToken());
        config.setAesKey(properties.getAesKey());
        config.setMsgDataFormat(properties.getMsgDataFormat());
        WxMaService service = new WxMaServiceImpl();
        service.setWxMaConfig(config);
        return service;
    }

配置二:WxProperties

采用配置类注入的方式,如果大家不想写配置,可以采用手动设置值,目的是为了让上面的配置中的service注入到容器里面。

@Data
@ConfigurationProperties(prefix = "wx.miniapp.configs")
public class WxProperties {

    /**
     * 设置微信小程序的appid
     */
    private String appid;

    /**
     * 设置微信小程序的Secret
     */
    private String secret;

    /**
     * 设置微信小程序消息服务器配置的token
     */
    private String token;

    /**
     * 设置微信小程序消息服务器配置的EncodingAESKey
     */
    private String aesKey;

    /**
     * 消息格式,XML或者JSON
     */
    private String msgDataFormat;

}

五、代码编写

@RestController
@Slf4j
@Api(tags = "测试接口")
public class ZbSendDemoController {


    @Autowired
    private  WxMaService wxService;

    @Value("${wx.miniapp.template-id}")
    private String templteId;
    @Resource
    public RabbitTemplate rabbitTemplate;

    /**
     * 跳转的小程序页面
     */
    private static final String PAGES_ZP = "pages/draft-review/list/list";


    @GetMapping("/api/zphs/sendZbhsMsg")
    @ApiOperation("传openId发送微信服务通知")
    public ApiResult<Boolean> sendMsg(String openID)  {
        sendSmallMsg(openID);
        return ApiResult.success(true);
    }


    private  void sendSmallMsg(String openId)  {
        Map<String, String> map = new HashMap<>();
        map.put("phrase1","测试");
        map.put("thing3", "您收到了应征公民测试测试的任务提醒消息");
        map.put("time12", LocalDateTimeUtil.formatNormal(LocalDateTime.now()));
        WxMaSubscribeMessage wxMaSubscribeMessage = WxMaSubscribeMessage.builder()
                .toUser(openId)
                .templateId(templteId)
                .page(PAGES_ZP)
                .build();
        // 设置将推送的消息
        map.forEach((k, v) -> {
            wxMaSubscribeMessage.addData(new WxMaSubscribeMessage.Data(k, v));
        });
        try {
            log.info("开始发送消息!!!!");
            wxService.getMsgService().sendSubscribeMsg(wxMaSubscribeMessage);
            log.info("消息发送成功!!!!");
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
    }


    @GetMapping("/api/zphs/sendMqDemo")
    @ApiOperation("消息队列发送微信服务通知测试")
    public ApiResult<Boolean> sendMqDemo(String taskId,String time,String state,String id )  {
        sendMessage( taskId, time, state,id);
        return ApiResult.success(true);
    }

    public void sendMessage(String taskId,String time,String state,String id) {
        //发送延时队列消息
        Map<String, Object> map = new HashMap<>(10);
        map.put("taskId", taskId);
        map.put("state", state);
        map.put("bzpId",id);
        String message = JSON.toJSONString(map);
        log.info("开始发送!!!");
        rabbitTemplate.convertAndSend(RabbitMqSendMsgConfig.DELAYED_EXCHANGE_NAME, RabbitMqSendMsgConfig.DELAYED_ROUTING_KEY,
                message, msg -> {
                    msg.getMessageProperties().setDelay(Integer.parseInt(time));
                    return msg;
                });
        log.info("发送消息成功!!!");
    }

笔者这里的Controller很乱,因为里面不仅有发送消息的代码,也有RabbitMq的代码,当然这都是和具体业务相关,我们的重点是sendSubscribeMsg到这一步,消息就发送成功了,我们可以看到实例:
在这里插入图片描述

到这里,我们需要有几个地方注意:

  1. 模板中当前状态,温馨提示,工单创建时间均为参数对应值,代码是为发送前的Map里面

  2. Controller最上面有一行:

      private static final String PAGES_ZP = "pages/draft-review/list/list";
    

    对应为点击进入小程序跳转的页面,为具体业务所定

  3. OpenId是个很重要的东西,是登录微信小程序都会获取到的,唯一性的,微信的API就是通过OpenId给具体的用户发送消息,所以第一个方法内我的参数就为OpenId,这个OpenId是前端传输到后端的,我在这里仅仅是一个Demo接口,切记

一定要和微信小程序模板上的保持一致,个数及参数名(模板的参数可以在微信开发者工具上看),注意部分参数有字数限制,具体限制要求可以查看微信开发者工具上的具体描述。

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

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

相关文章

IDDR和ODDR

IDDR D&#xff1a;输入双倍速率数据&#xff08;IOB输入&#xff0c;且数据在时钟的上升沿和下降沿都会发生切换&#xff0c;即一个时钟周期发送2bit数据&#xff09; CE&#xff1a;时钟使能信号&#xff08;高有效&#xff09; C&#xff1a;时钟信号 S&#xff0c;R&#x…

黑马大数据学习笔记2-HDFS基本操作

目录 进程启停管理一键启停脚本单进程启停 文件系统操作命令HDFS文件系统基本信息介绍创建文件夹查看指定目录下内容上传文件到HDFS指定目录查看HDFS文件内容下载HDFS文件拷贝HDFS文件追加数据到HDFS文件HDFS数据移动HDFS数据删除其他命令HDFS WEB浏览 HDFS权限修改权限 https:…

Spark MLlib快速入门(1)逻辑回归、Kmeans、决策树、Pipeline、交叉验证

Spark MLlib快速入门(1)逻辑回归、Kmeans、决策树案例 除了scikit-learn外&#xff0c;在spark中也提供了机器学习库&#xff0c;即Spark MLlib。 在Spark MLlib机器学习库提供两套算法实现的API&#xff1a;基于RDD API和基于DataFrame API。今天&#xff0c;主要介绍下Data…

FPGA实验四:交通灯控制器设计

目录 一、实验目的 二、设计要求 三、实验代码 1.design source文件代码 2.仿真文件代码 3.代码原理分析 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 3、下载测试结果及分析 五、实验心得 1.解决实验中遇见的问题及解决 2.实验完成的心得 一、实验目的 &a…

Linux使用HTTP隧道代理代码示例模版

下面是一个在Linux上使用HTTP隧道代理的代码示例模板&#xff0c;可以根据自己的实际情况进行修改和配置&#xff1a; #!/bin/bash# 配置代理服务器信息 proxy_server"代理服务器IP或域名" proxy_port"代理服务器端口号" proxy_username"代理服务器用…

《动手学深度学习》——线性神经网络

参考资料&#xff1a; 《动手学深度学习》 3.1 线性回归 3.1.1 线性回归的基本元素 样本&#xff1a; n n n 表示样本数&#xff0c; x ( i ) [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_d] x(i)[x1(i)​,x2(i)​,⋯,xd(i)​…

《实战AI低代码》:普元智能化低代码开发平台发布,结合专有模型大幅提升软件生产力

在7月6日举办的“低代码+AI”产品战略发布会上,普元智能化低代码开发平台正式发布。该平台融合了普元自主研发的专有模型,同时也接入了多款AI大模型的功能。它提供了一系列低代码产品,包括中间件、业务分析、应用开发、数据中台和业务流程自动化等,旨在简化企业的复杂软件生…

Nginx学习

文章目录 Nginx什么是NginxLinux安装与配置Nginx编译安装Nginxnignx使用nginx默认首页配置案例 localtion的匹配规则Nginx虚拟主机基于多IP的虚拟主机基于多端口的虚拟主机基于域名的虚拟机主机 反向代理案例①案例② 负载均衡案例①案例②分配策略 动静分离案例 配置Nginx网关…

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;58&#xff09;-- 算法导论6.4 2题 二、试分析在使用下列循环不变量时&#xff0c;HEAPSORT 的正确性&#xff1a;在算法的第 2~5行 for 循环每次迭代开始时&#xff0c;子数组 A[1…i]是一个包含了数组A[1…n]中第i小元素的最大…

【Distributed】zookeeper+kafka的应用及部署

文章目录 一、zookeeper1. zookeeper的概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制第一次启动选举机制非第一次启动选举机制选举Leader规则 2. 部署 Zookeeper 集群2.1 安装前准备2.2…

day52

思维导图 比较指令结果的条件码 练习 汇编实现1-100的累加 .text .global _strat _start: mov r0,#0mov r1,#0 add_fun:add r0,r0,#1cmp r0,#100addls r1,r1,r0bls add_fun .end

机器学习技术(三)——机器学习实践案例总体流程

机器学习实践案例总体流程 文章目录 机器学习实践案例总体流程一、引言二、案例1、决策树对鸢尾花分类1.数据来源2.数据导入及描述3.数据划分与特征处理4.建模预测 2、各类回归波士顿房价预测1.案例数据2.导入所需的包和数据集3.载入数据集&#xff0c;查看数据属性&#xff0c…

JVM重点整理

一、虚拟机架构图 二、类加载过程 类加载器的作用&#xff1a;负责把class文件加载到内存中 类加载过程&#xff1a; 加载&#xff1a; 通过类的全限定名获取此类的二进制字节流文件的编码结构---->运行时的内存结构内存中生成一个class对象 链接&#xff1a; 验证&#x…

【网络】socket——预备知识 | 套接字 | UDP网络通信

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面本喵对网络的整体轮廓做了一个大概的介绍&#xff0c;比如分层&#xff0c;协议等等内容&#x…

【QT】元对象系统学习笔记(一)

QT元对象系统 01、元对象系统1.1、 元对象运行原则1.2、 Q_OBJECT宏1.3、 Qt Creator启动元对象系统1.4、 命令行启动元对象&#xff08;不常用&#xff09; 02、反射机制2.1、 Qt实现反射机制2.2、 反射机制获取类中成员函数的信息2.1.1、 QMetaMethon类2.1.2、QMetaObject类 …

【UE4 塔防游戏系列】07-子弹对敌人造成伤害

目录 效果 步骤 一、让子弹拥有不同伤害 二、敌人拥有不同血量 三、修改“BP_TowerBase”逻辑 四、发射的子弹对敌人造成伤害 效果 步骤 一、让子弹拥有不同伤害 为了让每一种子弹拥有不同的伤害值&#xff0c;打开“TotalBulletsCategory”&#xff08;所有子弹的父类…

架构训练营:3-3设计备选方案与架构细化

3架构中期 什么是备选架构&#xff1f; 备选架构定义了系统可行的架构模式和技术选型 备选方案筛选过程 头脑风暴 &#xff1a;对可选技术进行排列组合&#xff0c;得到可能的方案 红线筛选&#xff1a;根据系统明确的约束和限定&#xff0c;一票否决某些方案&#xff08;主要…

为 GitHub 设置 SSH 密钥

1. 起因 给自己的 github 改个名&#xff0c;顺便就给原来 Hexo 对应的仓库也改了个名。然后发现 ubhexo clean && hexo generate && hexo deploy 失败了&#xff0c;报错如下&#xff1a; INFO Deploying: git INFO Clearing .deploy_git folder... INFO …

Hive自定义函数

本文章主要分享单行函数UDF&#xff08;一进一出&#xff09; 现在前面大体总结&#xff0c;后边文章详细介绍 自定义函数分为临时函数与永久函数 需要创建Java项目&#xff0c;导入hive依赖 创建类继承 GenericUDF&#xff08;自定义函数的抽象类&#xff09;&#xff08;实现…

仓库管理软件有哪些功能?2023仓库管理软件该如何选?

对于现代企业或批发零售商&#xff0c;高效的仓库管理是确保供应链运作顺畅、库存控制精准的关键要素。在数字化时代&#xff0c;越来越多的企业和商户意识到采用仓库管理软件的重要性。 无论您是中小型企业还是中小商户&#xff0c;仓库管理都是不可忽视的一环。 一、选择仓库…