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利用完全二叉树创建大根堆和小根堆

    下面是详细讲解“Java利用完全二叉树创建大根堆和小根堆”的完整攻略。 创建大根堆和小根堆的概念 在创建堆的时候,需要将输入的数据元素想象成一颗完全二叉树。然后将这个完全二叉树转换为堆,转换之后的堆即为大根堆或小根堆。 大根堆:每个节点的值都大于或等于它的子节点值。 小根堆:每个节点的值都小于或等于它的子节点值。 创建大根堆和小根堆的步骤 将输入的元素插入到…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“TimeoutException”的原因与解决方法

    “TimeoutException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: 网络连接超时:如果网络连接超时,则可能会出现此异常。例如,可能会尝试连接到不可用的主机或端口。 线程等待超时:如果线程等待超时,则可能会出现此异常。例如,可能会等待某个资源的可用性,但超时时间已过。 以下是两个实例: 例1 如果网络连接超时,…

    Java 2023年5月5日
    00
  • springboot:接收date类型的参数方式

    下面是关于 Spring Boot 接收 Date 类型参数的完整攻略。 1. 前置知识 在开始之前,我们需要先了解一下 Java 中的日期类型。在 Java 中,有以下几种日期类型: java.util.Date:表示日期和时间,精确到毫秒级别的(可用于处理某些业务)。 java.util.Calendar:也是用于表示日期时间的类,提供了更加丰富的方法以…

    Java 2023年5月20日
    00
  • 什么是EVB?EVB技术的简单介绍

    下面是关于EVB的详细讲解。 什么是EVB? EVB全称为Evaluation Board(评估板),是一种硬件开发工具,用于快速评估和开发不同种类的芯片、模块、传感器等硬件设备。它通常包括主板、外设接口、调试器等硬件和相关的软件开发工具。EVB与PCB(Printed Circuit Board,印刷电路板)相比,更注重快速原型和快速评估,能够快速搭建出一…

    Java 2023年6月15日
    00
  • Java实战之电影在线观看系统的实现

    Java实战之电影在线观看系统的实现 系统概述 本系统是一个电影在线观看平台,用户可以在线观看已经上传到该平台中的电影。系统分为前台和后台两个部分,前台是用户用于观看电影的界面,后台用于管理电影的上传和管理。 系统框架搭建 本系统采用MVC框架,使用Spring Boot进行快速搭建。在MVC框架中,Model用于数据存储和处理,View用于数据的展示和呈现…

    Java 2023年5月19日
    00
  • Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能(时间支持在配置文件中配置)

    Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能 背景 在开发web应用时,我们往往需要使用缓存来提高应用的性能和响应速度。Spring Boot提供了对缓存的支持,可以与多种缓存器集成。其中,Redis是非常流行的缓存器。 在使用Redis缓存时,我们经常会遇到以下问题: 设置缓存的有效时间; 自动刷新缓存。 下面将详细介绍如何在…

    Java 2023年6月3日
    00
  • java实现Xml与json之间的相互转换操作示例

    Java实现XML与JSON之间的相互转换操作示例攻略 什么是XML和JSON? XML是一种标记语言,可以用来存储数据,比如RSS或Atom的新闻源、在线计算机配置文件等等。XML文件结构清晰、可读性强,被广泛应用于Web Services、SOAP和其他Web API的数据传输格式。 JSON是一种轻量级的数据交换格式,它具有自我描述性、可读性高、易于理…

    Java 2023年5月26日
    00
  • 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    如果在启动Tomcat时出现“错误: 代理抛出异常: java.rmi.server.ExportException: Port already in use: 1099”的错误,意味着端口1099已经被占用了。一般是因为其他应用程序或Tomcat已经在使用该端口,导致Tomcat无法使用。 解决该问题的方法有两种,一种是找到占用了端口1099的应用程序并关…

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