1. 首先需要的是一个能正常运营的微信公众号或者订阅号,根据
微信公众平台
,使用已授权的用户登录,获取对应的appId 和 开发者密码 appSecret
得到appId和AppSecret是为了后续调用微信官方接口必不可少的参数,例如获取微信基础accessToken则需要以上入参;
2. 设置域名以及ip白名单
ip白名单主要是针对获取acces_token,一般设置成自己服务器的ip地址,因为还需要设置自定义域名,可以关联到服务器地址,从而微信接口请求返回可以有对应的请求地址,例如, 我服务器的ip地址是222.13.11.103 ,那么ip白名单就填入这个地址即可;
设置域名主要做回调地址使用,例如:pay.company.cn,需要根据官方指引,将对应的txt文件放到web服务器的根目录下即可
在微信授权的时候需要用到其域名
3. 选择合适的
消息模板
,记住其
模板id
和点击详情后的
内容格式
,因为发送模板消息,需要模板id以及内容格式
2.用户微信授权,获取其openId(重要)
这一步非常重要,只有是跟微信对接,都需要得到用户的openId,才能把模板消息发送到对应的用户中,且每个微信用户都有一个唯一的openId,当获取到openId后,建议保存入库;
可参考微信官方文档:
开发前必读 | 微信开放文档
这里将会指引你如何将用户进行网页授权也是就
1. 引导用户进入授权页面同意授权,获取code
2. 通过 code 换取网页授权access_token
3. 根据通过网页授权access_token和 openid 获取用户基本信息
以下代码,逻辑跟指引一样,先是构建url地址,然后回调自己定义的方法地址,同时微信会自动带出当前用户的code,然后根据code再次调用授权地址,带出对应的openId,而我们的目的就是获取用户的openId
,例如官方示例地址;
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
代码如下;(敏感的appid和密码以及域名地址需要自己替换)
@Controller
public class MyController {
private static final Logger log = LoggerFactory.getLogger(MyController .class);
// appId
private static final String appId = "wxc8xxxxcxxxxxx";
// appIdSecret
private static final String appIdSecret = "60b429xxxxxxxxxxxxxxx";
//1.先查询code
@RequestMapping("/getCode")
public String getCode() {
// 官方地址
String urlFir = "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=";
// 微信申请的域名(提前准备)
String domain = "http://pay.xxx.cn/wxpay";
// 自定义跳转方法
String redirectMethod = "/weixinoauth";
// 地址进行encode转译 (未转译的地址是:http://pay.xxx.cn/wxpay/weixinoauth)
// 转译后的地址是: http%3A%2F%2Fpay.xxx.cn%2Fwxpay%2Fweixinoauth
String encoderUrl = getURLEncoderString(domain + redirectMethod);
log.info(urlFir +appId + "&redirect_uri=" + encoderUrl +"&response_type=code&scope=snsapi_base" + "&state=STATE" + "#wechat_redirect");
return urlFir + appId + "&redirect_uri=" + encoderUrl +"&response_type=code&scope=snsapi_base" + "&state=STATE" + "#wechat_redirect";
* @param str
* @return
public static String getURLEncoderString(String str) {
String result = "";
if (null == str) {
return "";
try {
result = java.net.URLEncoder.encode(str, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return result;
//2.根据code获取openId
@GetMapping("/wxpay/weixinoauth")
public void weixinOauth(@RequestParam String code,@RequestParam String state) throws Exception {
log.info("获取code:{}",code);
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ appId + "&secret=" + appIdSecret + "&code=" + code + "&grant_type=authorization_code";
Map<String, Object> paramMap = null;
String res = HttpUtil.get(url, paramMap);
String openid = JSONObject.parseObject(res).getString("openid");
log.info("根据code查询得到openId:{}",openid);
需要在微信开发工具输入127.0.0.1/getCode,因为授权页面必须要在微信客户端中打开,所以需要下载微信开发工具,微信开发工具地址:开发前必读 | 微信开放文档
下载安装后,需要使用已配置了开发者权限的微信账号登录
然后系统会打印出跳转地址和openId ,该工具会自动跳转/getCode返回的Url并且回调我们的方法 /wxpay/weixinoauth 进行获取用户code,再构建授权url地址j获取openId
打印情况如下(敏感信息已打码):
如果正常到了这里,则说明成功了一半了。
3.获取微信基础accessToken
需要获取微信的基础accessToken用于构建模板消息发送的url入参,且该accessToken有效期只有两小时(下面简称token),因此当调用一下方法一次后,就可以将其放入redis中,设置过期时间(低于两小时);
@GetMapping("/getToken")
public void getAccessToken() throws Exception{
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId +"&secret=" + appIdSecret;
String res = HttpUtil.get(url);
JSONObject jsonObject = JSONObject.parseObject(res);
String accessToken = jsonObject.getString("access_token");
log.info("accessToken:{}", accessToken);
代码会报错,但不影响获取token,日志打印如下; 保存token后续调用发送微信模板消息需要用到;
若出现了无效的ip地址错误,则确认ip白名单是否设置再去
4. 调用微信模板方法发送消息
这一步很简单,通过以上获取的 openId, accessToken 和 前期准备的模板id即可,我们只需要封装模板内容,再调用官方url即可
自定义DTO
@Data
@ToString
public class WeChatTemplateMsg {
private String value;
* 消息颜色
private String color;
public WeChatTemplateMsg(String value) {
this.value = value;
this.color = "#173177";
public WeChatTemplateMsg(String value, String color) {
this.value = value;
this.color = color;
@GetMapping("/sendMessage")
public String sendMessage() {
// 模板参数
Map<String, WeChatTemplateMsg> sendMag = new HashMap<String, WeChatTemplateMsg>();
// openId代表一个唯一微信用户,即微信消息的接收人
String openId = "oNB9p1BpVJEquxxxxxxxxx";
// 公众号的模板id(也有相应的接口可以查询到)
String templateId = "B0YStqTYdjHhY9Da9Sy2NM7xxxxxxxxxxx";
// 微信的基础accessToken
String accessToken = "57_LubK-8NKQc6C7jsLMxvdHaI0ju4x3-HPWEFhh7GKkw9fKbWhuxxoZyX4GaVIn6y4yO7RKfSlCyHdedKJlHUMZkd8457nKm0TOoaVkbzK1HCZ4g4gZdrmAGBylGBOZu9yxxxxxxxxxxxxxxxx";
String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
* 其他模板可以从模板库中自己添加
* 模板ID
* B0YStqTYdjHhY9Da9Sy2NM7HXxxxxxxxxxxxxxx
* 开发者调用模板消息接口时需提供模板ID
* 产品兑付成功提醒
* 金融业 - 证券|基金|理财|信托
* 详细内容
* {{first.DATA}}
* 产品名称:{{keyword1.DATA}}
* 当期兑付本金:{{keyword2.DATA}}
* 当期兑付利息:{{keyword3.DATA}}
* 已兑付期数:{{keyword4.DATA}}
* 兑付日期:{{keyword5.DATA}}
* {{remark.DATA}}
sendMag.put("first", new WeChatTemplateMsg("f123"));
sendMag.put("keyword1", new WeChatTemplateMsg("111"));
sendMag.put("keyword2", new WeChatTemplateMsg("222"));
sendMag.put("keyword3", new WeChatTemplateMsg("333"));
sendMag.put("keyword4", new WeChatTemplateMsg("444"));
sendMag.put("remark", new WeChatTemplateMsg("r555"));
RestTemplate restTemplate = new RestTemplate();
//拼接base参数
Map<String, Object> sendBody = new HashMap<>();
sendBody.put("touser", openId); // openId
sendBody.put("url", "www.baidu.com"); // 点击模板信息跳转地址
sendBody.put("topcolor", "#FF0000"); // 顶色
sendBody.put("data", sendMag); // 模板参数
sendBody.put("template_id", templateId); // 模板Id
ResponseEntity<String> forEntity = restTemplate.postForEntity(url, sendBody, String.class);
log.info("结果是: {}",forEntity.getBody());
JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody());
String messageCode = jsonObject.getString("errcode");
// 2431260672639467520
String msgId = jsonObject.getString("msgid");
System.out.println("messageCode : " + messageCode + ", msgId: " +msgId);
return forEntity.getBody();
可能需要的依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.0</version>
</dependency>
最近抖音上面有个很火的天气推送的公众号,可以给自己爱的人进行定时推送。结合亲生经历给大家讲述一下操作流程。很简单,有一点点编程基础就可以。给女朋友做的微信公众号消息每日自动推送天气及纪念日通知教程,该教程为github每日自动线上运行版本。本人亲测妹子很喜欢~女孩子都喜欢这种用心做的东西!
1.最新版本 成品 +源码 +消息模板 (需要自己申请 天行 和风 API) https://wwi.lanzoup.com/iy7IV0a6ikmh
2.简化版本 成品 +源码 +消息模板 https://wwi.lanzoup.com/ikXQb0a6ippa
3.单独星座版本 成品 https://wwi.lanzoup.com/iBSZy0a6ixxg
4.星座+天气版本 成品+消息模版 https://wwi.lanzoup.com/iy7IV0a6ikmh
5.php版本 https://wwi.lanzoup.com/i3zkY0a6j30j
IP白名单:获取access_token时,需要IP白名单才可以获取
OpenID:微信用户在当前公众号的唯一标识
UnionID:微信用户在当前开放平台账号的所有公众号和应用情景下的唯一标识
服务器配置:
(1)地址:配置以后,用户对公众号的操作(关注、...
接口调用请求说明
http请求方式: POST
请求地址:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
POST数据说明
POST数据示例如下:
(1)openId:微信用户在当前公众号的唯一标识,消息接收方
(2)template_id:
(3)url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程
数据层 DAO+JDBC
主要功能说明: 管理员角色包含以下功能:管理员登录,学生管理,教师管理,课程管理等功能。
教师角色包含以下功能:登录界面,查看课程,建立课程计划,管理教学课程,成绩查询结课等功能。
学生角色包含以下功能:登录界面,选课,确认选课,查看选课结果,退选界面,查看已修课程,管理个人信息等功能。
linux
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
基于java的开发源码-网页表格组件 GWT Advanced Table.zip
1. 注册微信公众号并获取开发者账号和密码;
2. 在微信公众平台上创建应用并获取应用的 AppID 和 AppSecret;
3. 使用 Java 开发工具包(如 weixin-java-tools)进行开发,实现消息推送功能;
4. 将开发好的代码部署到服务器上,并配置服务器地址和 Token;
5. 在微信公众平台上配置服务器地址和 Token,完成消息推送的设置。