当前位置:   article > 正文

java推送微信小程序订阅消息

java推送微信小程序订阅消息

效果图

在这里插入图片描述

一、开发前资料准备:

1.1 登录微信小程序后台:微信小程序

使用自己微信号登录即可
在这里插入图片描述

1.2 寻找Appid和AppSecret配置:

在这里插入图片描述

1.3选择合适的模板消息进行推送

在这里插入图片描述

  • 选择自己需要的模板,没有的话到最后一页去自己申请(看下下张图的自己申请即可)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.4找到模板id:

在这里插入图片描述

1.5下载官方微信开发工具:微信开发工具

  • 选择自己电脑匹配的版本下载
    在这里插入图片描述

二、小程序订阅消息代码开发:

2.1创建官方小程序DEMO

在这里插入图片描述

2.2获取code如下图点击app.js,然后再登录中打印code值

在这里插入图片描述

2.3、添加一个按钮(可有可无)

 <button type="default" bindtap="sendDYMsg">订阅模板消息</button>
  • 1

在这里插入图片描述

2.4给按钮添加执行函数:

,
  sendDYMsg: function(e) {
    wx.requestSubscribeMessage({
      tmplIds: ['6Bci11EozQriga8JK4X56GqUtbpdhBtJHxvyJk56ygw'],
      success(res) {
        console.log("可以给用户推送一次消息了。。。");
      }
    })
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

2.5获取推送权限

  • 输出可以给用户推送一次消息了,就可以给用户推送一次消息。用户一直点击—可以一直推送~
    在这里插入图片描述

三、服务端开发(java)

3.1项目结构

在这里插入图片描述

3.2继承pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.4</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.study.wechat</groupId>
  <artifactId>applet</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>applet</name>
  <description>Demo project for Spring Boot</description>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>com.github.binarywang</groupId>
      <artifactId>weixin-java-miniapp</artifactId>
      <version>3.8.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.9.2</version>
    </dependency>

    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.9.2</version>
    </dependency>


    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

3.3添加yml文件

wx:
  miniapp:
    appId: 'wx63f8318b2deb08c8'
    appSecret: '3051cb6494712466bac822472aa230d5'
    templates:
      - id: ''
        type: 'releaseWithoutSignIn'
        stationDetails: ''
        bookingTime: ''
        bookingStaff: ''
        checkInTime: ''
        tipInstruction: ''
        page: ''
      - id: '6Bci11EozQriga8JK4X56GqUtbpdhBtJHxvyJk56ygw'
        type: 'sensorRelease'
        stationDetails: 'character_string7'
        bookingTime: 'thing8'
        bookingStaff: 'thing10'
        checkInTime: 'thing12'
        tipInstruction: 'character_string14'
        page: ''
server:
  port: 8080
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.4增加配置文件

package com.study.wechat.applet.config;

import java.util.List;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxConfig {

  private String appId;

  private String appSecret;

  private List<Template> templates;

  @Data
  public static class Template {

    /**
     * 模板id
     */
    private String id;

    /**
     * 模板类型
     */
    private String type;

    /**
     * 工位详情
     */
    private String stationDetails;

    /**
     * 预订时间
     */
    private String bookingTime;

    /**
     * 预订人员
     */
    private String bookingStaff;

    /**
     * 签到时间
     */
    private String checkInTime;

    /**
     * 提示说明
     */
    private String tipInstruction;

    /**
     * 跳转到哪个页面
     */
    private String page;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
package com.study.wechat.applet.config;

import com.study.wechat.applet.config.WxConfig.Template;
import com.study.wechat.applet.utils.SendMiniAppUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author wenjun
 * @date 2021/3/19 18:30
 */
@Configuration
public class WxAppletsConfig {

  @Autowired
  private WxConfig wxConfig;

  public static Map<String, Template> wxTemplates = new HashMap<>();

  @Bean
  public SendMiniAppUtils sendMiniAppUtils() {
    wxTemplates = wxConfig.getTemplates().stream()
        .collect(Collectors.toMap(Template::getType, template -> template));
    return new SendMiniAppUtils(wxConfig.getAppId(), wxConfig.getAppSecret());
  }


}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
package com.study.wechat.applet.config;

/**
 * @author wenjun
 * @date 2021/3/19 20:44
 */

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

  @Bean
  public Docket swaggerSpringMvcPlugin() {
    return new Docket(DocumentationType.SWAGGER_2).select()
        .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build();
  }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3.5增加模板管理类

package com.study.wechat.applet.manager;


import com.study.wechat.applet.config.WxConfig;
import com.study.wechat.applet.config.WxConfig.Template;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author wenjun
 * @date 2021/3/20 14:18
 */
@Component
@Slf4j
public class WeChatManager {

  @Autowired
  private WxConfig config;
  public static Map<String, Template> wxTemplates = new HashMap<>();

  @PostConstruct
  public void init() {
    wxTemplates = config.getTemplates().stream()
        .collect(Collectors.toMap(Template::getType, template -> template));
  }

  public Template getTemplateByType(String type) {
    return wxTemplates.get(type);
  }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

3.6增加推送消息工具类

package com.study.wechat.applet.utils;

import cn.binarywang.wx.miniapp.api.WxMaMsgService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage.Data;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import java.util.List;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.util.StringUtils;

/**
 * @author wenjun
 * @date 2021/3/13 16:13
 */
public class SendMiniAppUtils {

  private WxMaMsgService msgService;

  private WxMaServiceImpl wxMaService;

  /**
   * description: 构造函数(初始化配置) param: wxMpConfig 配置内容
   */
  public SendMiniAppUtils(String appId, String appSercret) {
    if (StringUtils.isEmpty(appId)) {
      throw new RuntimeException("appId不能为空");
    }
    if (StringUtils.isEmpty(appSercret)) {
      throw new RuntimeException("secret不能为空");
    }
    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
    config.setAppid(appId);
    config.setSecret(appSercret);
    wxMaService = new WxMaServiceImpl();
    wxMaService.setWxMaConfig(config);
    msgService = wxMaService.getMsgService();

  }

  /**
   * 根据code获取openID
   */
  public String getOpenIdByCode(String code) {
    WxMaJscode2SessionResult session = null;
    try {
      session = wxMaService.getUserService().getSessionInfo(code);
      return session.getOpenid();
    } catch (WxErrorException e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * description: 发送订阅消息 param: openId 用户的openid param: templateId 模板id param: dataParam 参数内容
   */
  public void sendSubscribeMsg(String openId, String templateId,
      List<Data> dataParam) throws WxErrorException {

    // 3.8.0版本使用的使用WxMaSubscribeMessage
    WxMaSubscribeMessage.WxMaSubscribeMessageBuilder builder = WxMaSubscribeMessage.builder();

    builder.toUser(openId);//推送消息的目标对象openId
    builder.templateId(templateId); //这里填写的就是在后台申请添加的模板ID
    builder.data(dataParam);//添加请求参数
    WxMaSubscribeMessage msg = builder.build();
    msgService.sendSubscribeMsg(msg);
  }

  /**
   * description: 发送订阅消息 param: openId 用户的openid param: templateId 模板id param: dataParam 参数内容 param:
   * page 跳转链接
   */
  public void sendSubscribeMsg(String openId, String templateId,
      List<WxMaSubscribeMessage.Data> dataParam, String page) throws WxErrorException {

    // 3.8.0版本使用的使用WxMaSubscribeMessage
    WxMaSubscribeMessage.WxMaSubscribeMessageBuilder builder = WxMaSubscribeMessage.builder();

    builder.toUser(openId);//推送消息的目标对象openId
    builder.templateId(templateId); //这里填写的就是在后台申请添加的模板ID
    builder.data(dataParam);//添加请求参数
    builder.page(page); //添加跳转链接,如果目标用户点击了推送的消息,则会跳转到小程序主页
    WxMaSubscribeMessage msg = builder.build();
    msgService.sendSubscribeMsg(msg);
  }


}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92

3.7增加web端接口类

package com.study.wechat.applet.controller;

import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage.Data;
import com.study.wechat.applet.config.WxConfig.Template;
import com.study.wechat.applet.manager.WeChatManager;
import com.study.wechat.applet.utils.SendMiniAppUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wenjun
 * @date 2021/3/22 17:16
 */
@Api("微信小程序订阅消息推送接口")
@RestController
@RequestMapping("/wx/msg/")
@Slf4j
public class WxAppletsController {

  @Autowired
  SendMiniAppUtils sendMiniAppUtils;

  @Autowired
  private WeChatManager weChatManager;

  @ApiOperation(value = "微信小程序推送订阅消息", notes = "微信小程序推送订阅消息")
  @ApiImplicitParams({
      @ApiImplicitParam(name = "code", value = "用户code", dataType = "String", paramType = "query")})
  @GetMapping(value = "/getOpenIdByCode")
  @ResponseBody
  public Object getOpenIdByCode(String code) {
    String openIdByCode = sendMiniAppUtils.getOpenIdByCode(code);
    log.info("openID:{}", openIdByCode);

    return openIdByCode;
  }

  /**
   * 微信小程序推送订阅消息 create By KingYiFan on 2020/01/06
   */
  @ApiOperation(value = "微信小程序推送订阅消息", notes = "微信小程序推送订阅消息")
  @ApiImplicitParams({
      @ApiImplicitParam(name = "openId", value = "openId", dataType = "String", paramType = "query")})
  @GetMapping(value = "/sendDYTemplateMessage")
  @ResponseBody
  public Object sendDYTemplateMessage(String openId) {

    Template template = weChatManager.getTemplateByType("sensorRelease");
    List<Data> dataList = new ArrayList<>();
    Data data = new Data();
    data.setName(template.getStationDetails());

    data.setValue("01 08 09 13 16 33+01");
    dataList.add(data);
    Data data1 = new Data();
    data1.setName(template.getBookingTime());
    data1.setValue("最终开奖结果请已彩票官网为准");
    dataList.add(data1);
    Data data2 = new Data();
    data2.setName(template.getBookingStaff());
    data2.setValue("孙先生");
    dataList.add(data2);
    Data data3 = new Data();
    data3.setName(template.getCheckInTime());
    data3.setValue("2020-05-26前");
    dataList.add(data3);
    Data data4 = new Data();
    data4.setName(template.getTipInstruction());
    data4.setValue("202009182021331001");
    dataList.add(data4);
    try {
      /* String openIdByCode = sendMiniAppUtils.getOpenIdByCode(code);
      log.info("openID:{}",openIdByCode);*/
      sendMiniAppUtils
          .sendSubscribeMsg(openId,
              template.getId(), dataList,
              template.getPage());
      log.info("推送成功!!!");
    } catch (WxErrorException e) {
      log.error("错误消息:{}", e.getMessage());
      e.printStackTrace();
    }

    return "推送失败";
  }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

到这里就可以了!!!,使用postMan发送微信就可以接受到消息了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/981043
推荐阅读
相关标签
  

闽ICP备14008679号