java向微信公众号---发送模板和图文消息

其他操作

书接上文:微信测试号申请步骤和调试.
书接下文:后台获取授权用户的openId.

项目搭建

maven

<dependencies>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>org.jolokia</groupId>
            <artifactId>jolokia-core</artifactId>
            <version>1.6.0</version>
        </dependency>

        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.6.0</version>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </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.61</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.9</version>
        </dependency>

    </dependencies>

application.yml

###################  项目启动端口  ###################
server:
  port: 80

# 微信公众号配置
wx:
  #微信公众号APPID
  appid: 123
  #微信公众号SECRET
  secret: 123
  #微信公众号模板ID
  templateId: 123

yml参数配置


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

/**
 * 微信参数
 **/
@Data
@Component
@ConfigurationProperties(prefix = "wx")
public class WxMpProperties {

    /**
     * 公众号appId
     */
    private String appId;

    /**
     * 公众号appSecret
     */
    private String secret;

    /**
     * 公众号模板ID
     */
    private String templateId;
}

微信客户端配置


import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 微信配置
 **/
@Configuration
public class WxConfig {

    @Autowired
    WxMpProperties wxMpProperties;

    /**
     * 构造注入
     *
     * @param wxMpProperties
     */
    WxConfig(WxMpProperties wxMpProperties) {
        this.wxMpProperties = wxMpProperties;
    }

    /**
     * 微信客户端配置存储
     *
     * @return
     */
    @Bean
    public WxMpConfigStorage wxMpConfigStorage() {
        WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
        // 公众号appId
        configStorage.setAppId(wxMpProperties.getAppId());
        // 公众号appSecret
        configStorage.setSecret(wxMpProperties.getSecret());
        // 公众号Token
        configStorage.setToken(wxMpProperties.getToken());
        // 公众号EncodingAESKey
        configStorage.setAesKey(wxMpProperties.getAesKey());
        return configStorage;
    }

    /**
     * 声明实例
     *
     * @return
     */
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }
}

搭建完成 实现业务

模板消息推送

准备工作

在这里插入图片描述
链接: 申请测试模板.

模板消息填写要求

first.DATA 跟上.DATA说明是数据

人员:{{first.DATA}} 
地址:{{keyword1.DATA}} 
区域:{{keyword2.DATA}} 
告警类型:{{remark1.DATA}} 
时间:{{remark2.DATA}}
图文消息填写要求
<xml> 
<Articles> 
	<item> 
		<Title><![CDATA[title1]]></Title> 
		<Description><![CDATA[description1]]></Description> 
		<PicUrl><![CDATA[picurl]]></PicUrl> 
		<Url><![CDATA[url]]></Url>
	</item>
	<item>
		<Title><![CDATA[title]]></Title>
		<Description><![CDATA[description]]></Description>
		<PicUrl><![CDATA[picurl]]></PicUrl> 
		<Url><![CDATA[url]]></Url> 
	</item>
</Articles> 
</xml>

推送模板消息

这里使用微信提供的serviceApi
链接: WxMpService.


import com.shangqu.datapush.buildsite.model.emnus.AlarmType;
import com.shangqu.datapush.buildsite.model.mysqlData.AlarmInfo;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpAiOpenService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.WxMpUserService;
import me.chanjar.weixin.mp.bean.result.WxMpUserList;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;

/**
 * 微信消息推送
 *
 **/
@Slf4j
@Component
@CrossOrigin
public class WxMsgPush {

    /**
     * 微信公众号API的Service
     */
    private final WxMpService wxMpService;

    /**
     * 构造注入
     */
    WxMsgPush(WxMpService wxMpService) {
        this.wxMpService = wxMpService;
    }


    /**
     * 发送微信模板信息
     *
     * @param openId 接受者openId
     * @return 是否推送成功
     */
    public Boolean SendWxMsg(String openId,String templateId) {

        // 发送模板消息接口
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                // 接收者openid
                .toUser(openId)
                // 模板id
                .templateId(templateId)
                // 模板跳转链接
                .url("www.baidu.com")
                .build();
        // 添加模板数据
        templateMessage.addData(new WxMpTemplateData("first", "null告警""#000000"))
                .addData(new WxMpTemplateData("keyword1", "","#000000"))
                .addData(new WxMpTemplateData("keyword2","", "#000000"))
                .addData(new WxMpTemplateData("keyword3", "", "#000000"))
                .addData(new WxMpTemplateData("keyword4", "", "#000000"));
        String msgId = null;
        try {
            // 发送模板消息
            msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);

        } catch (WxErrorException e) {
            e.printStackTrace();
        }
        log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
        return msgId != null;
    }

}
推送模板消息结果——效果

在这里插入图片描述
点击详情会进入百度

推送图文消息

    /**
     * 获取token
     * @return
     */
    public String getAccessToken() throws WxErrorException {
        String accessToken = wxMpService.getAccessToken();
        return accessToken;
    }


	@ApiOperation(value = "", notes = "")
    @ResponseBody
    @RequestMapping(value = "/findwx", method = RequestMethod.POST)
    public void SendQYMessageimg(@RequestParam("id") String id) throws WxErrorException {
        String Url = "http://www.baidu.com";
        String mp = getAccessToken();
        String strurl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + mp;

        try {

			//图片地址
            String PicUrl = "https://img-blog.csdn.net/20160907155302548";

            String responeJsonStr = "{";
            //用户openId
            responeJsonStr += "\"touser\": \"" + "用户openId" + "\",";
            responeJsonStr += "\"msgtype\": \"news\",";
            responeJsonStr += "\"agentid\": \"wxd4aff8****\",";
            responeJsonStr += "\"news\": {";
            responeJsonStr += "\"articles\": [{";
            responeJsonStr += "  \"title\": \"" + "震惊外国一小伙竟然做出... ..." + "\",";
            responeJsonStr += "  \"description\": \" " + "今日一美国男子在家中,竟然做出... ..." + "\",";
            responeJsonStr += "  \"url\": \"" + Url + "\",";
            responeJsonStr += "  \"picurl\": \"" + PicUrl + "\"";
            responeJsonStr += "}]";
            responeJsonStr += "},";
            responeJsonStr += "\"safe\":\"0\"";
            responeJsonStr += "}";
            xstream.connectWeiXinInterface(strurl, responeJsonStr);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
推送图文消息工具类

import java.io.InputStream;
import java.io.OutputStream;
 
import java.net.HttpURLConnection;
import java.net.URL;
 
public class xstream {
 
    public static void connectWeiXinInterface(String action,String json){
 
        URL url;
 
        try {
 
            url = new URL(action);
 
            HttpURLConnection http = (HttpURLConnection) url.openConnection();
 
            http.setRequestMethod("POST");
 
            http.setRequestProperty("Content-Type",
 
                    "application/x-www-form-urlencoded");
 
            http.setDoOutput(true);
 
            http.setDoInput(true);
 
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
 
            System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
 
            http.connect();
 
            OutputStream os = http.getOutputStream();
 
            os.write(json.getBytes("UTF-8"));// 传入参数
 
            InputStream is = http.getInputStream();
 
            int size = is.available();
 
            byte[] jsonBytes = new byte[size];
 
            is.read(jsonBytes);
 
            String result = new String(jsonBytes, "UTF-8");
 
            System.out.println("请求返回结果:"+result);
 
            os.flush();
 
            os.close();
 
        } catch (Exception e) {
 
            e.printStackTrace();
 
        }
 
    }
 
 
 
}
问题和结果

要用户先发送一条消息给公众号,你才能发送成功
在这里插入图片描述
点击消息会进入百度

获取关注的用户openId

    /**
     * 获得关注公众号所有openid
     * @return
     * @throws WxErrorException
     */
    @Override
    public List<String> getUserList() throws WxErrorException {
        WxMpUserList wxMpUserList = wxMpService.getUserService().userList(null);
        List<String> openids = wxMpUserList.getOpenids();
        return openids;
    }

既然有了openId集合和要发送的消息怎么群发

微信并没有提供群发接口–就在自己代码中迭代openId集合去循环发送

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: Java微信公众号定时发送消息模板通常分为两部分: 第一部分是实现Wechat API与Java后端的通信。Wechat API是微信提供的接口,可以让我们通过Java代码与微信公众号进行交互。具体来说,我们需要在Java中通过HTTP或HTTPS协议发送请求,获取微信公众号的access_token,再通过access_token来进行后续的操作,例如:获取用户的消息发送消息、创建菜单等等。Java中可以使用Apache HttpClient或OkHttp等库来发送HTTP请求,拿到接口返回的JSON数据。 第二部分是实现定时发送消息Java中可以使用Quartz框架用于实现定时任务。Quartz是一个开源的作业调度框架,可以用于在指定时间执行任务。我们可以利用Quartz提供的API,创建一个定时任务,定期调用我们的后端Java代码发送微信公众号消息。在定时任务的实现中,我们需要考虑任务的频率、执行时间、失败策略等问题。 当以上两部分都实现以后,我们就可以在Java后端实现微信公众号定时发送消息的功能了。具体来说,我们需要将发送消息的代码放到定时任务中,指定要发送消息内容,以及要发送给的用户。然后启动定时任务即可,Java后端会自动按照设定的规则发送微信公众号消息。 值得注意的是,微信官方文档要求所有公众号对接的应用都必须是官方认证的,所以在实现这个功能之前,我们需要先将我们的应用向微信官方申请认证,获得相应的API调用权限。 ### 回答2: Java微信公众号定时发送消息模板是一种利用Java语言实现的微信公众平台的定时发送消息模板。该模板可以帮助微信公众号上的管理员在指定时间点自动发送指定的消息,从而提高工作效率和用户体验。 实现Java微信公众号定时发送消息模板的关键是使用了微信公众平台提供的接口。这些接口可以通过Java语言进行调用,从而实现向微信公众号发送消息、设置菜单、自动回复、素材管理、用户管理等功能。在定时发送消息模板中,我们需要利用这些接口设置定时任务,并在指定时间点调用接口发送消息。 具体实现过程如下: 1. 首先需要在微信公众平台上申请开发者账号,并获取相应的开发者ID、开发者密码和Token。 2. 在Java中使用微信公众平台提供的SDK调用相关接口,实现发送消息、设置菜单、自动回复等功能。 3. 利用Java中的定时任务框架,如Quartz、Spring定时任务等,在指定的时间点调用相应的微信接口实现定时发送消息。 4. 利用Java中的模板功能,以标准化的格式组织需要发送消息内容,使消息具有可读性和易管理性。 需要注意的是,为了避免被微信公众平台封禁账号,我们需要遵循微信公众平台的相关规定,比如定时发送消息不能含有敏感词汇、不能频繁发送等。另外,定时发送的频次也需要控制在一定范围内,避免对用户造成困扰。 总之,Java微信公众号定时发送消息模板是一种非常实用的工具,可以帮助管理员提高工作效率和用户体验。但实现过程需要注意一些细节和规范,确保操作的合法性和安全性。 ### 回答3: Java微信公众号定时发送消息模板是指利用Java编程语言实现微信公众号定时发送消息功能,并且提供了消息模板方便开发者进行二次开发。这个模板主要包含以下几个方面: 一、微信公众号接入 首先,需要在微信公众号后台注册并获取开发者ID和开发者密钥,然后使用Java框架接入微信公众号的开放平台。接入之后,就可以使用微信公众号提供的API实现发送消息功能。 二、定时任务 接下来,需要编写Java代码实现定时任务功能。Java提供了Timer和TimerTask类可以很方便地实现定时任务功能。开发者可以选择设定每日,周,月等不同的定时任务。 三、发送消息 定时任务设置好后,需要编写Java代码实现发送消息的功能。这个功能可以通过调用微信公众号提供的API来实现。消息发送可以以文本消息图文消息,视频消息等不同的形式呈现。 四、编写消息模板 最后,为了让开发者方便使用,我们需要编写一个消息模板来进行二次开发。消息模板可以包含以下几个方面:微信公众号接入的配置信息、定时任务的配置信息、发送消息的配置信息,以及发送消息的实现方法等。这个模板可以让开发者快速地实现微信公众号定时发送消息的功能。 通过这个模板,开发者可以很方便地搭建起微信公众号定时发送消息的系统,从而可以提高服务的质量和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值