java实现微信公众号消息推送的方法详解

 更新时间:2023年10月07日 14:35:26   作者:古渡蓝按  
这篇文章主要为大家详细介绍了如何利用java实现微信公众号消息推送的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、注册公众号

1,官网地址:申请测试公众号

地址: 微信公众平台 (qq.com)

文档地址:微信开放文档 (qq.com)

2,注册后可以查看自己的appId 和 appsecret

3,创建模板

请注意:

1、测试模板的模板ID仅用于测试,不能用来给正式帐号发送模板消息

2、为方便测试,测试模板可任意指定内容,但实际上正式帐号的模板消息,只能从模板库中获得

3、需为正式帐号申请新增符合要求的模板,需使用正式号登录公众平台,按指引申请

4、模板内容可设置参数(模板标题不可),供接口调用时使用,参数需以{{开头,以.DATA}}结尾

我创建的模板

早安!:{{name.DATA}} 
天气:{{weather.DATA}} 
距离破壳日:{{birthday.DATA}}

二、代码部分

​ 发送消息和推送消息都是需要 token 的,所以第一步就可以获取token,再拿获取的token 进行发送消息,每天获取token的是有次数限制的(2000次)

添加依赖

使用微信公众号需要的依赖

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.3.0</version>
        </dependency>

我这里把 也添上,等下可以在swagger测试

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
<!--        knife4j 依赖-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.7</version>
        </dependency>

具体代码

controller 层

这里就两个部分,getToken() 方法 是获取token, pushMessage() 是推送消息(这里代码中没有模板id,需要修改成上面自己创建的模板id)

@Api(tags = "各项测试")
@RestController
@RequestMapping("/loginInfo")
public class SendWeChatMessageController {
//    /*
//     * 功能: 公众号:appid,这里也可以配置到yaml 文件里面
//     */
//
//    @Value("${wx.appId}")
//    private String appId;
//
//    /*
//     * 功能: 公众号:appsecret
//     */
//
//    @Value("${wx.appsecret}")
//    private String appsecret;
    private final Logger logger = LoggerFactory.getLogger(SendWeChatMessageController.class);
    @ApiOperation("获取token")
    @GetMapping("/getToken")
    public Object getToken(@PathParam("grantType") String grantType,@PathParam("appId") String appId,@PathParam("secret") String secret) throws Exception {
        String tokenUrl = WeChatUrlEnum.TOKEN.getUrl();
        String params = "grant_type=" + grantType + "&appid=" + appId + "&secret=" + secret;
        logger.info("请求地址为:" + tokenUrl + params);
        String tokenResponse = HttpUtils.sendGet(tokenUrl, params);
        JSON parse = JSONUtil.parseObj(tokenResponse);
        System.out.println(parse);
        return parse;
    }
    @ApiOperation("发送消息")
    @PostMapping("/testPushMessage")
    public String pushMessage(@RequestBody PushMessageToUserVo pushMessageToUserVo) {
        // 组装要发送的数据
        JSONObject body = new JSONObject();
        // 要推给谁
        body.put("touser", pushMessageToUserVo.getTouser());
        // 模板ID
        body.put("template_id", "这里填写自己的模板id");
        String accessToken = pushMessageToUserVo.getAccessToken();
        // 创建消息和内容,这里可以自己定义,对应好模板就行
        JSONObject data = new JSONObject();
        data.put("name", new JSONObject().put("value", "做一个身体和心灵都勇敢的人,趁着身体未老,心灵还透明。晚安!"));
        data.put("weather", new JSONObject().put("value", "阴天  19°c"));
        data.put("birthday", new JSONObject().put("value", "53   天"));
        body.put("data", data);
        logger.info("body---->{}", body.toString());
        String post = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken, body.toString());
        logger.info("通知到用户--->{}", post);
        return body.toString();
    }
}

其他代码

config

这里使用 knife4j,等下好测试接口

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
    @Bean(value = "defaultApi2")
    public Docket defaultApi2() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        //.title("swagger-bootstrap-ui-demo RESTful APIs")
                        .description("# swagger-bootstrap-ui-demo RESTful APIs")
                        .termsOfServiceUrl("http://www.xx.com/")
                        .contact("xx@qq.com")
                        .version("1.0")
                        .build())
                //分组名称
                .groupName("2.X版本")
                .select()
                //这里指定Controller扫描包路径,自行记得修改!!!!
                .apis(RequestHandlerSelectors.basePackage("com.example.springbootwechat.controller"))
                .paths(PathSelectors.any())
                .build();
    }
}

entity

这个是推送消息vo,给那个用户推送消息,并带上token

@Data
@ApiModel(description = "用户推送vo")
public class PushMessageToUserVo {
    @ApiModelProperty(value = "用户微信关注号", required = true)
    private String touser;
    @ApiModelProperty(value = "用户Token", required = true)
    private String accessToken;
}

enum

我这里是把地址都变成枚举,因为后面地址会比较多,便于维护,当然也可以配置在yaml ,或者定义在使用处。

public enum WeChatUrlEnum {
    /**
     * 获取token
     */
    TOKEN("获取微信 token的地址","https://api.weixin.qq.com/cgi-bin/token");
    private String info;
    private String url;
    WeChatUrlEnum(String info,String url) {
        this.info =info;
        this.url = url;
    }
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}

utils

工具类:发送http get,post 请求

public class HttpUtils {
   public static String sendGet(String url, String query) throws Exception {
       String fullUrl = url + "?" + query;
       HttpURLConnection connection = (HttpURLConnection) new URL(fullUrl).openConnection();
       connection.setRequestMethod("GET");
       connection.setRequestProperty("Accept", "application/json");
       if (connection.getResponseCode()!= 200) {
           throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode());
       }
       BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));
       StringBuilder sb = new StringBuilder();
       String output;
       while ((output = br.readLine())!= null) {
           sb.append(output);
       }
       connection.disconnect();
       return sb.toString();
   }
   public static String sendPost(String url, String data) throws Exception {
       URL fullUrl = new URL(url);
       HttpURLConnection connection = (HttpURLConnection) fullUrl.openConnection();
       connection.setRequestMethod("POST");
       connection.setRequestProperty("Content-Type", "application/json");
       connection.setRequestProperty("Accept", "application/json");
       connection.setDoOutput(true);
       DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
       wr.writeBytes(data);
       wr.flush();
       wr.close();
       if (connection.getResponseCode()!= 200) {
           throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode());
       }
       BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));
       StringBuilder sb = new StringBuilder();
       String output;
       while ((output = br.readLine())!= null) {
           sb.append(output);
       }
       connection.disconnect();
       return sb.toString();
   }
}

三、测试

接口swagger地址:http://127.0.0.1:1955/doc.html 自己注意端口

1,获取token

2,发送消息

手机端:接收到的消息

到此这篇关于java实现微信公众号消息推送的方法详解的文章就介绍到这了,更多相关java微信公众号推送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot项目中使用@Scheduled读取动态参数

    SpringBoot项目中使用@Scheduled读取动态参数

    这篇文章主要介绍了SpringBoot项目中使用@Scheduled读取动态参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 解决spring-integration-mqtt频繁报Lost connection错误问题

    解决spring-integration-mqtt频繁报Lost connection错误问题

    这篇文章主要介绍了解决spring-integration-mqtt频繁报Lost connection错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java中线程上下文类加载器超详细讲解使用

    Java中线程上下文类加载器超详细讲解使用

    这篇文章主要介绍了Java中线程上下文类加载器,类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例的代码模块。本文主要和大家聊聊JVM类加载器ClassLoader的使用,需要的可以了解一下
    2022-12-12
  • GraphQL入门总体创建教程

    GraphQL入门总体创建教程

    这篇文章主要为大家介绍了GraphQL入门总体创建教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Springboot引入多个yml方法(多种方案)

    Springboot引入多个yml方法(多种方案)

    SpringBoot默认加载的是application.yml文件,所以想要引入其他配置的yml文件,就要在application.yml中激活该文件这篇文章主要介绍了Springboot引入多个yml方法,需要的朋友可以参考下
    2019-10-10
  • 使用 Spring AI + Ollama 构建生成式 AI 应用的方法

    使用 Spring AI + Ollama 构建生成式 AI 应用的方法

    通过集成SpringBoot和Ollama,本文详细介绍了如何构建生成式AI应用,首先,介绍了AI大模型服务的两种实现方式,选择使用ollama进行部署,随后,通过SpringBoot+SpringAI来实现应用构建,本文为开发者提供了一个实用的指南,帮助他们快速入门生成式AI应用的开发
    2024-11-11
  • Springboot 集成spring cache缓存的解决方案

    Springboot 集成spring cache缓存的解决方案

    这篇文章主要介绍了Springboot 集成spring cache缓存,使用缓存最关键的一点就是保证缓存与数据库的数据一致性,本文给大家介绍最常用的缓存操作模式,对Springboot 集成spring cache缓存操作流程感兴趣的朋友一起看看吧
    2022-06-06
  • java向上转型发生的时机知识点详解

    java向上转型发生的时机知识点详解

    在本篇文章里小编给大家整理分享的是关于java向上转型发生的时机知识点内容,有兴趣的读者们可以参考下。
    2021-05-05
  • 提交gRPC-spring-boot-starter项目bug修复的pr说明

    提交gRPC-spring-boot-starter项目bug修复的pr说明

    这篇文章主要介绍了这篇文章主要为大家介绍了gRPC-spring-boot-starter项目提交bug修复的pr的原因说明,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • Java线程死锁代码详解

    Java线程死锁代码详解

    本篇文章主要介绍了Java线程死锁代码详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-11-11

最新评论