消息订阅

ikunba / 2023-05-05 / 原文

填报接口修改:

每周填报和月季填报的差不多的,都是要相隔一周或者一个月来进行填写的。如果在短期内连续的两次填报的话,会出现消息填写,就是要写这个填报要在一周或者一个月后才能继续填报。但是其中的判断是挺多的,首先你要判断这个每周填报是否是第一次填写,就要去数据库中找到weeklyTime是否为空,否则就是有时间值; 当weeklyTime为空的话,用对象new Date();来获取当前的时间,将时间修改进去,然后将一些修改的数据也要修改进去,当weeklyTime是有时间的话,先判断这个时间和当前时间的毫秒差值。根据这个毫秒差值进行除于一天的毫秒数据86400000,是否超过指定的一周的时间7天或者一个月。如果没有超过规定的日期就会提醒你,未到填写时间。如果到了填写的时间就会将其中的数据进行修改上传,并将当前的时间修改上次,保证下次的填写的毫秒差。

/**
* 月季填报
* @param monthlyReport
* @return
*/
@Override
public boolean monthlyReport(MonthlyReport monthlyReport) throws CustomException {
   boolean update=false;
   boolean update1=false;
   //找到指定的用户
   LambdaQueryWrapper<TbUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
   lambdaQueryWrapper.eq(TbUser::getUserId,monthlyReport.getUserId());
   TbUser one = iTbUserService.getOne(lambdaQueryWrapper);


   String s = String.valueOf(one.getMonthlyTime());

   if (s=="null"){

       //读取当前的时间 存入数据库
       Date date = new Date();
       one.setMonthlyTime(date);
       //修改血脂
       one.setBloodFat(monthlyReport.getBloodFat());
       //修改总胆固醇
       one.setTotalCholesterol(monthlyReport.getTotalCholesterol());
       //修改高密度脂蛋白
       one.setHighDensityLipoprotein(monthlyReport.getHighDensityLipoprotein());
       //修改低密度脂蛋白
       one.setLowDensityLipoprotein(monthlyReport.getLowDensityLipoprotein());
       boolean update2 = iTbUserService.update(one, lambdaQueryWrapper);

       //—————————————————————颈动脉超声检查——————————————————————————————
       //查询该用户指定的颈动脉超声
       LambdaQueryWrapper<TbAtheromatousPlaque> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
       lambdaQueryWrapper1.eq(TbAtheromatousPlaque::getUserId,one.getUserId());

       TbAtheromatousPlaque one1 = iTbAtheromatousPlaqueService.getOne(lambdaQueryWrapper1);
       //修改有无粥样斑快
       one1.setAtheromatousPlaque(monthlyReport.getAtheromatousPlaque());
       //修改粥样斑快大小
       one1.setAtheromatousPlaqueSize(monthlyReport.getAtheromatousPlaqueSize());

       update1 = iTbAtheromatousPlaqueService.update(one1, lambdaQueryWrapper1);
       return  update1 && update2;
  }

   //读取其中的时间差值
   long l = new Date().getTime() - one.getMonthlyTime().getTime();
   //一天的毫秒
   long l1 = l / (86400000L);

   //一个月
   if (l1>=30 && s!="null"){
       //修改血脂
       one.setBloodFat(monthlyReport.getBloodFat());
       //修改总胆固醇
       one.setTotalCholesterol(monthlyReport.getTotalCholesterol());
       //修改高密度脂蛋白
       one.setHighDensityLipoprotein(monthlyReport.getHighDensityLipoprotein());
       //修改低密度脂蛋白
       one.setLowDensityLipoprotein(monthlyReport.getLowDensityLipoprotein());

       //读取当前的时间 存入数据库
       Date date = new Date();
       one.setMonthlyTime(date);

       update = iTbUserService.update(one, lambdaQueryWrapper);

       //—————————————————————颈动脉超声检查——————————————————————————————
       //查询该用户指定的颈动脉超声
       LambdaQueryWrapper<TbAtheromatousPlaque> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
       lambdaQueryWrapper1.eq(TbAtheromatousPlaque::getUserId,one.getUserId());

       TbAtheromatousPlaque one1 = iTbAtheromatousPlaqueService.getOne(lambdaQueryWrapper1);
       //修改有无粥样斑快
       one1.setAtheromatousPlaque(monthlyReport.getAtheromatousPlaque());
       //修改粥样斑快大小
       one1.setAtheromatousPlaqueSize(monthlyReport.getAtheromatousPlaqueSize());

       update1 = iTbAtheromatousPlaqueService.update(one1, lambdaQueryWrapper1);

       return update && update1;
  }else {
       throw new CustomException("本月已填写!请勿重复提交!");
  }

}

 

问题及解决

一、推送消息:小程序“订阅消息”功能 开发步骤出现的问题(参考)

  • 1.小程序调用wx.requestSubscribeMessage,进行消息订阅用户授权

  • 2.小程序调用wx.login,获取code

  • 3.后端访问请求,获取用户openId

  • 4.后端访问请求,获取小程序全局唯一后台接口调用凭据access_token

  • 5.后端访问请求,推送订阅消息

  • 6.推送订阅消息结束,用户成功接收消息

 

1.小程序调用wx.requestSubscribeMessage,进行消息订阅用户授权

微信小程序官方参考地址:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html 订阅消息模板配置:https://mp.weixin.qq.com/wxamp/newtmpl/mytmpl?start=0&limit=10&token=1241600784&lang=zh_CN

代码如下(示例):

wx.requestSubscribeMessage({
  tmplIds: ['订阅消息模板ID'],
   success (res) {
     console.log(res);
  }
})

我的理解: 消息订阅发送过来会有一个模板格式,比如微信支付啊,服务通知啊。一般是前端给你后台的

2.小程序调用wx.login,获取code

代码如下(示例):

// 登录
wx.login({
  success: res => {
    // 发送 res.code 到后端换取 openId, sessionKey, unionId
    // 后端访问请求获取用户openId
    console.log(res.code);
  },
  fail: res => {
    // 登录失败
    console.log("登录失败!");
  }
})

用户openid:同一用户,访问不同的小程序,得到的openid都是不一样的,即openid与小程序有关 用户unionId:同一用户,对同一个微信开放平台下的不同应用(同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序)),UnionID是相同的。可通过 UnionID 来区分用户的唯一性。

我的理解:前端说ode是登录的时候会生成的,当后台中的账号和密码登录的前端给自动生成一个code。还会生成一个openId传到数据库中

 

3.后端访问请求,获取用户openId

微信小程序官方参考地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

使用apifox模拟访问请求(示例):

 

我上面呈现出来的是报错误的,40029是一个js.code无效的错误,但是code我是找前端要的。后来我又找前端要了一个code,但是还要报错的,这次是40163 oauth_code已使用的错误。又让前端给我发了一个还是报已经使用的错误。(我的猜想是当生成code的同时openid也会自动生成,生成过openId的就会报这样的错)

正确的返回案例:

 

 

4.后端访问请求,获取小程序全局唯一后台接口调用凭据access_token

微信小程序官方参考地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html

使用apifox模拟访问请求(示例):

 

这个接口调用access_token没有出现错误,所需要的参数有三个grant_type,appid,secret。生成了一个access_token的小程序码

  • 请求参数
属性类型必填说明
appid string 小程序 appId
secret string 小程序 appSecret
js_code string 登录时获取的 code,可通过wx.login获取
grant_type string 授权类型,此处只需填写 authorization_code

 

5.后端访问请求,推送订阅消息

微信小程序官方参考地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html

使用apifox模拟访问请求(示例):

 

这里出现一个错误,其中的参数很多有

  • 请求参数

属性类型必填说明
access_token string 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
template_id string 所需下发的订阅模板id
page string 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
touser string 接收者(用户)的 openid
data string 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }的object
miniprogram_state string 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
lang string 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN

但是我这里的报错是 40003不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID,我找了很多的解决办法都是不行的

我在微信公众的平台上

 

最后这个问题还是没有解决掉。

学习重点及理解

后台管理的前端打包dist为了上传服务器

依次输入如下命令,进入ruoyi-ui文件夹,并对前端代码进行打包,生成一个dist文件夹,这就是前端代码打包后的文件:

cd ruoyi-ui
npm run build:prod

 

后台的后端接口打包上传服务器

先将之前打包的jar删掉,然后重新打包jar,上传到服务器

 

总结

今天的学习的状态是一般的,一直在研究消息订阅是如何做的,其中的一参数我一个个找出来,最后还是发送出来是报错的。找了很多的网上报错的案例,就是解决不了这个openId没有关注公众号,就很奇怪。后面就是跟着学了一个项目部署到服务器一些操作。