首先申请一个公众号订阅号(个人测试账号)企业可申请服务号
在开发者工具里面申请一个测试账号
url 提供自己服务器地址+通信接口路由 或者在本人博客资源下载个natapp 内网穿透有工具 代理个http地址 我用的内网穿透
token 随便填一个主要用来跟微信服务器测试通信正常
//这个token要跟你填的一致
private static final String TOKEN = "1341321a2s1d23a1s454"
//下面方法就是上面url 里面的IP加路由
@GetMapping("check/token")
public String validate(String signature,String timestamp,String nonce,String echostr){
// 1. 将token、timestamp、nonce三个参数进行字典序排序
String[] arr = {timestamp, nonce, TOKEN};
Arrays.sort(arr);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
StringBuilder sb = new StringBuilder();
for (String temp : arr) {
sb.append(temp);
}
// 这里利用了hutool的加密工具类
String sha1 = SecureUtil.sha1(sb.toString());
// 3. 加密后的字符串与signature对比,如果相同则该请求来源于微信,原样返回echostr
if (sha1.equals(signature)){
return echostr;
}
// 接入失败
return null;
}
连接成功后配置订阅用户及模板
扫描二维码会得到用户的openId 一会发送消息用到 模板分为固定内容跟模板内容 1为固定内容 23为动态参数内容
接下来代码接入
pom引入
<!--微信模版消息推送三方sdk--> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.3.0</version> </dependency>
//这个sdk比较方便方法 接口路由都封装更好的 用起来更方便
下面代码环节
1实体
授权实体 就是测试号的账号 跟key
@Data
public class WxAuthorization {
private String appId;
private String appSecret;
}
2参数实体 就是发送需要的参数
@Data
public class WxMsgData {
// 接收人openId
private String receiver;
// 消息模板code
private String templateCode;
// 跳转url
private String url;
// 模板参数
private Map<String, Object> param;
}
调用
private void sendMsg(WxAuthorization wxAuthorization, WxMsgData wxMsgData) {
WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
wxStorage.setAppId(wxAuthorization.getAppId());
wxStorage.setSecret(wxAuthorization.getAppSecret());
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxStorage);
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(wxMsgData.getReceiver())
.templateId(wxMsgData.getTemplateCode())
.url(wxMsgData.getUrl())
.build();
if (wxMsgData.getParam()!=null) {
for (Map.Entry<String, Object> entry : wxMsgData.getParam().entrySet()) {
templateMessage.addData(new WxMpTemplateData(entry.getKey(), (String) entry.getValue(), "#173177"));
}
}
try {
String s = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
测试调用
@PostMapping("sendMessage")
public String handleMessage(){
WxAuthorization wxAuthorization = new WxAuthorization();
wxAuthorization.setAppId("wxce11edb1b0c5e158");
wxAuthorization.setAppSecret("62195d67ae1fa8b0b15aaaab47ce507c");
WxMsgData wxMsgData = new WxMsgData();
wxMsgData.setReceiver("oOM-e52ersdi7a4wZTOQHUQOwGuw");
wxMsgData.setTemplateCode("AYZc280-hh7QeO5eM8Usl7SlD5wzQ_I8tQq1e9HlmhQ");
wxMsgData.setUrl("https://www.baidu.com/");
Map<String,Object> map = new HashMap<>();
map.put("username","张三");
map.put("projectName","世纪广场");
map.put("deviceSN","10086");
wxMsgData.setParam(map);
sendMsg(wxAuthorization,wxMsgData);
return "success";
}
这个url ip 加端口必须是代理过的 或者服务器的 本地的不行
效果示例