当前位置:   article > 正文

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

wxmptemplatemessage

目录

前言

介绍

准备操作

代码


前言

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

介绍

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

关于使用规则,请注意:

  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

  1. <!-- 微信公众号 -->
  2. <dependency>
  3. <groupId>com.github.binarywang</groupId>
  4. <artifactId>weixin-java-mp</artifactId>
  5. <version>4.4.0</version>
  6. </dependency>
  1. //配置类
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. @Data
  6. @Component
  7. @ConfigurationProperties(prefix = "gzh")
  8. public class WxMpProperties {
  9. /**
  10. * 公众号appId
  11. */
  12. private String appId;
  13. /**
  14. * 公众号appSecret
  15. */
  16. private String secret;
  17. }
  1. //配置类
  2. import com.alibaba.fastjson.JSON;
  3. import com.ruoyi.common.utils.http.HttpUtils;
  4. import com.ruoyi.utils.StringUtil;
  5. import me.chanjar.weixin.mp.api.WxMpService;
  6. import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
  7. import me.chanjar.weixin.mp.config.WxMpConfigStorage;
  8. import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.data.redis.core.RedisTemplate;
  13. import java.util.Map;
  14. import java.util.concurrent.TimeUnit;
  15. @Configuration
  16. public class WxConfig {
  17. private final WxMpProperties wxMpProperties;
  18. @Autowired
  19. private RedisTemplate redisTemplate;
  20. /**
  21. * 构造注入
  22. *
  23. * @param wxMpProperties
  24. */
  25. WxConfig(WxMpProperties wxMpProperties) {
  26. this.wxMpProperties = wxMpProperties;
  27. }
  28. /**
  29. * 微信客户端配置存储
  30. *
  31. * @return
  32. */
  33. @Bean
  34. public WxMpConfigStorage wxMpConfigStorage() {
  35. WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
  36. // 公众号appId
  37. configStorage.setAppId(wxMpProperties.getAppId());
  38. // 公众号appSecret
  39. configStorage.setSecret(wxMpProperties.getSecret());
  40. // 公众号Token
  41. configStorage.setToken(getToken());
  42. return configStorage;
  43. }
  44. /**
  45. * 声明实例
  46. *
  47. * @return
  48. */
  49. @Bean
  50. public WxMpService wxMpService() {
  51. WxMpService wxMpService = new WxMpServiceImpl();
  52. wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
  53. return wxMpService;
  54. }
  55. public String getToken() {
  56. Object accessToken1 = redisTemplate.opsForValue().get("AccessToken");
  57. if (null != accessToken1) {
  58. String accessToken = (String) redisTemplate.opsForValue().get("AccessToken");
  59. if (accessToken != null) {
  60. return accessToken;
  61. }
  62. }
  63. String s = HttpUtils.sendGet(" https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxMpProperties.getAppId() + "&secret=" + wxMpProperties.getSecret(), null);
  64. System.out.println(s);
  65. Map<String, Object> map = JSON.parseObject(s);
  66. System.out.println(map);
  67. if (StringUtil.isNullOrEmpty(map.get("access_token"))) {
  68. return null;
  69. }
  70. String access_token = map.get("access_token").toString();
  71. //官方返回的access_token有效时间为2小时=7200秒 这里存到redis 7000秒
  72. redisTemplate.opsForValue().set("AccessToken", access_token, 7000, TimeUnit.SECONDS);
  73. return access_token;
  74. }
  75. public static void main(String[] args) {
  76. String s = HttpUtils.sendGet(" https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa19e546e72ba4e71&secret=8efa42dfd859601d5800d75f725a739e", null);
  77. System.out.println(s);
  78. Map<String, Object> map = JSON.parseObject(s);
  79. System.out.println(map);
  80. }
  81. }
  1. //发送通知
  2. import com.ruoyi.common.core.domain.AjaxResult;
  3. import com.ruoyi.utils.DateTool;
  4. import me.chanjar.weixin.common.error.WxErrorException;
  5. import me.chanjar.weixin.mp.api.WxMpService;
  6. import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
  7. import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
  8. import org.springframework.web.bind.annotation.PostMapping;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import java.util.Date;
  12. @RestController
  13. @RequestMapping("app/MessagePushController")
  14. public class MessagePushController {
  15. /**
  16. * 微信公众号API的Service
  17. */
  18. private final WxMpService wxMpService;
  19. /**
  20. * 构造注入
  21. */
  22. MessagePushController(WxMpService wxMpService) {
  23. this.wxMpService = wxMpService;
  24. }
  25. @RequestMapping("toWxMessage")
  26. public AjaxResult toWxMessage(){
  27. String openId = null;
  28. openId="oZN0p6z6Ad7D2jBYWjoTqsdj5Q8c";//用户openid
  29. // 发送模板消息接口
  30. WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
  31. // 接收者openid
  32. .toUser(openId)
  33. // 模板id
  34. .templateId("DP_W_VaO6hHvnS02HquweCj3K4765f42SygSJP_ke9w")
  35. // 模板跳转链接
  36. // .url("http://www.baidu.com")
  37. .build();
  38. // 添加模板数据
  39. templateMessage.addData(new WxMpTemplateData("first","标题"))
  40. .addData(new WxMpTemplateData("keyword1", "1"))
  41. .addData(new WxMpTemplateData("keyword2", "2"))
  42. .addData(new WxMpTemplateData("keyword3", "3"))
  43. .addData(new WxMpTemplateData("remark",""));
  44. String msgId = null;
  45. try {
  46. // 发送模板消息
  47. msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
  48. } catch (WxErrorException e) {
  49. e.printStackTrace();
  50. }finally {
  51. }
  52. return null;
  53. }

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

  1. 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);
  2. // String url = String.format(拼接的路径, appId, secret, code);
  3. // 远程调用微信获取openId
  4. String str = HttpUtils.sendGet(url, null);
  5. JSONObject json = JSON.parseObject(str);
  6. String errcode = json.getString("errcode");
  7. if (errcode != null)
  8. return AjaxResult.error("调用错误:" + errcode);
  9. String openid = json.getString("openid");
  10. if (StringUtil.isEmpty(openid))
  11. return AjaxResult.error("获取openid错误:" + errcode);
  12. System.out.println("openid:" + openid);

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

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

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

闽ICP备14008679号