SpringBoot小程序推送信息的项目实践

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='小程序模板消息表';

配置微信开发者工具

  1. 登录微信公众平台,进入小程序管理后台,开通开发者模式。
  2. 在开发者模式下,创建小程序,获取小程序的app_id和app_secret等信息。

实现用户信息管理

  1. 创建用户实体类User,包含id、openId、unionId、nickName、createTime和lastLoginTime等属性,并实现对应的Getter和Setter方法。
  2. 创建用户Dao接口和UserDaoImpl实现类,实现对用户信息的存储和查询。
  3. 创建用户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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java 实战项目锤炼之IT设备固定资产管理系统的实现流程

    Java 实战项目锤炼之IT设备固定资产管理系统的实现流程 在这个项目中,我们将用Java语言实现一个IT设备固定资产管理系统,该系统将允许用户管理公司的固定资产,包括计算机、服务器、打印机等。具体的实现流程如下: 1. 确定需求和功能 在开发任何一个软件系统之前,我们必须针对用户的需求和要求进行调研和分析,明确系统所需要实现的功能,以便我们能够有针对性的进…

    Java 2023年5月23日
    00
  • JSP response对象实现文件下载的两种方式

    我会为您详细讲解“JSP response对象实现文件下载的两种方式”的完整攻略。 下载文件是Web开发中非常常见的功能之一。在JSP中,我们可以使用response对象来实现文件下载的功能。具体来说,实现文件下载可以采用两种方式: 1. 使用response的OutputStream方式 使用response的OutputStream方式的基本流程如下: …

    Java 2023年6月15日
    00
  • 什么是类加载的双亲委派模型?

    关于类加载的双亲委派模型,我们可以这样来详细讲解: 一、什么是类加载的双亲委派模型? 类加载器在加载类的过程中,会先将请求交给父类加载器去完成类加载。如果父类加载器无法完成类加载,才由自己来实现类的加载。这种按照一定顺序依次向上委托的模型,就是类加载的双亲委派模型。 在这个模型中,类加载器之间是存在父子关系的。一个类加载器在加载某个类的时候,如果它的父类加载…

    Java 2023年5月10日
    00
  • Bootstrap的fileinput插件实现多文件上传的方法

    下面我来介绍一下Bootstrap的fileinput插件实现多文件上传的方法。 1. 插件介绍 Bootstrap的fileinput插件是一个强大的文件上传插件,支持多文件上传、图片预览等功能,而且使用起来也非常方便,只需要简单的配置和调用就可以了。 2. 安装插件 你可以通过多种方法来安装Bootstrap的fileinput插件,比如使用CDN、下载…

    Java 2023年6月15日
    00
  • 浅谈maven 多环境打包发布的两种方式

    下面是针对 “浅谈maven 多环境打包发布的两种方式” 的详细攻略: 1. 背景介绍 在实际开发中,我们经常需要部署和发布到不同的环境,比如开发环境、测试环境、生产环境等。而不同环境之间可能存在的配置文件、参数、数据库等差异,就需要使用不同的打包方式进行部署。本文主要介绍使用 Maven 进行多环境打包和发布的两种方式。 2. 方式一:使用 Maven P…

    Java 2023年5月20日
    00
  • IntelliJ IDEA 创建 Java 项目及创建 Java 文件并运行的详细步骤

    下面是关于“IntelliJ IDEA 创建 Java 项目及创建 Java 文件并运行的详细步骤”的完整攻略: 步骤一:创建新的Java项目 打开 IntelliJ IDEA,进入欢迎界面,点击 “Create New Project”。 确认左侧栏选择 “Java”,并输入项目的名称,可以任意取。然后点击 “Next”。 在弹出的窗口中选择 “Proje…

    Java 2023年5月20日
    00
  • Maven打包并生成运行脚本的示例代码

    这里是Maven打包并生成运行脚本的完整攻略,包含两个示例代码。 1. Maven打包过程 在使用Maven进行打包之前,需要在项目的pom.xml文件中添加以下插件: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupI…

    Java 2023年5月20日
    00
  • Springboot实现多数据源切换详情

    下面我将为您详细介绍Spring Boot实现多数据源切换的完整攻略,包括以下内容: 配置数据源 配置JdbcTemplate 配置JPA 配置事务管理器 实现多数据源切换 1. 配置数据源 Spring Boot默认采用HikariCP作为连接池,我们需要分别配置多个数据源并注入到Spring中。我们可以在application.properties文件中…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部