一,注册公众号

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实现 微信公众号推送消息 ,cv 就可运行!!!的更多相关文章

  1. $Django 支付宝支付,微信服务号推送消息 (测试需要把应用程序部署到服务器上)

    一 支付宝支付 大概 支付宝支付 正式环境:需要用营业执照去申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.ht ...

  2. 笔记:《机器学习训练秘籍》——吴恩达deeplearningai微信公众号推送文章

    说明 该文为笔者在微信公众号:吴恩达deeplearningai 所推送<机器学习训练秘籍>系列文章的学习笔记,公众号二维码如下,1到15课课程链接点这里 该系列文章主要是吴恩达先生在机器 ...

  3. php三方网站使用微信公众号推送文章

    //获取accesstoken 的方法public function index(){ $appId = 'wxd0e50fe967dccccc'; $appSecret = 'd7f6be12ce4 ...

  4. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  5. Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装

    在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...

  6. Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token

    获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...

  7. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  8. Java开发微信公众号(一)---初识微信公众号以及环境搭建

    ps:1.开发语言使用Java springMvc+Mybaits+spring maven实现 2.使用微信接口测试账号进行本地测试 https://mp.weixin.qq.com/debug/c ...

  9. php之微信公众号发送模板消息

    讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0). 先看一下效果,如图: 就是类似于这样的,下面讲一下实现过程: 第一步:微信公众号申请模板消息权限: 立即申请: ...

  10. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

随机推荐

  1. 【C++ Primer】2.1 基本内置类型

    1. 基本内置类型 基本算数类型: 类型 含义 最小尺寸 bool 布尔类型 8bits char 字符 8bits wchar_t 宽字符 16bits char16_t Unicode字符 16b ...

  2. 如何通过AWS的AmazonSageMaker进行机器学习

    目录 <如何通过 AWS 的 Amazon SageMaker 进行机器学习> 一.引言 随着人工智能和机器学习的发展,越来越多的企业和机构开始使用这些技术来进行各种应用场景的处理和分析. ...

  3. 【笔试实战】LeetCode题单刷题-编程基础 0 到 1【一】

    1768. 交替合并字符串 题目链接 1768. 交替合并字符串 题目描述 给你两个字符串 word1 和 word2 .请你从 word1 开始,通过交替添加字母来合并字符串.如果一个字符串比另一个 ...

  4. Git存储

    Git还提供了一个贮藏的功能.如果你某个分支开发过程中,这个分支的内容是要在本月月底上线的,但是生产上已经出现了一个重大bug,需要你立马去修复.你在分支开发的内容已经开发一部分了,工作区有内容是不能 ...

  5. Visual Studio C# 多环境配置 Web.config

    目录 添加解决方案配置 添加配置转换 添加应对的配置 Visual Studio 为多环境配置 Web.config 不同的环境,存在不同的配置,如:数据库连接字符串,通过多配置,方便做环境切换,配置 ...

  6. 数据库连接池之c3p0-0.9.1.2,线上偶发APPARENT DEADLOCK,如何解?

    前言 本篇其实是承接前面两篇的,都是讲定位线上的c3p0数据库连接池,发生连接泄露的问题. 第二篇讲到,可以配置两个参数,来找出是哪里的代码借了连接后没有归还.但是,在我这边的情况是,对于没有归还的连 ...

  7. Java通用返回工具类Result

    通用返回类Result 前言:Java项目搭建时,常常需要去封装一个通用型的Result工具类,下面就是我自己封装的常用的返回类,可以直接使用.(有部分Swagger注解,使用时可忽略) 第一步.创建 ...

  8. GitLab 无仓库 中了勒索病毒

    坑爹的记录一下,并没有解决 Gitlab 昨天(2021-11-29)打开之后看不到项目了,下面这个吊样子 最后发现中病毒了,一堆的这个吊毛文件,复制一个打开看了一下 你别说这个黑客网页写的还不错,这 ...

  9. .Net Core控制台程序读取Json配置文件

    1 添加依赖(可以直接通过nuget包安装 Microsoft.Extensions.Configuration.Json 这个会依赖其他两个会自动安装依赖的) Microsoft.Extension ...

  10. Postgresql: 常用配置

    允许远程链接postgresql 要允许 PostgreSQL 数据库允许远程连接,需要进行以下配置步骤: 打开 PostgreSQL 的主配置文件 postgresql.conf.通常,该文件位于以 ...