java实现微信小程序订阅和推送订阅信息

这篇具有很好参考价值的文章主要介绍了java实现微信小程序订阅和推送订阅信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#小程序端配置

1、进入微信公众平台,扫码登录

    https://mp.weixin.qq.com/

2、获取appid和secret

    小程序后台->开发->开发管理->开发设置->开发者 ID(需要配置在yml文件中)

3、配置模板

    小程序后台->功能->订阅消息->我的模板->搜索需要模板(企业主体可以添加模板)->点击模板后面选用->选择关键词并填写场景->提交->点击详情->可以看到模板的详细信息->模板id需要配置在yml中。
    需要注意的是thing最多接收20个字符,如果字符过多可配置character_string类型,该类型最多32个字符

java 微信订阅,java,微信小程序,微信小程序订阅消息

后端代码配置

在对应yml中配置

spring-boot-plus:
  wechat:
    secret: 微信小程序中的secret
    appid: 微信小程序中的appid
    host: https://api.weixin.qq.com   固定配置
    templateId1: 需要使用的模板id  该配置的key的值自定义,可配置多个
    templateId2: xxx
    path1: /xxx/index/tagview/meeting/meeting?id=   点击通知详情后的跳转路径,可配置多个
    path2: /xxx/index/activity/activity?id=

增加订阅次数

前端调用弹出是否订阅时调用后台服务
1、controller

    /**
     * 订阅模板消息
     */
    @PostMapping("/addSubscribe")
    @ApiOperation(value = "订阅模板消息", notes = "订阅模板消息")
    public ApiResult<Boolean> addSubscribe(@Valid @RequestBody AddSinosoftWxSubscribeParam addSinosoftWxSubscribeParam) throws Exception {
        wxSubscribeServiceImpl.subscribe(addSinosoftWxSubscribeParam);
        return ApiResult.ok();
    }

2、后端接参AddSinosoftWxSubscribeParam

@Data
@Accessors(chain = true)
@ApiModel(value = "添加小程序订阅对象", description = "小程序订阅")
public class AddSinosoftWxSubscribeParam extends BaseEntity {

    private static final long serialVersionUID = 1L;


    @ApiModelProperty(value = "消息模板id集合")
    private List<String> templateIds;

    @ApiModelProperty(value = "openid")
    private String openid;

    @ApiModelProperty(value = "是否永久订阅 1:否 2:是")
    private String isForever;

}

3、service

   /**
     * 增加订阅次数
     *
     * @param addSinosoftWxSubscribeParam
     */
    public void subscribe(AddSinosoftWxSubscribeParam addSinosoftWxSubscribeParam) {

        log.info("开始===微信增加订阅次数,addSinosoftWxSubscribeParam:[{}]", addSinosoftWxSubscribeParam);
        // 获取当前登录
        String loginUserId = RequestContext.getLoginUserId();
        //String loginUserId = "1";
        //获取用户openId
        String openId = addSinosoftWxSubscribeParam.getOpenid();
        //判断是否永久订阅
        int isForever = Integer.parseInt(addSinosoftWxSubscribeParam.getIsForever());
        //批量存库list
        List<WxSubscribe> wxSubscribeList = new ArrayList<>();
        //是否永久订阅
        int isforever = Integer.parseInt(SubscribeTypeEnum.FOREVER.getValue());
        //int isForever = 1;
        for (String templateId : addSinosoftWxSubscribeParam.getTemplateIds()) {
            //查找数据库中是否有该用户的记录
            WxSubscribe wxSubscribe = wxSubscribeRepository.selectOne(templateId, loginUserId);
            log.info("用户信息,wxSubscribe:[{}]", wxSubscribe);
            //如果没有则新建用户
            if (wxSubscribe == null) {
                wxSubscribe = new WxSubscribe();
                wxSubscribe.setUserId(Long.parseLong(loginUserId));
                wxSubscribe.setTemplateId(templateId);
                wxSubscribe.setWeChatOpenid(openId);

                if (isForever == isforever) {
                    wxSubscribe.setIsForever(isforever);
                } else {
                    wxSubscribe.setTotal(1);
                }

                //保存到数据库
                //wxSubscribeMapper.insert(wxSubscribe);
            } else {
                log.info("[old-openid]" + wxSubscribe.getWeChatOpenid());
                log.info("[new-openid]" + openId);
                //判断是否永久订阅
                if (isForever == isforever) {
                    wxSubscribe.setIsForever(isforever);
                } else {
                    wxSubscribe.setTotal(wxSubscribe.getTotal() + 1);
                }
                // 更新openid
                wxSubscribe.setWeChatOpenid(openId);
                //保存到数据库
                //wxSubscribeMapper.updateById(wxSubscribe);
            }
            wxSubscribeList.add(wxSubscribe);
        }
        wxSubscribeRepository.saveOrUpdateBatch(wxSubscribeList);
        log.info("结束===微信增加订阅次数");
    }

推送订阅信息

一般时通过时间或者调度进行调用服务,以下只进行服务实现展示
1、在domain层写send方法

    public void send(String tempId, Map<String, Object> data, Long userId, String path) {
        this.send(tempId, data, Collections.singletonList(userId), path);
    }
    /**
     * 小程序通知发送
     *
     * @param tempId  通知模板
     * @param data    模板参数 其中key对应模板thing、time等值   value对应值
     * @param userIds 要发送的id
     * @param path    点击消息后打开的小程序页面
     */
    public void send(String tempId, Map<String, Object> data, List<Long> userIds, String path) {
        log.info("开始===微信通知发送业务处理,tempId:[{}],data:[{}],userIds:[{}],path:[{}]", tempId, data, userIds, path);
        //拼接模板参数
        Map<String, Object> outMap = new HashMap<>();
        for (Map.Entry<String, Object> entry : data.entrySet()) {
            Map<String, Object> inMap = new HashMap<>();
            inMap.put("value", entry.getValue());
            outMap.put(entry.getKey(), inMap);
        }
        log.info("[userIds]" + userIds);
        //是否永久订阅
        int notForever = Integer.parseInt(SubscribeTypeEnum.NOTFOREVER.getValue());
        int forever = Integer.parseInt(SubscribeTypeEnum.FOREVER.getValue());
        //查找数据库中所有订阅了该模板的用户
        List<WxSubscribe> tmpSinosoftWxSubscribes = wxSubscribeRepository.selectWxSubscribeList(tempId, userIds);
        List<WxSubscribe> wxSubscribes = tmpSinosoftWxSubscribes.stream().filter(x -> (x.getIsForever() == forever || (x.getIsForever() == notForever && x.getTotal() > 0))).collect(Collectors.toList());
        log.info("[wxSubscribes]" + wxSubscribes);
        //订阅用户为空则不往下执行
        if (CollectionUtil.isEmpty(wxSubscribes)) {
            return;
        }

        //获取微信api调用token
        String token = this.getToken();
        //批量更新微信发送通知记录表
        List<WxSendNoticeRecord> wxSendNoticeRecordList = new ArrayList<>();
        //遍历订阅用户,逐一推送消息
        for (WxSubscribe subscribeMessage : wxSubscribes) {
            //模板id
            String templateId = subscribeMessage.getTemplateId();
            //构建消息实体
            //Map<String,Object> resultMap = new HashMap<>();
            JSONObject resultMap = new JSONObject();
            //接收用户的openid
            resultMap.put("touser", subscribeMessage.getWeChatOpenid());
            //消息模板id(从小程序后台获取)
            resultMap.put("template_id", templateId);
            //点击消息后打开的小程序页面
            resultMap.put("page", path);
            log.info("[path]" + path);
            resultMap.put("data", outMap);
            //推送消息
            JSONObject wxNoticeResult = this.sendMessage(token, resultMap.toString());
            //数据库中的订阅次数-1
            //如果是永久不需-1  非永久-1
            int isForever = subscribeMessage.getIsForever();
            if (isForever == notForever) {
                subscribeMessage.setTotal(subscribeMessage.getTotal() - 1);
            }
            //拼接发送记录表
            WxSendNoticeRecord wxSendNoticeRecord = new WxSendNoticeRecord();
            wxSendNoticeRecord
                    .setUserId(subscribeMessage.getUserId())
                    .setTemplateId(templateId)
                    .setNoticemsg(data.toString())
                    .setErrcode(wxNoticeResult.getString("errcode"))
                    .setErrmsg(wxNoticeResult.getString("errmsg"));
            wxSendNoticeRecordList.add(wxSendNoticeRecord);
            //wxSubscribeMapper.updateById(subscribeMessage);
        }
        //批量更新剩余发送条数
        wxSubscribeRepository.updateBatchById(wxSubscribes);
        //批量更新发送记录
        wxSendNoticeRecordRepository.saveBatch(wxSendNoticeRecordList);
        log.info("结束===微信通知发送业务处理");

    }
    /**
     * 发送消息
     *
     * @param token
     * @param body
     */
    private JSONObject sendMessage(String token, String body) {
        log.info("开始===微信订阅推送,token:[{}],body:[{}]", token, body);
        String url = this.host + "/cgi-bin/message/subscribe/send?access_token=" + token;
        HttpRequest request = HttpRequest.post(url);
        log.info("[body]" + body);
        if (body != null) {
            request.body(body);
        }
        request.contentType("application/json");
        HttpResponse httpResponse = request.execute();
        httpResponse.charset(StandardCharsets.UTF_8);
        String result = httpResponse.body();
        JSONObject object = JSON.parseObject(result);
        log.info("开始===微信订阅推送,result:[{}]" + result);
        return object;
    }

    /**
     * 获取微信api凭证
     *
     * @return
     */
    private String getToken() {
        log.info("开始===微信获取token");
        String url = this.host + "/cgi-bin/token?grant_type=client_credential&appid=" + this.appid + "&secret=" + this.secret;
        HttpRequest req = HttpRequest.get(url);
        HttpResponse resp = req.execute();
        resp.charset(StandardCharsets.UTF_8);
        String respBody = resp.body();
        log.info("[respBody]" + respBody);
        log.info("结束===微信获取token,result:[{}]", respBody);
        JSONObject object = JSON.parseObject(respBody);
        return object.getString("access_token");
    }

前端也需进行调用接口(以下简单写)

1、首先小程序授权登陆获取 code
2、将 code 传给服务端 获取用户唯一标识 openId
3、通过代码起小程序消息订阅界面、用户点击确定ok,小程序工作结束

本文具体实现参考其他博客见链接

https://www.cnblogs.com/bxmm/archive/2023/04/03/17283908.html文章来源地址https://www.toymoban.com/news/detail-648680.html

到了这里,关于java实现微信小程序订阅和推送订阅信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你实现微信小程序向特定用户推送一次性订阅消息

    目前有一个已 微信认证 的 订阅号 类型公众号,一个 微信认证 小程序,小程序和公众号互相关联。尚不清楚是否必须微信认证或特定类型,因为目前没遇到类型不匹配或相关的问题,发送微信小程序一次性订阅消息的相关限制较少 1、功能介绍 订阅消息推送位置:服务通知

    2024年02月08日
    浏览(38)
  • 微信小程序服务通知(订阅消息)定时推送消息功能

    首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的 API 是我是小程序用到的API。以及服务端用到的 API :我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: (2)、开通之

    2024年02月08日
    浏览(51)
  • 微信小程序云开发定时推送订阅消息

    (1)点击订阅消息 (2)点击公共模板库,然后找到想要选用的模板,点击选用。 (3)在我的模板里面,复制模板id。 如果找不到想要用的模板,可以在公共模板的最后一页,点击下图中圈出来的,去申请自己想要的模板。 (1)云函数部分的代码 config.json 云函数配置文件

    2024年02月09日
    浏览(35)
  • 如何为微信小程序添加订阅消息和推送通知功能

    为微信小程序添加订阅消息和推送通知功能是非常有用的,它可以让用户在重要的事件发生时及时地收到通知。在本文中,我们将详细介绍如何为微信小程序添加这两种功能。 一、订阅消息 订阅消息是一种新的消息类型,用户可以选择是否订阅它们。订阅消息一般用于向用

    2024年02月04日
    浏览(55)
  • Java开发微信小程序订阅消息推送

    使用到开源工具WxJava 这里环境使用到springboot 框架,废话不多说直接上干货。 pom.xml引用 application配置 templateId具体申请在微信公众平台 具体如下   wx配置代码编写 模板代码编写 这里注意模板对应的字段 具体代码  然后和前端一配合就完事了,非常简单

    2024年02月16日
    浏览(37)
  • 使用Java实现微信小程序订阅消息

    首先到微信小程序的官网,选择合适自己的订阅消息模板。 寻找到适合自己的模板之后,记住模板ID,点开详情,记住每个字段id 微信小程序订阅消息官网文档介绍地址:小程序订阅消息 | 微信开放文档 (qq.com) 微信小程序订阅消息接口:发送订阅消息 | 微信开放文档 (qq.com

    2024年02月03日
    浏览(36)
  • uni-app中实现微信小程序/公众号订阅消息推送功能

    👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈 IT 工程师摘星人 欢迎分享 / 收藏 / 赞 / 在看! 开发业务时时常遇到需要向用户发送一些通知,如欠费通知、会员到期通知等等。

    2024年02月02日
    浏览(81)
  • 微信公众号 - Java推送小程序订阅消息给用户_java 通过微信公众号发送订阅通知

    不啰嗦,我们直接开始! 本文使用体验版小程序进行调试。 1、登录微信公众平台 点开下面链接,使用微信扫码 微信公众平台 然后选择一个小程序并登录 2、在小程序后台找到Appid、AppSecret、Token、EncodingAESKey等参数 AppSecret忘记了可以自行重置 往下翻,在消息推送这儿能看到

    2024年04月26日
    浏览(35)
  • 微信小程序消息订阅Java

    编写日期 : 2022-11-04 写这篇文章原因 公司给政府做一个订餐系统,需要在员工在小程序上发起订餐后经过部门领导和书记的审批后,再由食堂确认订餐结果。在订餐审批单在各个节点流转的过程中,需要给每一个节点的审批人发送 微信订阅消息 和 手机短信 ,通知订餐流程所

    2024年02月10日
    浏览(42)
  • 微信小程序实现订阅消息功能

             * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         小程序中的订阅内容在日常中大家都会使用到,一般在支付的时候,会收到支持成功的消息,里面有一些基础信息花费多少以及是使用在什么地方,订阅消息是小程序向用户发送消息的方式

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包