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

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


前言

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

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

方案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)		
	  				}
	  			})

### 微信小程序一次性订阅消息实现多次推送的方法 #### 小程序一次性订阅消息的特点 微信小程序一次性订阅消息允许用户在同意接收特定事件的消息通知后,服务器可以向该用户发送一次性消息提醒。然而,默认情况下每次订阅仅能触发单条消息的推送[^1]。 #### 利用一次性订阅模拟长期订阅效果的方式 尽管官方文档指出一次性订阅仅限于单一消息的通知能力,但实际上通过巧妙设计业务逻辑和服务端处理机制,可以在一定程度上达到类似于长期订阅的效果。具体法是在首次成功发送消息之后,在适当的时间间隔再次引导用户完成新的订阅动作,从而形成连续的信息传递链路[^2]。 #### 关键技术点解析 为了使这个过程尽可能无缝衔接并提高用户体验: - **创建合适的模板**:选择适合应用场景的消息模板,并确保其描述清晰明了以便获得用户的信任和支持。 - **前端优化体验**:当检测到即将到达下一条重要信息时提前提示用户重新确认订阅关系;可以通过对话框或其他交互方式告知他们即将错过的内容价值所在。 - **后台自动化流程构建**:开发一套自动化的脚本或工具来监控已知条件下的触发时机(比如某个周期结束前),一旦满足就立即执行上述提到的新一轮订阅邀请操作。 ```python def send_subscription_reminder(user_id, message_details): """ 发送订阅提醒给指定用户 参数: user_id (str): 用户唯一标识符 message_details (dict): 下次推送的具体内容概要 返回值: bool: 是否成功发起提醒 """ try: # 构建个性化文案鼓励用户继续关注 reminder_text = f"您即将收到关于{message_details['topic']}的重要更新,请点击下方链接续订:" # 调用微信API接口实施实际的消息投递行为... wechat_api.send_message_to_user( receiver=user_id, content=reminder_text + "\n\n[点击这里订阅](https://example.com/subscribe)" ) return True except Exception as e: print(f"Failed to remind {user_id}: ", str(e)) return False ``` #### 注意事项 值得注意的是这种方法虽然能够绕过传统意义上的一次性限制,但是仍然需要遵循平台对于频率、内容等方面的严格规定,避免因违规而被封禁账号的风险。此外,频繁打扰可能会引起反感甚至导致取消关注的情况发生,因此建议谨慎规划推送策略[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

益得助手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值