提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
分析:按照小程序现在的政策,订阅消息大多数类型只能选择一次性订阅,也就是用户订阅一次只能发送一次消息。
那如何让用户每次增加一次订阅呢?
方案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)
}
})