赞
踩
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
六、template_id:模板Id;对于这个可以自己申请 or 选用已有的
任意选择一个进去添加模板就行了:
—先建立 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
/** * @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; }
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-----------------------------
刚刚选择的模板,这些key都一个一个参数,文档上面说的很明白,赋值替换就ok了。
根据上面的示例代码,写了个自测源码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; } }
首先这个
点进去瞅一眼有四个属性:
/** * 接收者openid. */ private String toUser; /** * 模板ID. */ private String templateId; /** * 模板跳转链接. * <pre> * url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。 * 开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。 * </pre> */ private String url; /** * 跳小程序所需数据,不需跳小程序可不用传该数据. * * @see #url */ private MiniProgram miniProgram;
//添加模板数据
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对应上,正常赋值的内容,以及对应的颜色比例。
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; }
/** * @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() { WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl(); // 公众号appId configStorage.setAppId(wxMpProperties.getAppId()); // 公众号appSecret configStorage.setSecret(wxMpProperties.getSecret()); // 公众号Token configStorage.setToken(wxMpProperties.getToken()); // 公众号EncodingAESKey configStorage.setAesKey(wxMpProperties.getAesKey()); return configStorage; } /** * 声明实例 * * @return */ @Bean public WxMpService wxMpService() { WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxMpConfigStorage()); return wxMpService; } }
/** * 微信消息推送 */ 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("/**");
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。