概述
最近在做项目的时候有一个新的需求是微信小程序,用户报名活动,用户积分变化,课程提醒的时候用户需要受到一条订阅消息,自己通过研究与开发,最终成功完成,接下来总结一下。
一、前期准备
RabbitMQ
1. 准备交换机和队列并将其绑定在一起
交换机:activeExchange
队列:activeQueue
路由 key:activeRouting
2. 设置 openId
这个 openId 是在用户表中的一个字段,具有唯一性,由系统自动生成。
二、相关配置
在spring boot的 yml
中的配置
1. RabbitMQ
host: xx.xxx.xxx.xxx
username: username
password: password
virtual-host: /
2. 微信小程序
id: XXXXXXXXXXXXXXXXX
secret: XXXXXXXXXXXX
mch_id: XXXXXXXXXXXXXXXX
mch_name: XXXXXXXXXXXXXXXX
key: XXXXXXXXXXXXXXXX
unifiedorder_url: XXXXXXXXXXXXXXXX
closeorder_url: XXXXXXXXXXXXXXXX
小程序的配置在自己注册时小程序开发面板都是可以获取到的,
3. 本次使用的是weixin-java
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.1.0</version>
weixin-java 中已经封装好了一些方法,跟微信开发文档息息相关,
三、代码实现思路
1. 给队列中存入自己的内容
存放的内容有自己决定,这里存放用户id (userId
) 以及活动id(activityId
),表明了那位用户参加了哪项活动,发送消息为活动的具体内容,利用模板是RabbitTemplate
代码实现
public void saveQueue(Long activityId, Long userId){
Map<String, Object> map = new HashMap<>();
map.put("activityId", activityId);
map.put("userId", userId);
// 将信息添加到队列
try {
System.out.println("存入用户信息");
rabbitTemplate.convertAndSend("activityExchange", "activityRouting", map);
} catch (Exception e) {
e.printStackTrace();
}
}
该方法在需要给队列中存入信息时调用。
这样就可以给队列中存入了信息,也就是生成者的作用已经完成了。接下来需要消费掉此消息。
2. 监听队列中的消息
@RabbitListener(queues = "activityQueue")
public void activityReceive(Map<String, Object> map){
// map 集合汇总装有 活动 Id,用户 Id
// 发送消息模板给用户
xxxxService.sendTemplateToUser(map);
}
当队列中有加入信息之后就将会被监听到,然后调用对应的方法(发送消息模板给用户)即可。
3. sendTemplateToUser 方法
public void sendTemplateToUser(Map map) {
if (!map.containsKey("activityId")&& !map.containsKey("userId")) {
throw new BadRequestException("积分记录发送失败");
}
Long activityId = (Long) map.get("activityId");
Long userId = (Long) map.get("userId");
System.out.println(map);
// 根据 userId 获取 用户信息
User user = userMapper.selectById(userId);
// 根据用户 openId 发送订阅消息
sendSubscribeMsg(activityId,user.getOpenid());
}
4. 发送订阅消息具体方法
public void sendSubscribeMsg(Long activityId, String openId){
Activity activity = activityMapper.selectById(activityId);
if(ObjectUtil.isNull(activity)){
log.error("【未能找到此活动】操作人:"+openId);
throw new BadRequestException("【查询轰动为空】");
}
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
WxMaSubscribeMessage message = new WxMaSubscribeMessage();
message.setTemplateId("XXXXXXXXXXXXXXXXXXXXXXX");
message.setToUser(openId);
message.setPage("xxxxx/xxx/xxxx/xxxxx?activityId="+activityId);
// 点击订阅消息跳转的版本:DEVELOPER: 开发版本,TRIAL:体验版本, FORMAL:正式版本
message.setMiniprogramState(WxMaConstants.MiniProgramState.FORMAL);
String content;
content = activity.getDetail();
if(ActivityContent.length() > 18){
ActivityContent = activity.getDetail().substring(0, 15)+"...";
}
message.addData(new WxMaSubscribeMessage.MsgData("thing1", activity.getTitle()));
message.addData(new WxMaSubscribeMessage.MsgData("thing4", content));
message.addData(new WxMaSubscribeMessage.MsgData("date3", dtf.format(activity.getOverTime())));
.......
try {
wxMaService.getMsgService().sendSubscribeMsg(message);
} catch (WxErrorException e) {
String msg = e.getMessage().substring(e.getMessage().indexOf("{"));
log.info("【订阅消息失败】错误信息:"+msg);
}
}
具体分析
- setToUser(openId):根据重数据库中查询出来的 openId 来判断此条订阅消息发送给谁
- 模板消息中的内容最多不能超出20个字,否则会报错,因此上面代码中有了一个字符串长度的判断。
WxMaConstants.MiniProgramState.FORMAL
设置订阅消息发送后跳转的版本,版本一共有三种。1、DEVELOPER: 开发版本。2、TRIAL:体验版本。3、FORMAL:正式版本)message.setPage()
表示用户受到订阅消息之后点击跳转的页面。wxMaService.getMsgService().sendSubscribeMsg(message);
将消息发送出去。
这是后端核心代码分析,将前期工作准备好之后,经历的步骤:存入队列信息—》监听取出队列信息----》发送订阅消息。相对来说,简单的订阅消息功能就很容易实现了。
此次是在项目中开发时从 0 到完成,学习的并不是特别深入,RabbitMQ 还有更多的细节去学习,目前只是达到了会简单的使用,接下来就是将 RabbitMQ 好好学习一下。
欢迎各位小伙伴学习交流!!!
最后
以上就是野性香菇为你收集整理的利用RabbitMQ发送微信小程序订阅消息一、前期准备二、相关配置三、代码实现思路的全部内容,希望文章能够帮你解决利用RabbitMQ发送微信小程序订阅消息一、前期准备二、相关配置三、代码实现思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复