成品效果图如下
前置条件的准备
- 申请微信公众号的测试号:申请测试公众号的地址
- 需要的相关依赖 如下
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.0.0</version>
</dependency>
- 申请成功之后会有appID和appsecret这个两个key,根据以上的key获取到微信的
WxMpService
@Configuration
public class WechatConfig {
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.appsecret}")
private String appsecret;
@Bean
public WxMpService wxMpService() {
WxMpService service = new WxMpServiceImpl();
WxMpInMemoryConfigStorage storage = new WxMpInMemoryConfigStorage();
storage.setAppId(appid);
storage.setSecret(appsecret);
service.setWxMpConfigStorage(storage);
return service;
}
}
- 配置接口信息
在申请完接口信息之后会需要配置一个接口信息,这个地方只支持端口是80和443的,这里直接把tomcat的端口直接改为80就可以了,可以看一下我的也可以直接看微信官方的微信官方接口配置文档,点完确定看到配置成功之后就可以使用了
/**
* @param signature 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。
* @param timestamp 时间戳
* @param nonce 随机数
* @param echostr 随机字符串
* @return
*/
@GetMapping(value = "/checkSignature")
@ApiOperation(value = "校验微信推送过来的相关信息", notes = "校验微信推送过来的相关信息", response = ApiResultUtils.class)
public String checkSignature(String signature, String timestamp,
String nonce, String echostr) {
return sendMessage.checkSignature(signature, timestamp, nonce, echostr);
}
sendMessage.checkSignature(signature, timestamp, nonce, echostr)代码如下
@Override
public String checkSignature(String signature, String timestamp, String nonce, String echostr) {
// 第一步:自然排序
String[] tmp = {token, timestamp, nonce};
Arrays.sort(tmp);
// 第二步:sha1 加密
String sourceStr = StringUtils.join(tmp);
String localSignature = DigestUtils.sha1Hex(sourceStr);
// 第三步:验证签名
if (signature.equals(localSignature)) {
return echostr;
}
return null;
}
发送模版消息
这里通过消息模板发送相关的消息,微信上有文档进行介绍微信发送模板消息文档,下面是本人进行配置的步骤
-
让别人关注测试公众号
-
创建消息模板
模板标题: 💗亲爱的老婆💗 模板内容:(模板内容必须按照{{key.DATA}}这个规则进行创建) {{first.DATA}} {{second.DATA}} {{third.DATA}} {{fourth.DATA}} {{fifth.DATA}}
-
现在进行代码编写
toUser是微信号, 在测试微信公众号的页面上可以找到,templateId就是模版id也可以在测试微信公众号的页面上可以找到
@Override
public String send() {
log.info("进入发送模版信息");
// 实例化模板对象
WxMpTemplateMessage wxMpTemplateMessage = new WxMpTemplateMessage();
// 设置模板ID
wxMpTemplateMessage.setTemplateId(templateId);
// 设置发送给哪个用户
wxMpTemplateMessage.setToUser(toUser);
WeatherEntity weatherEntity = null;
// 构建消息格式
List<WxMpTemplateData> listData = new ArrayList<>(12);
// 这里对应着{{first.DATA}} 参数分别是key ,value , color
WxMpTemplateData first = new WxMpTemplateData("first", "一日之计在于晨,早上起床记得刷牙洗脸"
, "#173177");
WxMpTemplateData second = new WxMpTemplateData("second", "当前是: ", "#173177");
WxMpTemplateData third = new WxMpTemplateData("third", " 温度:度 天气微凉带好外套,", "#173177");
WxMpTemplateData fourth = new WxMpTemplateData("fourth", "当前距离生日还有天"
+ " 距离生日还有天"
, "#173177");
WxMpTemplateData fifth = new WxMpTemplateData("fifth", "我们已经在一起" + together + "天"
, "#173177");
// 第二行数据内容 {{first.DATA}}
listData.add(first);
// 第二行数据内容 {{second.DATA}}
listData.add(second);
// 第三行数据内容 {{third.DATA}}
listData.add(third);
// 第四行数据内容 {{fourth.DATA}}
listData.add(fourth);
// 第五行数据内容 {{fifth.DATA}}
listData.add(fifth);
// 设置跳转url
wxMpTemplateMessage.setUrl(weatherEntity.getFxLink());
String wxTemplateResult = null;
// 放进模板对象。准备发送
wxMpTemplateMessage.setData(listData);
try {
if (weatherEntity != null) {
// 发送模板
wxTemplateResult = wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);
if (StrUtil.isNotEmpty(wxTemplateResult)) {
log.info("发送成功");
}
}
} catch (WxErrorException e) {
e.printStackTrace();
}
return wxTemplateResult;
}
- 调用当前的方法就可以发送模板消息啦