Browse Source

【书记在线】【微信通知推送工具以及demo】

feature/dangjian
wanggongfeng 5 years ago
parent
commit
03104e2e52
  1. 13
      esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/TemplateData.java
  2. 35
      esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxAccessTokenBean.java
  3. 19
      esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxMssVo.java
  4. 12
      esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/controller/ApiMessageController.java
  5. 11
      esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/AdminFeignClient.java
  6. 5
      esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/fallback/AdminFeignClientFallback.java
  7. 9
      esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/MessageService.java
  8. 73
      esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/impl/MessageServiceImpl.java
  9. 94
      esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/utils/WxSendMessageUtils.java

13
esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/TemplateData.java

@ -0,0 +1,13 @@
package com.elink.esua.epdc.dto;
import lombok.Data;
/**
* @author wanggongfeng
* @date 2020/5/26 15:40
*/
@Data
public class TemplateData {
//keyword1:信息1,keyword2:信息2,keyword3:信息3,keyword4:信息4,keyword5:参数5
private String value;//,,依次排下去
}

35
esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxAccessTokenBean.java

@ -0,0 +1,35 @@
package com.elink.esua.epdc.dto;
/**
* 获取AccessToken
* @author wanggongfeng
* @date 2020/5/27 14:31
*/
public class WxAccessTokenBean {
private String access_token;
private int expires_in = -1;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public int getExpires_in() {
return expires_in;
}
public void setExpires_in(int expires_in) {
this.expires_in = expires_in;
}
@Override
public String toString() {
return "WxAccessTokenBean{" +
"access_token='" + access_token + '\'' +
", expires_in=" + expires_in +
'}';
}
}

19
esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxMssVo.java

@ -0,0 +1,19 @@
package com.elink.esua.epdc.dto;
import lombok.Data;
import java.util.Map;
/**
* @author wanggongfeng
* @date 2020/5/26 15:39
*/
@Data
public class WxMssVo {
private String touser;//用户openid
private String template_id;//模版id
private String page = "pages/index/index";//默认跳到小程序首页
private String miniprogram_state;// 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
private String lang = "zh_CN";// 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
private Map<String, TemplateData> data;//推送文字
}

12
esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/controller/ApiMessageController.java

@ -44,4 +44,16 @@ public class ApiMessageController {
public Result sendRegisterResult(String userId) { public Result sendRegisterResult(String userId) {
return messageService.sendRegisterResult(userId); return messageService.sendRegisterResult(userId);
} }
/**
* 小程序消息推送
*
* @return com.elink.esua.epdc.commons.tools.utils.Result
* @author wanggonfeng
* @date 2020/05/26 14:18
*/
@GetMapping("sendMessage")
public Result sendMessage() {
return messageService.sendMessage();
}
} }

11
esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/AdminFeignClient.java

@ -5,6 +5,7 @@ import com.elink.esua.epdc.commons.tools.utils.Result;
import com.elink.esua.epdc.dto.*; import com.elink.esua.epdc.dto.*;
import com.elink.esua.epdc.dto.epdc.GridLeaderRegisterDTO; import com.elink.esua.epdc.dto.epdc.GridLeaderRegisterDTO;
import com.elink.esua.epdc.dto.epdc.result.EpdcAppIndexPanelResultDTO; import com.elink.esua.epdc.dto.epdc.result.EpdcAppIndexPanelResultDTO;
import com.elink.esua.epdc.dto.epdc.result.UserWorkAndAnalyOpenIdDTO;
import com.elink.esua.epdc.feign.fallback.AdminFeignClientFallback; import com.elink.esua.epdc.feign.fallback.AdminFeignClientFallback;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -139,4 +140,14 @@ public interface AdminFeignClient {
*/ */
@GetMapping(value="sys/dept/getDeptTypeKey", consumes = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value="sys/dept/getDeptTypeKey", consumes = MediaType.APPLICATION_JSON_VALUE)
Result getDeptTypeKey(@RequestParam("deptId") Long deptId); Result getDeptTypeKey(@RequestParam("deptId") Long deptId);
/**
* 根据userid获取openId
*
* @return com.elink.esua.epdc.commons.tools.utils.Result<>
* @author wanggonfeng
* @date 2020/05/26 14:18
*/
@GetMapping("sys/user/userRelationWorkAndAnalyOpenId")
Result<UserWorkAndAnalyOpenIdDTO> userRelationWorkAndAnalyOpenId();
} }

5
esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/fallback/AdminFeignClientFallback.java

@ -73,4 +73,9 @@ public class AdminFeignClientFallback implements AdminFeignClient {
public Result getDeptTypeKey(Long deptId) { public Result getDeptTypeKey(Long deptId) {
return ModuleUtils.feignConError(ServiceConstant.EPDC_ADMIN_SERVER, "getDeptTypeKey",deptId); return ModuleUtils.feignConError(ServiceConstant.EPDC_ADMIN_SERVER, "getDeptTypeKey",deptId);
} }
@Override
public Result userRelationWorkAndAnalyOpenId() {
return ModuleUtils.feignConError(ServiceConstant.EPDC_ADMIN_SERVER, "userRelationWorkAndAnalyOpenId");
}
} }

9
esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/MessageService.java

@ -27,4 +27,13 @@ public interface MessageService {
* @date 2019/9/25 15:18 * @date 2019/9/25 15:18
*/ */
Result sendRegisterResult(String userId); Result sendRegisterResult(String userId);
/**
* 小程序消息推送
*
* @return com.elink.esua.epdc.commons.tools.utils.Result
* @author wanggonfeng
* @date 2020/05/26 14:18
*/
Result sendMessage();
} }

73
esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/impl/MessageServiceImpl.java

@ -5,13 +5,16 @@ import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
import com.elink.esua.epdc.commons.tools.redis.RedisKeys; import com.elink.esua.epdc.commons.tools.redis.RedisKeys;
import com.elink.esua.epdc.commons.tools.redis.RedisUtils; import com.elink.esua.epdc.commons.tools.redis.RedisUtils;
import com.elink.esua.epdc.commons.tools.utils.Result; import com.elink.esua.epdc.commons.tools.utils.Result;
import com.elink.esua.epdc.dto.TemplateData;
import com.elink.esua.epdc.dto.epdc.form.EpdcDeleteWxFormIdFormDTO; import com.elink.esua.epdc.dto.epdc.form.EpdcDeleteWxFormIdFormDTO;
import com.elink.esua.epdc.dto.epdc.result.EpdcUserRegisterAuditMsgResultDTO; import com.elink.esua.epdc.dto.epdc.result.EpdcUserRegisterAuditMsgResultDTO;
import com.elink.esua.epdc.enums.AppUserAuditStateEnum; import com.elink.esua.epdc.enums.AppUserAuditStateEnum;
import com.elink.esua.epdc.feign.AdminFeignClient;
import com.elink.esua.epdc.feign.MessageFeignClient; import com.elink.esua.epdc.feign.MessageFeignClient;
import com.elink.esua.epdc.feign.UserFeignClient; import com.elink.esua.epdc.feign.UserFeignClient;
import com.elink.esua.epdc.service.MessageService; import com.elink.esua.epdc.service.MessageService;
import com.elink.esua.epdc.utils.WxMaServiceUtils; import com.elink.esua.epdc.utils.WxMaServiceUtils;
import com.elink.esua.epdc.utils.WxSendMessageUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;
@ -19,7 +22,9 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author yujintao * @author yujintao
@ -36,6 +41,9 @@ public class MessageServiceImpl implements MessageService {
@Autowired @Autowired
private UserFeignClient userFeignClient; private UserFeignClient userFeignClient;
@Autowired
private AdminFeignClient adminFeignClient;
@Autowired @Autowired
private WxMaServiceUtils wxMaServiceUtils; private WxMaServiceUtils wxMaServiceUtils;
@ -141,4 +149,69 @@ public class MessageServiceImpl implements MessageService {
return new Result(); return new Result();
} }
/**
* 小程序消息推送
*
* @return com.elink.esua.epdc.commons.tools.utils.Result
* @author wanggonfeng
* @date 2020/05/26 14:18
*/
public Result sendMessage() {
// 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
String miniprogram_state = "trial";
// 模板ID
String template_id = "wagGg4eAeHu1N2N0o8Vhyan41Gr3DqFBD81o5Lv7XnQ";
// 用户openID
String openId = "oZCeb5TZc2oBwT4jHb0kDmQsN0Xw";
// 小程序跳转页
String page = "pages/index/index";
// 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
String lang = "zh_CN";
// appid
String appId = "wxfa4afaa2b5f9c876";
// secret
String secret = "7db9f049c78c9a6cafa673deebe8330d";
// 获取access_token
//String access_token = getAccess_token(APPID_NORMAL, jwtTokenProperties.getSecret());
String access_token = WxSendMessageUtils.getAccess_token(appId, secret);
// 拼接URL
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + access_token;
// 获取openID
/* Result<UserWorkAndAnalyOpenIdDTO> userIdsResult = adminFeignClient.userRelationWorkAndAnalyOpenId();
if(userIdsResult == null || userIdsResult.getData() == null){
return new Result().error("获取openid失败!");
}
// 调用获取openid接口
UserWorkAndAnalyOpenIdDTO userWorkAndAnalyOpenIdDTO = userIdsResult.getData();
List<String> analyOpenIdList = userWorkAndAnalyOpenIdDTO.getAnalyOpenIds();
List<String> workOpenIdList = userWorkAndAnalyOpenIdDTO.getWorkOpenIds();
for(int i = 0; i < analyOpenIdList.size() ; i++){
String analysisOpenId = analyOpenIdList.get(i);
sendMessageByOpenId(analysisOpenId,url,miniprogram_state);
}
for(int j = 0; j < workOpenIdList.size() ; j++){
String workOpenId = workOpenIdList.get(j);
sendMessageByOpenId(workOpenId,url,miniprogram_state);
}*/
// 配置模板内容
Map<String, TemplateData> m = new HashMap<>(5);
TemplateData keyword1 = new TemplateData();
keyword1.setValue("11111测试11111");
m.put("thing1", keyword1);
TemplateData keyword2 = new TemplateData();
keyword2.setValue("2019年10月1日");
m.put("time2", keyword2);
WxSendMessageUtils.sendMessageByOpenId(openId,url,miniprogram_state,template_id,m,lang);
return new Result().ok("消息推送成功!");
}
} }

94
esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/utils/WxSendMessageUtils.java

@ -0,0 +1,94 @@
package com.elink.esua.epdc.utils;
import com.elink.esua.epdc.dto.TemplateData;
import com.elink.esua.epdc.dto.WxAccessTokenBean;
import com.elink.esua.epdc.dto.WxMssVo;
import com.elink.esua.epdc.jwt.JwtTokenProperties;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
/**
* @Description 微信消息推送工具类
* @Author wanggongfeng
* @Date 2020/05/28 16:15
*/
@Slf4j
public class WxSendMessageUtils {
private static Logger logger = LoggerFactory.getLogger(WxSendMessageUtils.class);
private static RestTemplate restTemplate;
private ClientHttpRequestFactory factory;
@Autowired
public void setFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(15000);//ms
this.factory = factory;
}
@Autowired
public void setRestTemplate() {
this.restTemplate = new RestTemplate(this.factory);
}
@Value("${wx.ma.appId.normal}")
private String APPID_NORMAL;
// private String APPID_NORMAL = "${wx.ma.appId.normal}";
private String SECRET = "${rocketmq.producer.secret-key}";
@Autowired
private JwtTokenProperties jwtTokenProperties;
/**
*
* @param openId 用户openid
* @param url 接口路径
* @param miniprogram_state 跳转小程序类型developer为开发版trial为体验版formal为正式版默认为正式版
* @param template_id 模板ID
* @param m 模板内容: thing 20字以内汉字数字字母符号
* number 32位以内可带小数
* letter 32位以内只能是字母
* time 24制时间格式支持+年月日eg:15:03 2020年5月28日
* 其他可查https://blog.csdn.net/css_666/article/details/103513916
* @param lang 进入小程序查看的语言类型支持zh_CN(简体中文)en_US(英文)zh_HK(繁体中文)zh_TW(繁体中文)默认为zh_CN
* @author wanggonfeng
* @date 2020/05/26 14:18
*/
public static void sendMessageByOpenId(String openId, String url, String miniprogram_state, String template_id, Map<String, TemplateData> m,String lang){
//拼接推送的模版
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTouser(openId);//用户openid
wxMssVo.setTemplate_id(template_id);//模版id
wxMssVo.setMiniprogram_state(miniprogram_state);
wxMssVo.setData(m);
wxMssVo.setLang(lang);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class);
log.error("小程序推送结果={}", responseEntity.getBody());
}
/**
* 获取access_token
* @param appid
* @param appsecret
* @return
* @author wanggonfeng
* @date 2020/05/26 14:18
*/
public static String getAccess_token(String appid, String appsecret) {
// 获取access_token
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" + "&appid=" + appid + "&secret=" + appsecret;
String json = restTemplate.getForObject(url, String.class);
WxAccessTokenBean accessToken = new Gson().fromJson(json, WxAccessTokenBean.class);
return accessToken.getAccess_token();
}
}
Loading…
Cancel
Save