SpringBoot小程序推送信息的项目实践攻略
简介
本项目实践基于SpringBoot和小程序,实现了推送信息到小程序的功能。本文将详细讲解本项目的实现过程。
准备工作
- 开发工具:IDEA、微信开发者工具
- 开发环境:Java 8、Maven 3.6.3、SpringBoot 2.4.0、MySQL 8.0.21
创建SpringBoot项目
在IDEA中创建一个SpringBoot项目,并添加相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>3.0.9</version>
</dependency>
数据库设计
本项目需要持久化数据,所以需要设计数据库和相关表。
在MySQL中创建一个名为wx_push的数据库,并分别创建以下两个表:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`open_id` varchar(50) NOT NULL COMMENT '小程序open_id',
`union_id` varchar(50) DEFAULT NULL COMMENT '小程序union_id',
`nick_name` varchar(50) DEFAULT NULL COMMENT '昵称',
`create_time` datetime NOT NULL COMMENT '创建时间',
`last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
CREATE TABLE `template` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`template_id` varchar(50) NOT NULL COMMENT '模板ID',
`template_name` varchar(50) NOT NULL COMMENT '模板名称',
`need_form_id` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否需要form_id:0不需要,1需要',
`template_content` varchar(500) NOT NULL COMMENT '模板内容',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小程序模板消息表';
配置微信开发者工具
- 登录微信公众平台,进入小程序管理后台,开通开发者模式。
- 在开发者模式下,创建小程序,获取小程序的app_id和app_secret等信息。
实现用户信息管理
- 创建用户实体类User,包含id、openId、unionId、nickName、createTime和lastLoginTime等属性,并实现对应的Getter和Setter方法。
- 创建用户Dao接口和UserDaoImpl实现类,实现对用户信息的存储和查询。
- 创建用户Controller,实现用户信息管理API
实现小程序发送模板消息
1. 获取access_token
在请求小程序API时需要获取access_token,并在接口中加入access_token参数。
public static String getAccessToken(String appId, String appSecret) {
String accessToken = null;
GetMethod get = new GetMethod();
get.setURI(URI.create("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret));
try {
int statusCode = httpClient.executeMethod(get);
if (statusCode == HttpStatus.SC_OK) {
String respBody = new String(get.getResponseBody(), "utf-8");
JSONObject respJson = JSON.parseObject(respBody);
if (respJson.containsKey("access_token")) {
accessToken = respJson.getString("access_token");
} else {
logger.error("获取access_token失败,错误码:{},错误信息:{}", respJson.getString("errcode"), respJson.getString("errmsg"));
}
} else {
logger.error("请求获取access_token接口失败,错误码:{}", statusCode);
}
} catch (IOException e) {
logger.error("请求获取access_token接口失败,异常信息:{}", e.getMessage());
} finally {
get.releaseConnection();
}
return accessToken;
}
2. 获取form_id
在小程序中,发送模板消息需要提供form_id,用来标识该消息发送的场景和时机。
public static String getFormId(String accessToken, String openId) {
String formId = null;
GetMethod get = new GetMethod();
get.setURI(URI.create("https://api.weixin.qq.com/cgi-bin/formid/get?access_token=" + accessToken + "&openid=" + openId));
try {
int statusCode = httpClient.executeMethod(get);
if (statusCode == HttpStatus.SC_OK) {
String respBody = new String(get.getResponseBody(), "utf-8");
JSONObject respJson = JSON.parseObject(respBody);
if (respJson.containsKey("form_id")) {
formId = respJson.getString("form_id");
} else {
logger.info("获取form_id失败,{}", respJson);
}
} else {
logger.error("请求获取form_id接口失败,错误码:{}", statusCode);
}
} catch (IOException e) {
logger.error("请求获取form_id接口失败,异常信息:{}", e.getMessage());
} finally {
get.releaseConnection();
}
return formId;
}
3. 构建模板消息
使用JSON格式构建模板消息内容:
{
"touser": "用户openid",
"template_id": "模板消息ID",
"page": "跳转页面",
"form_id": "form_id",
"data": {
"keyword1": {
"value": "这是消息内容1",
"color": "#173177"
},
"keyword2": {
"value": "这是消息内容2",
"color": "#173177"
},
"keyword3": {
"value": "这是消息内容3",
"color": "#173177"
}
}
}
4. 发送模板消息
使用HTTP POST请求发送模板消息:
public static boolean sendTemplateMessage(String accessToken, String json) {
boolean result = false;
PostMethod post = new PostMethod();
post.setURI(URI.create("https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + accessToken));
post.setRequestEntity(new StringRequestEntity(json, "application/json", "utf-8"));
try {
int statusCode = httpClient.executeMethod(post);
if (statusCode == HttpStatus.SC_OK) {
String respBody = new String(post.getResponseBody(), "utf-8");
JSONObject respJson = JSON.parseObject(respBody);
if (respJson.containsKey("errcode") && respJson.getInteger("errcode") == 0) {
result = true;
} else {
logger.error("发送模板消息失败,错误码:{},错误信息:{}", respJson.getInteger("errcode"), respJson.getString("errmsg"));
}
} else {
logger.error("请求发送模板消息接口失败,错误码:{}", statusCode);
}
} catch (IOException e) {
logger.error("请求发送模板消息接口失败,异常信息:{}", e.getMessage());
} finally {
post.releaseConnection();
}
return result;
}
示例代码
示例1:获取access_token和form_id
public static void main(String[] args) {
// 公众号appid
String appId = "xxx";
// 公众号app secret
String appSecret = "xxx";
// 小程序openid
String openId = "xxx";
// 获取access_token
String accessToken = getAccessToken(appId, appSecret);
// 获取form_id
String formId = getFormId(accessToken, openId);
System.out.println("access_token:" + accessToken);
System.out.println("form_id:" + formId);
}
示例2:发送模板消息
public static void main(String[] args) {
// 公众号appid
String appId = "xxx";
// 公众号app secret
String appSecret = "xxx";
// 小程序openid
String openId = "xxx";
// 模板消息ID
String templateId = "xxx";
// 推送消息内容
String msgContent = "test";
// 获取access_token
String accessToken = getAccessToken(appId, appSecret);
// 获取form_id
String formId = getFormId(accessToken, openId);
// 构建模板消息
JSONObject dataJson = new JSONObject();
dataJson.put("keyword1", new JSONObject().fluentPut("value", msgContent).fluentPut("color", "#173177"));
JSONObject templateJson = new JSONObject();
templateJson.put("touser", openId);
templateJson.put("template_id", templateId);
templateJson.put("page", "pages/home/home");
templateJson.put("form_id", formId);
templateJson.put("data", dataJson);
// 发送模板消息
boolean result = sendTemplateMessage(accessToken, templateJson.toJSONString());
if (result) {
System.out.println("发送模板消息成功!");
} else {
System.out.println("发送模板消息失败!");
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot小程序推送信息的项目实践 - Python技术站