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("发送模板消息失败!");
    }
}
阅读剩余 82%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot小程序推送信息的项目实践 - Python技术站

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

相关文章

  • 在IDEA中创建跑得起来的Springboot项目

    让我来详细讲解如何在IntelliJ IDEA中创建跑得起来的Spring Boot项目。 1. 准备工作 在开始创建Spring Boot项目之前,我们需要确保电脑上已经安装好以下两个软件:- JDK 1.8或更高版本- IntelliJ IDEA 2. 创建Spring Boot项目 现在我们来开始创建Spring Boot项目。 2.1 打开Intel…

    Java 2023年5月19日
    00
  • javasciprt下jquery函数$.post执行无响应的解决方法

    当我们在JavaScript下使用jQuery函数$.post()来发送异步请求时,有时会遇到无响应的情况。这可能是由于许多原因导致的,例如网络问题、服务器问题等。下面是解决这个问题的一些步骤: 步骤1:确保使用正确的URL 首先,确保您在$.post()函数中使用了正确的URL地址。URL地址应该是您想要发送请求的地址。如果您的URL地址不正确,服务器就会…

    Java 2023年5月26日
    00
  • Java生成日期时间存入Mysql数据库的实现方法

    非常感谢您对Java生成日期时间存入Mysql数据库的实现方法的关注。 下面是具体实现步骤和示例代码: 1. 准备工作 确保已经安装好了Java和Mysql,并且已经存在一个名为“test”的数据库。 导入mysql-connector-java-5.1.49-bin.jar包(版本可根据实际情况进行更换)。 2. 创建数据库表 创建一个名为“user”的表…

    Java 2023年5月20日
    00
  • Sentinel实现动态配置的集群流控的方法

    Sentinel是一个分布式系统的流量控制组件,其通过提供多种限流、降级、熔断等机制来保护系统的稳定性。Sentinel可以配合Spring Cloud、Dubbo等框架使用,而且其提供了动态配置的支持,通过动态更新规则实现流量控制策略的动态调整。本文将详细讲解Sentinel实现动态配置的集群流控的方法,具体过程如下: 步骤1:搭建Sentinel集群 首…

    Java 2023年6月15日
    00
  • java微信公众号开发第一步 公众号接入和access_token管理

    下面我将详细讲解Java微信公众号开发中,公众号接入和access_token管理的完整攻略。 公众号接入 公众号接入是指将你的微信公众号与微信平台进行绑定,以便在微信平台上管理和运营你的公众号。以下是接入的具体步骤: 步骤一:注册微信公众号和开发者账号 要进行公众号接入,首先需要注册一个微信公众号,并且在微信公众平台上注册一个开发者账号。 步骤二:认证公众…

    Java 2023年5月26日
    00
  • Java使用DFA算法实现敏感词过滤的示例代码

    我来给您详细讲解下“Java使用DFA算法实现敏感词过滤的示例代码”的完整攻略。 什么是DFA算法 DFA(Deterministic Finite Automaton)算法,也就是确定有穷自动机算法。它是一种字符串处理算法,可以用来过滤敏感词。其主要思路是将一个字符串生成一个DFA状态机,然后再通过该状态机对另一个字符串进行敏感词过滤。 在DFA算法中,生…

    Java 2023年5月19日
    00
  • 生成无限制的微信小程序码的示例代码

    生成无限制的微信小程序码需要通过调用微信开发者工具的接口实现。下面是详细的步骤: 1. 开启开发者工具服务器功能 在微信开发者工具的顶栏中点击“设置”按钮,在弹出的设置页面中开启“开发者工具服务”,如果之前没有设置安全域名,开启之后需要先设置安全域名。 2. 获取 session_key 调用 wx.login() 方法获取 code,然后通过以下方式获取 …

    Java 2023年5月23日
    00
  • 详解使用docker搭建kafka环境

    详解使用Docker搭建Kafka环境 在本文中,我们将讲解如何使用Docker Compose搭建一个Kafka环境,用于开发和测试。使用Docker可以让我们在几分钟内启动一个完整的Kafka集群,而不需要手动配置和安装Kafka。 前置要求 在开始之前,您需要安装Docker和Docker Compose。如果您还没有安装,可以参考以下链接: Dock…

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