益得助手消息-小程序如何重复做一次性订阅消息

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

分析:按照小程序现在的政策,订阅消息大多数类型只能选择一次性订阅,也就是用户订阅一次只能发送一次消息。

那如何让用户每次增加一次订阅呢?

方案1:每次登陆点击功能页面时候提示订阅,因为订阅消息不能在onload()中运行,所以只能采用点击某个动作触发。但是每次点击触发对用户不友好,特别是新用户还有抗拒心理的时候,往往点击拒绝了

方案2、新增数据时候提示授权,取代每次点击页面授权

方案3、增加单独消息页面,提醒用户未读信息,点击一次未读信息授权一次。

综合现有条件,选择方案3,开干!


一、益得助手

二、步骤

1.设计消息数据库结构

代码如下(示例):

CREATE TABLE `es_massege`  (
  `id` bigint(0) NOT NULL COMMENT 'id',
  `from_id` bigint(0) NULL DEFAULT NULL COMMENT '来源id',
  `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id',
  `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
  `massege_type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型',
  `subject` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主题',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `read_time` datetime(0) NULL DEFAULT NULL COMMENT '阅读时间',
  `read_status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '阅读状态',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
 

2.新增消息时用雪花算法获取id

代码如下(示例):

@Override
    public int insertEsMassege(EsMassege esMassege)
    {
        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1);
        esMassege.setId(idWorker.nextId());
        esMassege.setCreateTime(DateUtils.getNowDate());
        return esMassegeMapper.insertEsMassege(esMassege);
    }

在service里面调用

 /**
     * 新增待办
     *
     * @param esProjectTodo 待办
     * @return 结果
     */
    @Override
    @Transactional
    public int insertEsProjectTodo(EsProjectTodo esProjectTodo) throws WxErrorException {

        esProjectTodo.setCreateTime(DateUtils.getNowDate());
        Map<String, Object> map = JSON.parseObject(esProjectTodo.getOptionValue(),Map.class);;
        esProjectTodo.setCustomFields(map);
        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1);
        esProjectTodo.setId(idWorker.nextId());
        if(esProjectTodo.getAgentId()==0){
            esProjectTodo.setTodoNo("T"+esProjectTodo.getId());
        }else {
            SysUser loginUser = SecurityUtils.getLoginUser().getUser();
            String currentYear=getCurrentYear(loginUser.getNowAgent());
            esProjectTodo.setTodoNo(currentYear);
            String todoNo= esProjectTodoMapper.selecLastTodoNo(esProjectTodo);
            todoNo=getNewNo(currentYear,todoNo,loginUser.getNowAgent());
            esProjectTodo.setTodoNo(todoNo);
        }
         esProjectTodoMapper.insertEsProjectTodo(esProjectTodo);
       if(esProjectTodo.getPrincipalId()!=null && esProjectTodo.getPrincipalId() != esProjectTodo.getCreateId()){
            //系统记录消息

               EsMassege esMassege=new EsMassege();
               esMassege.setSubject("任务指派提醒");
               esMassege.setUserId(esProjectTodo.getPrincipalId());
               esMassege.setPathPc("/project/mytodo");
               esMassege.setPath("/todo/index");
               esMassege.setContent("你有新指派的待办任务,请注意查收!");
               esMassege.setMassegeType("1");
               esMassege.setFromId(esProjectTodo.getCreateId());
               Date date = new Date();
               SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd");
               esMassegeService.insertEsMassege(esMassege);
           try {
               List<WxMaSubscribeMessage.MsgData> data=
                       Arrays.asList(
                               new WxMaSubscribeMessage.MsgData("thing1","任务指派提醒"),
                               new WxMaSubscribeMessage.MsgData("time2",dateFormat.format(date)),
                               new WxMaSubscribeMessage.MsgData("thing12","你有新指派的待办任务,请注意查收!")
                       );
               //小程序推送订阅消息
                 sendWxMessage.sendTemplateMessage(WxMaSubscribeMessage.builder()
                       .toUser(userService.selectUserOpenIdByUserId(esProjectTodo.getPrincipalId()))
                       .templateId("D3d8A63J2yWIf_2rWxqK8lT4eePHVdbTDIbcstkFc-xxx")
                       .page("/todo/index")
                       .miniprogramState("develop")
                       .data(data)
                       .build());
               return 1;
           } catch (WxErrorException e) {
               e.printStackTrace();
           }
       }
        return 1;
    }

发生微信消息增加try catch 避免因没有授权订阅发送消息失败。

测试能够收到推送消息

下一步就是引导用户授权了

在我的页面增加未读消息提醒,引导用户点击查看,从而触发授权。

前端点击信息调用一次授权

 uni.requestSubscribeMessage({
	  				//此处填写刚才申请模板的模板ID
	  				tmplIds: ['D3d8A63J2yWIf_2rWxqK8lT4eePHVdbTDIbcstkFc-xxx'],
	  				success (res) {
	  					console.log(res)		
	  				}
	  			})

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

益得助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值