springboot 实现Java向微信小程序订阅消息推送至“服务通知”

1544年前SpringBoot2009

最近做的OA系统小程序需要向用户推送待办事项及通知类的提醒消息。

  1. 微信公众平台开通订阅消息并创建模板。

    image.png

  2. 设置消息推送配置.(在开发管理--开发设置。这里的服务器地址使用的第三方微擎)

    image.png

    Java端步骤

1.获取openid。如何获取openid?

2.获取access_token

access_token就是小程序官方给我们提供的一个凭证,如果要调用官方的接口,就必须先获取凭证,所以我们先来谈谈怎么获取access_token.

官方文档

Java代码部分

1. java后台创建小程序 VO类,用于封装传送的参数。

@Data
public class WxMssVo {
private String touser;//用户openid
private String template_id;//模版id
private Map<String, TemplateData> data;//推送文字
}
/*
* 模板数据
* */
import lombok.Data;
@Data
public class TemplateData {
private String value;//,,依次排下去
// private String thing6;//消息类型
// private String thing3;// 消息内容
// private String time2;//发送时间
}

2.发送消息到微信

java后台创建发送消息推送类

package com.sdta.business.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.sdta.business.domain.TemplateData;
import com.sdta.business.domain.WxMssVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.core.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
/**
 * Created by zml on 2020/12/6
 * 微信小程序推送服务,
 * 包含获取access_token的服务
 */
@Service
@Slf4j
public class WxPushService {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    //用来请求微信的get和post
    @Autowired
    private RestTemplate restTemplate;
    /*
     * 微信小程序推送单个用户
     * */
    public String pushOneUser(String openid,String[] keywords) {
 //   public String pushOneUser(String openid, String formid,String[] keywords) {


        //获取access_token
        String access_token = getAccess_token();
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + access_token;

        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openid);//用户openid
        wxMssVo.setTemplate_id("Ouyrfy3LRJo5CGUfRtuxyvUwFehJIV_quoXUy4ch5I0");//模版id
//        wxMssVo.setForm_id(formid);//formid


        Map<String, TemplateData> m = new HashMap<>(5);

        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        TemplateData data= new TemplateData();

        //封装数据
        if(keywords.length>0){
            data.setValue(keywords[0]);
            m.put("thing6",data);

            data= new TemplateData();
            data.setValue(keywords[1]);
            m.put("thing3",data);

            data= new TemplateData();
            data.setValue(keywords[2]);
            m.put("time2",data);
            wxMssVo.setData(m);
        }else{
            log.error("keywords长度为空");
            return null;
        }

        if(restTemplate==null){
            restTemplate = new RestTemplate();
        }

        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        log.error("小程序推送结果={}", responseEntity.getBody());
        return responseEntity.getBody();
    }
    //微信小程序订阅消息推送
    public void push(WxMssVo wxMssVO) {
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccess_token();
//        String json = JsonUtils.objectToJson(wxMssVO);
//        String vxResult = HttpClientUtil.doPostJson(url, json);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVO, String.class);
        log.error("小程序推送结果={}", responseEntity.getBody());

//        log.info("返回的内容:" + vxResult);
    }
    /*
     * 获取access_token
     * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
     * */
    public String getAccess_token() {

        //微擎
        if(restTemplate==null){
            restTemplate = new RestTemplate();
        }
        String appid= "wx87865***c2441b1c";
        String appsecret = "7ab8d23ecc******eee3070ecf71afcd";
        //获取access_token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                "&appid=" + appid + "&secret=" + appsecret;
        String json = restTemplate.getForObject(url, String.class);
        JSONObject myJson = JSONObject.parseObject(json);
        System.out.println("access_token"+myJson.get("access_token").toString());
        return myJson.get("access_token").toString();

    }

    public static void main(String[] args) {
//            System.out.println(new WxPushService().getAccess_token());
            WxPushService weChatUtil = new WxPushService();
            String values[] ={"通知","明天集体会议务必到场","2019-5-8 10:10:10"};
            weChatUtil.pushOneUser("o2l-i4koMWPhTioMVriKX2yhdVt0",values);
    }

}
获取到用户的openid后,即可在后台main方法测试推送消息。
小程序推送结果={"errcode":43101,"errmsg":"user refuse to accept the msg rid: 5fd06c77-3ade7c74-1e01d7bb"}

说明没有得到用户的订阅。需要小程序端用户点击允许订阅。

小程序部分

1. 调起客户端小程序订阅消息界面,需要用户允许后才可发送向该用户消息官方文档

wx.requestSubscribeMessage({
tmplIds: [''],//模板id
success (res) { }})





相关文章

com.highgo.jdbc.util.PSQLException: 错误: 操作符不是唯一的: integer = character varying(mybatis postgreSql)

com.highgo.jdbc.util.PSQLException: 错误: 操作符不是唯一的: integer = character varying(mybatis postgreSql)

postgresql抛出的异常,是因为数据库类型是int类型,而java传参String造成。有2种解决方案,建议第二种方案更方便简洁解决方案一:代码public int dele...

阿里云服务器 部署项目访问163邮箱服务 超时

阿里云服务器 部署项目访问163邮箱服务 超时

原来的配置如下(启动服务报错,超时):# 配置 SMTP 服务器地址 spring.mail.host=smtp.163.com # 发送邮件服务协议 s...

Linux学习基础篇(一)-Linux系统中各目录的作用

Linux学习基础篇(一)-Linux系统中各目录的作用

目录名目录作用         /bin/存放系统命令的目录, 普通用户和超级用户都可以执行。 不过放在/bin下的命令在单用户模式下也可以执行 &nbs...

java实现合并多个word文档 且可换页 实例代码(基于docx4j)

org.docx4j/docx4j/ Maven依赖写法Maven下载jar包<dependency>    <groupId>org.docx4...

如何查询端口占用情况 并禁止占用

如何查询端口占用情况 并禁止占用

开始---->运行---->cmd,或者是window+R组合键,调出命令窗口输入命令:netstat -ano可看到是:pid为 2160 的程序占用了80端口;启动任务管理器:ctrl...

linux系统 命令移动文件至另一个目录

linux系统 命令移动文件至另一个目录

使用mv 命令,回车是否覆盖,输入Y,可将原文件覆盖[root@host4702 cuadmin]# mv application.yml /data/AAS-V9.0/domains/mydomai...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。