diff --git a/esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/TemplateData.java b/esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/TemplateData.java new file mode 100644 index 000000000..2eff3a925 --- /dev/null +++ b/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;//,,依次排下去 +} diff --git a/esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxAccessTokenBean.java b/esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxAccessTokenBean.java new file mode 100644 index 000000000..5534524ef --- /dev/null +++ b/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 + + '}'; + } +} diff --git a/esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxMssVo.java b/esua-epdc/epdc-commons/epdc-commons-tools-wx-ma/src/main/java/com/elink/esua/epdc/dto/WxMssVo.java new file mode 100644 index 000000000..f30afad86 --- /dev/null +++ b/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 data;//推送文字 +} diff --git a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/controller/ApiMessageController.java b/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/controller/ApiMessageController.java index c38b3b255..8e6fffd0b 100644 --- a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/controller/ApiMessageController.java +++ b/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) { 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(); + } } diff --git a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/AdminFeignClient.java b/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/AdminFeignClient.java index 2774411ea..e76b06904 100644 --- a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/AdminFeignClient.java +++ b/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.epdc.GridLeaderRegisterDTO; 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 org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; @@ -139,4 +140,14 @@ public interface AdminFeignClient { */ @GetMapping(value="sys/dept/getDeptTypeKey", consumes = MediaType.APPLICATION_JSON_VALUE) 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 userRelationWorkAndAnalyOpenId(); } diff --git a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/fallback/AdminFeignClientFallback.java b/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/fallback/AdminFeignClientFallback.java index e7d466dee..69aadeefc 100644 --- a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/feign/fallback/AdminFeignClientFallback.java +++ b/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) { return ModuleUtils.feignConError(ServiceConstant.EPDC_ADMIN_SERVER, "getDeptTypeKey",deptId); } + + @Override + public Result userRelationWorkAndAnalyOpenId() { + return ModuleUtils.feignConError(ServiceConstant.EPDC_ADMIN_SERVER, "userRelationWorkAndAnalyOpenId"); + } } diff --git a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/MessageService.java b/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/MessageService.java index 3f361af47..f0dfcf450 100644 --- a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/MessageService.java +++ b/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 */ Result sendRegisterResult(String userId); + + /** + * 小程序消息推送 + * + * @return com.elink.esua.epdc.commons.tools.utils.Result + * @author wanggonfeng + * @date 2020/05/26 14:18 + */ + Result sendMessage(); } diff --git a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/impl/MessageServiceImpl.java b/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/impl/MessageServiceImpl.java index ee2f611b9..3aba3750b 100644 --- a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/service/impl/MessageServiceImpl.java +++ b/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.RedisUtils; 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.result.EpdcUserRegisterAuditMsgResultDTO; 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.UserFeignClient; import com.elink.esua.epdc.service.MessageService; import com.elink.esua.epdc.utils.WxMaServiceUtils; +import com.elink.esua.epdc.utils.WxSendMessageUtils; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; 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.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author yujintao @@ -36,6 +41,9 @@ public class MessageServiceImpl implements MessageService { @Autowired private UserFeignClient userFeignClient; + @Autowired + private AdminFeignClient adminFeignClient; + @Autowired private WxMaServiceUtils wxMaServiceUtils; @@ -141,4 +149,69 @@ public class MessageServiceImpl implements MessageService { 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 userIdsResult = adminFeignClient.userRelationWorkAndAnalyOpenId(); + if(userIdsResult == null || userIdsResult.getData() == null){ + return new Result().error("获取openid失败!"); + } + // 调用获取openid接口 + UserWorkAndAnalyOpenIdDTO userWorkAndAnalyOpenIdDTO = userIdsResult.getData(); + List analyOpenIdList = userWorkAndAnalyOpenIdDTO.getAnalyOpenIds(); + List 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 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("消息推送成功!"); + } + + + } diff --git a/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/utils/WxSendMessageUtils.java b/esua-epdc/epdc-module/epdc-api/epdc-api-server/src/main/java/com/elink/esua/epdc/utils/WxSendMessageUtils.java new file mode 100644 index 000000000..f265bad2a --- /dev/null +++ b/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 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 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(); + } +}