一、首先想要对接,先要一个再就是开发文档了:
https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
!!请注意红色标记住,这一点
二、接下来完成公众号的基本配置:
1、服务器地址(URL):必须以http://或https://开头,分别支持80端口和443端口。这个URL是很重要的,需要响应微信发送的token验证
2、令牌(Token):必须为英文或数字,长度为3-32字符。上面说过做验证的
3、消息加解密密钥:可以直接随机生成
4、消息加解密方式:明文、兼容、安全 看业务需求选择:我觉得明文省事点(个人见解)
5、详解微信开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
三、如果一直用微信的接口调用,会有点麻烦
所以这边我就引用了 —》WxJava《—
github:https://github.com/Wechat-Group/WxJava
gitee:https://gitee.com/binary/weixin-java-tools
四、参数说明
先来看看官方文档对于推送模板消息参数说明:https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=438084880&lang=zh_CN
五、openId怎么拿? 不知道!那好吧,度娘一下、google一下,疑惑不就解决了!
六、template_id:模板Id;对于这个可以自己申请 or 选用已有的
任意选择一个进去添加模板就行了:
七、现在就开始,请大家详细的看看 WxJava 的文档
—先建立 SpringBoot 项目—
1、导入wxjava公众号 对应的pom
<!-- WxJava公众号 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.6.0</version>
</dependency>
2、配置公众号相关的信息了,在 .yml或者 .properties里面配置
wx:
appid: 11111
secret: 22222
token: 33333
aeskey: 44444
或者
wx.appid=123456789
wx.secret=123456789
wx.token=123456789
wx.aeskey=123456789
3、配置了这个就需要对应这个配置的Component了(实体类)
/**
* @ClassName WXProperties
* @Author 晓航仔
* @Date 2021/1/20 04:26
**/
@Data
@Component
@ConfigurationProperties(prefix = "wx")
public class WxMpProperties {
/**
* 公众号appId
*/
private String appId;
/**
* 公众号appSecret
*/
private String secret;
/**
* 公众号token
*/
private String token;
/**
* 公众号aesKey
*/
private String aesKey;
}
4、关于注解详情,看官方文档
SpringBoot:
https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config-yaml
Lombok:
https://projectlombok.org/features/all
-----------------------------JAVA源码 ---------Start-----------------------------
5、模板数据详情以及分析
刚刚选择的模板,这些key都一个一个参数,文档上面说的很明白,赋值替换就ok了。
6、继续查看 WxJava文档
根据上面的示例代码,写了个自测源码Demo
/**
* 微信消息推送
*
* @ClassName WxMsgPush
* @Author 晓航仔
* @Date 2021/1/20 05:29
**/
@Slf4j
@Component
public class WxMsgPush {
/**
* 微信公众号API的Service
*/
private final WxMpService wxMpService;
/**
* 构造注入
*/
WxMsgPush(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}
/**
* 发送微信模板信息
*
* @param openId 接受者openId
* @return 是否推送成功
*/
public Boolean SendWxMsg(String openId) {
// 发送模板消息接口
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
// 接收者openid
.toUser(openId)
// 模板id
.templateId("xxxxxxxxxx模板IDxxxxxxxxxxxxxxxxx")
// 模板跳转链接
.url("http://www.baidu.com")
.build();
// 添加模板数据
templateMessage.addData(new WxMpTemplateData("first", "您好", "#FF00FF"))
.addData(new WxMpTemplateData("keyword1", "这是个测试", "#A9A9A9"))
.addData(new WxMpTemplateData("keyword2", "这又是个测试", "#FF00FF"))
.addData(new WxMpTemplateData("remark", "这还是个测试", "#000000"));
String msgId = null;
try {
// 发送模板消息
msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
e.printStackTrace();
}
log.info("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
return msgId != null;
}
}
Could not autowire. No beans of ‘WxMpService’ type found. -------> 无法自动接线。找不到“ WxMpService”类型的bean
后来仔细研究了下,因为有多个实现类,我们需要自己写个config,把这个实现类@Bean注入
/**
* @ClassName WxConfig
* @Author 晓航仔
* @Date 2021/1/20 09:26
**/
@Configuration
public class WxConfig {
/**
* 声明实例
*
* @return
*/
@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
return wxMpService;
}
}
7、接下来,继续分析代码
首先这个
点进去瞅一眼有四个属性:
/**
* 接收者openid.
*/
private String toUser;
/**
* 模板ID.
*/
private String templateId;
/**
* 模板跳转链接.
* <pre>
* url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。
* 开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
* </pre>
*/
private String url;
/**
* 跳小程序所需数据,不需跳小程序可不用传该数据.
*
* @see #url
*/
private MiniProgram miniProgram;
8、注意一下这个方法:
//添加模板数据
templateMessage.addData(new WxMpTemplateData("first", first, "#FF00FF"))
.addData(new WxMpTemplateData("keyword1", keyword1, "#173177"))
.addData(new WxMpTemplateData("keyword2", keyword2, "#173177"))
.addData(new WxMpTemplateData("keyword3", keyword3, "#173177"))
.addData(new WxMpTemplateData("keyword4", keyword4, "#173177"))
.addData(new WxMpTemplateData("remark", remark, "#000000"));
该填充的值,需要跟你之前申请的模板那些key对应上,正常赋值的内容,以及对应的颜色比例。
9、最后一步:推送
try {
// 发送模板消息
msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
e.printStackTrace();
}
log.warn("·==++--·推送微信模板信息:{" + openId + "}·--++==·", msgId != null ? "成功" : "失败");
return msgId != null;
点进去
/**
* 返回模板消息相关接口方法的是实现对象,以方便调用其他各个接口
*
* return WxMpTemplateMsgService
*/
WxMpTemplateMsgService getTemplateMsgService();
再次点击进去
package me.chanjar.weixin.mp.api;
import java.util.List;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
/**
* @param var1 模板消息
* @return 消息ID
* @throws throws
*/
public interface WxMpTemplateMsgService {
String sendTemplateMsg(WxMpTemplateMessage var1) throws WxErrorException;
}
10、读取配置文件里面的信息
/**
* @ClassName WxConfig
* @Author 晓航仔
* @Date 2021/1/20 09:23
**/
@Configuration
public class WxConfig {
private final WxMpProperties wxMpProperties;
/**
* 构造注入
*
* @param wxMpProperties
*/
WxConfig(WxMpProperties wxMpProperties) {
this.wxMpProperties = wxMpProperties;
}
/**
* 微信客户端配置存储
*
* @return
*/
@Bean
public WxMpConfigStorage wxMpConfigStorage() {
es.getAesKey());
return configStorage;
}
/**
* 声明实例
*
* @return
*/
@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
}
}
11、开始测试吧。请自己建一个Controller
/**
* 微信消息推送
*/
private final WxMsgPush wxMsgPush;
/**
* 构造注入
*/
protected PushMsgApi(WxMsgPush wxMsgPush) {
this.wxMsgPush = wxMsgPush;
}
/**
* 发送微信模板消息
*/
@ApiOperation("发送微信模板消息")
@ApiImplicitParams({
@ApiImplicitParam(name = "openId", value = "接受者openId", dataType = "String", paramType = "query")
})
@PostMapping("/sendWxInfo")
public void sendWxInfo(String openId) {
// 执行发送
Boolean aBoolean = wxMsgPush.SendWxMsg(openId);
System.out.println(aBoolean);
}
-----------------------------JAVA源码 ---------End-----------------------------
附:springboot+maven实现跨域问题
@Component
public class CorsInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
{
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
response.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "86400");
response.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
// 如果是OPTIONS则结束请求
if (HttpMethod.OPTIONS.toString().equals(request.getMethod()))
{
response.setStatus(HttpStatus.OK.value());
return false;
}
return true;
}
}
Add上下两段代码组合
@Configuration
public class WebConfig implements WebMvcConfigurer
{
@Resource
private CorsInterceptor corsInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry)
{
// 跨域拦截器需放在最上面
registry.addInterceptor(corsInterceptor).addPathPatterns("/**");
}
}