1.前期准备

1. 首先需要的是一个能正常运营的微信公众号或者订阅号,根据微信公众平台,使用已授权的用户登录,获取对应的appId 和 开发者密码 appSecret

得到appId和AppSecret是为了后续调用微信官方接口必不可少的参数,例如获取微信基础accessToken则需要以上入参;

2. 设置域名以及ip白名单

ip白名单主要是针对获取acces_token,一般设置成自己服务器的ip地址,因为还需要设置自定义域名,可以关联到服务器地址,从而微信接口请求返回可以有对应的请求地址,例如, 我服务器的ip地址是222.13.11.103 ,那么ip白名单就填入这个地址即可;

设置域名主要做回调地址使用,例如:pay.company.cn,需要根据官方指引,将对应的txt文件放到web服务器的根目录下即可

在微信授权的时候需要用到其域名

3. 选择合适的消息模板,记住其模板id和点击详情后的内容格式,因为发送模板消息,需要模板id以及内容格式

2.用户微信授权,获取其openId(重要)

这一步非常重要,只有是跟微信对接,都需要得到用户的openId,才能把模板消息发送到对应的用户中,且每个微信用户都有一个唯一的openId,当获取到openId后,建议保存入库;

可参考微信官方文档:开发前必读 | 微信开放文档

这里将会指引你如何将用户进行网页授权也是就

1. 引导用户进入授权页面同意授权,获取code

2. 通过 code 换取网页授权access_token

3. 根据通过网页授权access_token和 openid 获取用户基本信息

以下代码,逻辑跟指引一样,先是构建url地址,然后回调自己定义的方法地址,同时微信会自动带出当前用户的code,然后根据code再次调用授权地址,带出对应的openId,而我们的目的就是获取用户的openId,例如官方示例地址;

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect

代码如下;(敏感的appid和密码以及域名地址需要自己替换)

@Controller
public class MyController {private static final Logger log = LoggerFactory.getLogger(MyController .class);// appIdprivate static final String appId = "wxc8xxxxcxxxxxx";// appIdSecretprivate static final String appIdSecret = "60b429xxxxxxxxxxxxxxx";//1.先查询code@RequestMapping("/getCode")public String getCode() {// 官方地址String urlFir = "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid=";// 微信申请的域名(提前准备)String domain = "http://pay.xxx.cn/wxpay";// 自定义跳转方法String redirectMethod = "/weixinoauth";// 地址进行encode转译 (未转译的地址是:http://pay.xxx.cn/wxpay/weixinoauth)// 转译后的地址是: http%3A%2F%2Fpay.xxx.cn%2Fwxpay%2FweixinoauthString encoderUrl = getURLEncoderString(domain + redirectMethod);log.info(urlFir +appId + "&redirect_uri=" + encoderUrl +"&response_type=code&scope=snsapi_base" + "&state=STATE" + "#wechat_redirect");return urlFir + appId + "&redirect_uri=" + encoderUrl +"&response_type=code&scope=snsapi_base" + "&state=STATE" + "#wechat_redirect";}/*** 编码* @param str* @return*/public static String getURLEncoderString(String str) {String result = "";if (null == str) {return "";}try {result = java.net.URLEncoder.encode(str, "GBK");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}//2.根据code获取openId@GetMapping("/wxpay/weixinoauth")public void weixinOauth(@RequestParam String code,@RequestParam String state) throws Exception {log.info("获取code:{}",code);String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ appId + "&secret=" + appIdSecret + "&code=" + code + "&grant_type=authorization_code";Map<String, Object> paramMap = null;String res = HttpUtil.get(url, paramMap);String openid = JSONObject.parseObject(res).getString("openid");log.info("根据code查询得到openId:{}",openid);}
}

需要在微信开发工具输入127.0.0.1/getCode,因为授权页面必须要在微信客户端中打开,所以需要下载微信开发工具,微信开发工具地址:开发前必读 | 微信开放文档

下载安装后,需要使用已配置了开发者权限的微信账号登录

然后系统会打印出跳转地址和openId ,该工具会自动跳转/getCode返回的Url并且回调我们的方法 /wxpay/weixinoauth 进行获取用户code,再构建授权url地址j获取openId

打印情况如下(敏感信息已打码):

如果正常到了这里,则说明成功了一半了。

3.获取微信基础accessToken

需要获取微信的基础accessToken用于构建模板消息发送的url入参,且该accessToken有效期只有两小时(下面简称token),因此当调用一下方法一次后,就可以将其放入redis中,设置过期时间(低于两小时);

    @GetMapping("/getToken")public void getAccessToken() throws Exception{String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId +"&secret=" + appIdSecret;String res = HttpUtil.get(url);JSONObject jsonObject = JSONObject.parseObject(res);String accessToken = jsonObject.getString("access_token");log.info("accessToken:{}", accessToken);}

代码会报错,但不影响获取token,日志打印如下; 保存token后续调用发送微信模板消息需要用到;

若出现了无效的ip地址错误,则确认ip白名单是否设置再去

4. 调用微信模板方法发送消息

这一步很简单,通过以上获取的 openId, accessToken 和 前期准备的模板id即可,我们只需要封装模板内容,再调用官方url即可

自定义DTO

@Data
@ToString
public class WeChatTemplateMsg {/*** 消息*/private String value;/*** 消息颜色*/private String color;public WeChatTemplateMsg(String value) {this.value = value;this.color = "#173177";}public WeChatTemplateMsg(String value, String color) {this.value = value;this.color = color;}
}
    @GetMapping("/sendMessage")public  String sendMessage() {// 模板参数Map<String, WeChatTemplateMsg> sendMag = new HashMap<String, WeChatTemplateMsg>();// openId代表一个唯一微信用户,即微信消息的接收人String openId = "oNB9p1BpVJEquxxxxxxxxx";// 公众号的模板id(也有相应的接口可以查询到)String templateId = "B0YStqTYdjHhY9Da9Sy2NM7xxxxxxxxxxx";// 微信的基础accessTokenString accessToken = "57_LubK-8NKQc6C7jsLMxvdHaI0ju4x3-HPWEFhh7GKkw9fKbWhuxxoZyX4GaVIn6y4yO7RKfSlCyHdedKJlHUMZkd8457nKm0TOoaVkbzK1HCZ4g4gZdrmAGBylGBOZu9yxxxxxxxxxxxxxxxx";String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;/***  其他模板可以从模板库中自己添加* 模板ID* B0YStqTYdjHhY9Da9Sy2NM7HXxxxxxxxxxxxxxx* 开发者调用模板消息接口时需提供模板ID* 标题* 产品兑付成功提醒* 行业* 金融业 - 证券|基金|理财|信托* 详细内容* {{first.DATA}}* 产品名称:{{keyword1.DATA}}* 当期兑付本金:{{keyword2.DATA}}* 当期兑付利息:{{keyword3.DATA}}* 已兑付期数:{{keyword4.DATA}}* 兑付日期:{{keyword5.DATA}}* {{remark.DATA}}*/sendMag.put("first", new WeChatTemplateMsg("f123"));sendMag.put("keyword1", new WeChatTemplateMsg("111"));sendMag.put("keyword2", new WeChatTemplateMsg("222"));sendMag.put("keyword3", new WeChatTemplateMsg("333"));sendMag.put("keyword4", new WeChatTemplateMsg("444"));sendMag.put("remark", new WeChatTemplateMsg("r555"));RestTemplate restTemplate = new RestTemplate();//拼接base参数Map<String, Object> sendBody = new HashMap<>();sendBody.put("touser", openId);               // openIdsendBody.put("url", "www.baidu.com");         // 点击模板信息跳转地址sendBody.put("topcolor", "#FF0000");          // 顶色sendBody.put("data", sendMag);                   // 模板参数sendBody.put("template_id", templateId);      // 模板IdResponseEntity<String> forEntity = restTemplate.postForEntity(url, sendBody, String.class);log.info("结果是: {}",forEntity.getBody());JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody());// 0String messageCode = jsonObject.getString("errcode");// 2431260672639467520String msgId = jsonObject.getString("msgid");System.out.println("messageCode : " + messageCode + ", msgId: " +msgId);return forEntity.getBody();}

结果是:

可能需要的依赖:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.0</version>
</dependency>

Java 微信公众号消息推送(从零开始)相关推荐

  1. Java微信公众号消息推送

    一.在项目的配置文件中配置公众号信息 # 微信公众号配置 wx:appid: **********secret: **************token: *********************a ...

  2. 微信公众号消息推送开发(模板消息):点击推送消息跳转到网页或者小程序(三)

    需求场景: 点击推送的消息后跳转到小程序中的某个页面,或者跳转到某一个网页上,例如有这样一个需求,在商城平台购买产品后,需要通过公众号给用户推送订单详细并且点击消息可以看到对应的订单详情.以下我将在微 ...

  3. 微信公众号消息推送流

    一.前期准备工作: 1.需要申请私人/公司的测试号-- 参考这篇文章 ,微信公众平台测试帐号申请 - 简书 (jianshu.com) 1.1.需要响应微信发送的Token请求: 注意:这里的端口必须 ...

  4. 专属微信公众号消息推送(java版)

    前言:专属女朋友的微信推送消息,简单的写个文档. gitee地址:消息推送 所用框架及Api springboot搭建应用 天行数据Api(彩虹屁.早安语句.天气) 前置条件 申请微信公众号测试号及微 ...

  5. java 实现微信公众号消息推送

    注册微信公众号 这里主要用测试账号来演示:测试账号注册地址 正式账号注册地址:微信公众平台 设置消息模板 可参考微信公众号文档:微信公众号文档 模板根据需求设置(注意:参数长度不能超出微信规定,否则将 ...

  6. 微信公众号-消息推送

    ********步骤******** 1.登录微信公众号开发平台,进行企业认证. 2.获取appid.appsecret 3.查找相应的接口 *所有的操作都需要带有accessToken *可以先利用 ...

  7. 尝试开发微信公众号消息推送功能并且和小程序关联

    之前写了几篇关于微信小程序的开发实践,总的来说没啥难度,感兴趣的请移步:使用Mpvue配合Weui开发面试题题库微信小程序,并且发布到正式环境,这一次我们来尝试开发一下微信公众号,那么公众号和小程序到 ...

  8. html消息推送微信,调用微信公众号消息推送

    在微信公众号中对指定的已关注的用户进行消息推送 资源下载此资源下载价格为2D币,请先登录 资源文件列表 惟安在线设备数量监控 -/App.config , 458 惟安在线设备数量监控 -/bin/D ...

  9. 微信公众号消息推送-模板消息发送

    先注册一个微信公众号;或者申请接口测试号来进行开发: 接口测试号申请链接: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login ...

  10. 微信公众号消息推送【专属早安】,五分钟快速实现,不会编程也可以 【--网站已修复】

    效果演示 提前准备 申请一个微信公众号测试号.地址:测试号申请 扫码登陆注册,注册成功后就会生成微信公号的appID和appsecret.[最后步骤需要] 页面往下滑 有一个测试号二维码,[需要接收消 ...

最新文章

  1. ideal连接数据库报错The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time
  2. JavaScript重载解读
  3. excel分类_Excel小技巧61:将输入的数字显示为中文
  4. NetCore EF Code Frist
  5. 备战毕设——JAVA基础(简单的数据类型和语句类型)
  6. HowNet文件介绍
  7. 【合集】SAP 成都研究院开发工程师们精彩纷呈的工作和生活片段
  8. JAVA—生成验证码的两种方法(代码+运行结果+总结)
  9. python词云图绘制
  10. elixir元编程的quote与unquote
  11. java初学者学习路线
  12. 网络安全学习路线(顶级白帽黑客)
  13. 基于SpingBoot2.0与activiti7.x构建的一套工作流程管理系统
  14. 树莓派Raspberry Pico RP2040 开发环境配置完全缝合终极版C-SDK
  15. python爬取饿了么评论_python爬取饿了么的实例
  16. SpringBoot Banner 图案
  17. JS:简单的页面广告制作(右下角广告可自动消失)
  18. 017 Rust死灵书之Drop标志
  19. 1030 习题3-1 计算国民生产总值增长倍数
  20. 短信链接可以直接跳转微信小商店么?

热门文章

  1. 基于Java的线上诊疗系统毕业设计源码1617411
  2. PPL文档——Excel制作的甘特图加上动态今日线
  3. 高质量编辑和压缩pdf
  4. Centos7安装ffmpeg和使用youtube-dl下载Youtube视频
  5. wps在任务栏取消显示多个文档的预览
  6. word数学公式快捷键-高效率办公技能get
  7. 计算机应用发展史的第四代,1.1.1 计算机的概念及其发展史
  8. matlab的h桥igbt驱动级死区电路,[转载]STM32 PWM死区--- H桥驱动电路 --- 三相桥式整流电路...
  9. NLP6:stanford Parser中文分词
  10. 前端实现导入(excel文件)导出(word)文件