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注解实现动态数据源切换的实例代码”的完整攻略。 步骤一:创建动态数据源切换注解 我们需要创建一个自定义的注解来实现动态数据源切换。注解的结构如下: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface DS { Stri…

    Java 2023年5月20日
    00
  • SpringBoot注册Servlet的三种方法详解

    Spring Boot注册Servlet的三种方法详解 在Spring Boot应用程序中,注册Servlet是一个非常常见的需求。本文将详细介绍Spring Boot注册Servlet的三种方法,包括使用注解、使用ServletRegistrationBean和使用WebServerFactoryCustomizer。 使用注解 使用注解是一种常见的Spr…

    Java 2023年5月15日
    00
  • java回溯算法解数独问题

    这是一个非常典型的回溯算法问题,下面我将为大家讲解如何使用Java实现数独问题的解法。 问题描述 给定一个数独棋盘,其中已填数字的格子用数字表示,空白格用 0 表示,要求使用一个算法将数独棋盘填完整,完成数独游戏。 这个问题是一个典型的回溯算法问题,使用回溯算法可以解决。 解题思路 回溯算法的主要思路就是通过枚举的方式,不断求解所有可能的解。 针对数独问题,…

    Java 2023年5月19日
    00
  • java查找字符串中的包含子字符串的个数实现代码

    下面是“Java查找字符串中的包含子字符串的个数实现代码”的完整攻略。 问题描述 我们需要写一个Java程序,用于在一个字符串中查找指定的子字符串,并返回该子字符串在源字符串中出现的次数。 解决方案 我们可以使用Java内置的字符串函数或正则表达式来实现这个功能,下面是两种不同的方法: 方法一:使用String函数 我们可以使用String类中提供的inde…

    Java 2023年5月27日
    00
  • 详解Mybatis动态sql

    下面是详解Mybatis动态sql的攻略,包括动态sql的基本概念、应用场景和常用语法,最后会给出两个示例。 动态sql的基本概念 动态sql是一种根据不同条件生成不同sql语句的技术,可以使我们在不同情况下更加灵活地进行数据库操作。在Mybatis中,动态sql通过使用标签来实现。 Mybatis中常用的动态sql标签有: <if>:表示如果满…

    Java 2023年5月20日
    00
  • Javaweb工程运行报错HTTP Status 404解决办法

    针对Javaweb工程运行报错HTTP Status 404的情况,可以按照以下步骤来解决: 1. 确认Servlet容器是否正常启动 第一步是确认Servlet容器是否正常启动。如果Servlet容器未正常启动,那么网站无法访问,就会出现404错误。在确认Servlet容器是否正常启动时,可以参照以下示例代码: $netstat -ano | findst…

    Java 2023年6月15日
    00
  • Java如何使用正则表达式查找指定字符串

    当我们需要在Java程序中查找某个特定的字符串时,可以使用正则表达式进行匹配。下面是Java如何使用正则表达式查找指定字符串的完整攻略,包含以下步骤: 步骤一:导入java.util.regex包 在使用正则表达式之前,我们需要先导入Java的正则表达式包java.util.regex,以便在代码中使用正则表达式匹配规则。 import java.util.…

    Java 2023年5月27日
    00
  • JAVA中正则表达式匹配,替换,查找,切割的方法

    在Java中,可以使用正则表达式进行字符串匹配,替换,查找和切割等操作。使用正则表达式需要使用Java.util.regex包中的类。 正则表达式基本语法 正则表达式是一种特殊的字符串,可以用于描述匹配一个字符串的规则。正则表达式的基本语法如下: 1. 字符串 表示要匹配的字符串,例如 abc。 2. 字符集 表示可以匹配的字符集合,例如 [abc] 表示可…

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