微信公众号消息模板——Java

目录

前言

介绍

准备操作

代码


前言

公众号消息模板推送有很多便利,尤其是针对小程序的消息提醒,具有及时性,准确性等有优势,还可以点击进入小程序当然更加适配小程序的有专门的小程序订阅消息,这个之后再列举。

介绍

这里注意申请的公众号必须是服务号才能开通模板消息功能,另外申请模板消息的时候要选择正确适用的行业,因为选择完行业之后的模板都是关于这个行业的。

关于使用规则,请注意:

  1. 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
  2. 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
  3. 在所选择行业的模板库中选用已有的模板进行调用;
  4. 每个账号可以同时使用25个模板。
  5. 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在 MP 登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号 MP 后台开发者中心页面中标明的数字为准。

准备操作

1.申请服务号并进行微信认证。

2.再新增功能里开通模板消息,选择适用的行业。

 3.配置基本信息 开发者ID,密钥,ip白名单  这里注意要填写ip白名单,测试的时候,如果使用本地测试需要把本地的ip放到微信公众平台的白名单中才可以测试成功。

服务器地址:支持http 80 https 443 用于获取code的授权页面的访问地址

代码

微信公众号maven

 <!-- 微信公众号 -->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>4.4.0</version>
        </dependency>
//配置类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "gzh")
public class WxMpProperties {

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

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

}
//配置类

import com.alibaba.fastjson.JSON;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.utils.StringUtil;
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;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Configuration
public class WxConfig {
    private final WxMpProperties wxMpProperties;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 构造注入
     *
     * @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(getToken());
        return configStorage;
    }

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


    public String getToken() {
        Object accessToken1 = redisTemplate.opsForValue().get("AccessToken");
        if (null != accessToken1) {
            String accessToken = (String) redisTemplate.opsForValue().get("AccessToken");
            if (accessToken != null) {
                return accessToken;
            }
        }
        String s = HttpUtils.sendGet(" https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxMpProperties.getAppId() + "&secret=" + wxMpProperties.getSecret(), null);
        System.out.println(s);
        Map<String, Object> map = JSON.parseObject(s);
        System.out.println(map);
        if (StringUtil.isNullOrEmpty(map.get("access_token"))) {
            return null;
        }
        String access_token = map.get("access_token").toString();
        //官方返回的access_token有效时间为2小时=7200秒 这里存到redis 7000秒
        redisTemplate.opsForValue().set("AccessToken", access_token, 7000, TimeUnit.SECONDS);
        return access_token;
    }

    public static void main(String[] args) {
        String s = HttpUtils.sendGet(" https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa19e546e72ba4e71&secret=8efa42dfd859601d5800d75f725a739e", null);
        System.out.println(s);
        Map<String, Object> map = JSON.parseObject(s);
        System.out.println(map);
    }
}
//发送通知

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.utils.DateTool;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;

@RestController
@RequestMapping("app/MessagePushController")
public class MessagePushController {

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

    /**
     * 构造注入
     */
    MessagePushController(WxMpService wxMpService) {
        this.wxMpService = wxMpService;
    }
    @RequestMapping("toWxMessage")
    public AjaxResult toWxMessage(){
        String openId = null;
        openId="oZN0p6z6Ad7D2jBYWjoTqsdj5Q8c";//用户openid
        // 发送模板消息接口
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                // 接收者openid
                .toUser(openId)
                // 模板id
                .templateId("DP_W_VaO6hHvnS02HquweCj3K4765f42SygSJP_ke9w")
                // 模板跳转链接
//                .url("http://www.baidu.com")
                .build();
        // 添加模板数据
        templateMessage.addData(new WxMpTemplateData("first","标题"))
                .addData(new WxMpTemplateData("keyword1", "1"))
                .addData(new WxMpTemplateData("keyword2", "2"))
                .addData(new WxMpTemplateData("keyword3", "3"))
                .addData(new WxMpTemplateData("remark",""));
        String msgId = null;
        try {
            // 发送模板消息
            msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (WxErrorException e) {
            e.printStackTrace();
        }finally {
        }
        return null;
    }

注意:上述配置类中获取的token是有时效的所以可以把他放到redis缓存里,这样需要的时候从redis里拿,空的时候再获取放入redis。里面用到的openid为公众号授权获取到的用户id,获取公众号openid方式如下:前端提供code

        String url = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", "wx3453a1546e72ba4e71", "3455435dfhdfhd", code);
//  String url = String.format(拼接的路径, appId, secret, code);
        //  远程调用微信获取openId
        String str = HttpUtils.sendGet(url, null);
        JSONObject json = JSON.parseObject(str);
        String errcode = json.getString("errcode");
        if (errcode != null)
            return AjaxResult.error("调用错误:" + errcode);
        String openid = json.getString("openid");
        if (StringUtil.isEmpty(openid))
            return AjaxResult.error("获取openid错误:" + errcode);
        System.out.println("openid:" + openid);

官方开发文档附上:模板消息 | 微信开放文档 (qq.com)

附:人们常说拼尽全力才活成一个普通人,你又拼出几分。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值