WeChatUtil.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package com.xjrsoft.common.utils;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.extra.spring.SpringUtil;
  4. import cn.hutool.http.HttpUtil;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.xjrsoft.common.enums.WeChatType;
  8. import com.xjrsoft.module.organization.dto.WeChatDepartDto;
  9. import com.xjrsoft.module.organization.dto.WeChatUserDto;
  10. import com.xjrsoft.module.system.vo.WeChatUserInfo;
  11. import lombok.Data;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.stereotype.Component;
  15. import java.io.UnsupportedEncodingException;
  16. import java.security.MessageDigest;
  17. import java.security.NoSuchAlgorithmException;
  18. import java.util.Formatter;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.UUID;
  22. @Component
  23. @Data
  24. @Slf4j
  25. public class WeChatUtil {
  26. @Value("${xjrsoft.enterpriseWeChat.corpid}")
  27. public String appKey;
  28. @Value("${xjrsoft.enterpriseWeChat.secret}")
  29. public String appSecret;
  30. @Value("${xjrsoft.enterpriseWeChat.secret1}")
  31. public String appSecret1;
  32. @Value("${xjrsoft.enterpriseWeChat.agentid}")
  33. public Integer agentid;
  34. @Value("${xjrsoft.mpWeChat.appKey}")
  35. public String mpAppKey;
  36. @Value("${xjrsoft.mpWeChat.appSecret}")
  37. public String mpAppSecret;
  38. @Value("${xjrsoft.appletWeChat.appKey}")
  39. public String appletAppKey;
  40. @Value("${xjrsoft.appletWeChat.appSecret}")
  41. public String appletAppSecret;
  42. @Value("${xjrsoft.weChatMessageTemplate.commonTemplate}")
  43. public String commonTemplate;
  44. @Value("${xjrsoft.weChatMessageTemplate.assessmentTemplate}")
  45. public String assessmentTemplate;
  46. //公众号获取Openid
  47. public WeChatUserInfo getMpOpenid(String code) {
  48. HashMap<String, Object> paramMap = new HashMap<>();
  49. paramMap.put("appid", mpAppKey);
  50. paramMap.put("secret", mpAppSecret);
  51. paramMap.put("code", code);
  52. paramMap.put("grant_type", "authorization_code");
  53. String result = HttpUtil.get("https://api.weixin.qq.com/sns/oauth2/access_token", paramMap);
  54. JSONObject jsonObject = JSONObject.parseObject(result);
  55. if (jsonObject.containsKey("errcode")) {
  56. //throw new MyException(result);
  57. return null;
  58. }
  59. return jsonObject.toJavaObject(WeChatUserInfo.class);
  60. }
  61. // 小程序
  62. public WeChatUserInfo getOpenid(String code) {
  63. HashMap<String, Object> paramMap = new HashMap<>();
  64. paramMap.put("appid", appletAppKey);
  65. paramMap.put("secret", appletAppSecret);
  66. paramMap.put("js_code", code);
  67. paramMap.put("grant_type", "authorization_code");
  68. String result = HttpUtil.get("https://api.weixin.qq.com/sns/jscode2session", paramMap);
  69. JSONObject jsonObject = JSONObject.parseObject(result);
  70. if (jsonObject.containsKey("errcode")) {
  71. //throw new MyException(result);
  72. return null;
  73. }
  74. return jsonObject.toJavaObject(WeChatUserInfo.class);
  75. }
  76. //获取通讯录或发消息token
  77. public String getToken(WeChatType type) {
  78. HashMap<String, Object> paramMap = new HashMap<>();
  79. String url = "https://api.weixin.qq.com/cgi-bin/token";
  80. String key = "";
  81. if (WeChatType.WEMINI == type) {
  82. url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
  83. paramMap.put("corpsecret", appSecret);
  84. paramMap.put("corpid", appKey);
  85. key = String.format("access_token_%s",appKey);
  86. } else if (WeChatType.WEWEB == type) {
  87. paramMap.put("grant_type", "client_credential");
  88. paramMap.put("appid", mpAppKey);
  89. paramMap.put("secret", mpAppSecret);
  90. key = String.format("access_token_%s",mpAppKey);
  91. }
  92. // 判断redis中token是否过期
  93. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  94. String accessToken = redisUtil.get(key);
  95. if (StrUtil.isNotBlank(accessToken) && !accessToken.equals("null")) {
  96. return accessToken;
  97. }
  98. String result = HttpUtil.get(url, paramMap);
  99. JSONObject jsonObject = JSONObject.parseObject(result);
  100. String token = jsonObject.get("access_token").toString();
  101. // 缓存1小时
  102. redisUtil.set(key,token,3600);
  103. return token;
  104. }
  105. //根据所有部门信息
  106. public List<WeChatDepartDto> getDepartmentList(Long dept_id) {
  107. String token = this.getToken(WeChatType.WEMINI);
  108. HashMap<String, Object> paramMap = new HashMap<>();
  109. paramMap.put("access_token", token);
  110. if (dept_id != null) {
  111. paramMap.put("id", dept_id);
  112. }
  113. String result = HttpUtil.get("https://qyapi.weixin.qq.com/cgi-bin/department/list", paramMap);
  114. JSONObject jsonObject = JSONObject.parseObject(result);
  115. Object department = jsonObject.get("department");
  116. List<WeChatDepartDto> weChatDepartDtos = JSONObject.parseArray(department.toString(), WeChatDepartDto.class);
  117. return weChatDepartDtos;
  118. }
  119. //获取部门的所有用户信息
  120. public List<WeChatUserDto> getDepartmentUser(Long dept_id) {
  121. String token = this.getToken(WeChatType.WEMINI);
  122. HashMap<String, Object> paramMap = new HashMap<>();
  123. paramMap.put("access_token", token);
  124. paramMap.put("department_id", dept_id);
  125. paramMap.put("fetch_child", 1);
  126. String result = HttpUtil.get("https://qyapi.weixin.qq.com/cgi-bin/user/list", paramMap);
  127. JSONObject jsonObject = JSONObject.parseObject(result);
  128. Object department = jsonObject.get("userlist");
  129. List<WeChatUserDto> weChatUserDtos = JSONObject.parseArray(department.toString(), WeChatUserDto.class);
  130. return weChatUserDtos;
  131. }
  132. //公众号发送文本消息给用户
  133. public Boolean sendMessage(String content, String userId) {
  134. String token = this.getToken(WeChatType.WEWEB);
  135. JSONObject object = new JSONObject();
  136. JSONArray touser=new JSONArray();
  137. touser.add(userId);
  138. object.put("touser", touser);
  139. object.put("msgtype", "text");
  140. JSONObject text = new JSONObject();
  141. text.put("content", content);
  142. object.put("text",text);
  143. String result = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token="+token, JSONObject.toJSONString(object));
  144. System.out.printf(result);
  145. return true;
  146. }
  147. //{
  148. // "touser":"OPENID",
  149. // "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
  150. // "url":"http://weixin.qq.com/download",
  151. // "miniprogram":{
  152. // "appid":"xiaochengxuappid12345",
  153. // "pagepath":"index?foo=bar"
  154. // },
  155. // "client_msg_id":"MSG_000001",
  156. // "data":{
  157. // "keyword1":{
  158. // "value":"巧克力"
  159. // },
  160. // "keyword2": {
  161. // "value":"39.8元"
  162. // },
  163. // "keyword3": {
  164. // "value":"2014年9月22日"
  165. // }
  166. // }
  167. // }
  168. public Boolean sendTemplateMessage(JSONObject object){
  169. String active = SpringUtil.getActiveProfile();
  170. if(!"prod".equals(active)){
  171. log.info("非正式环境,无法执行数据推送");
  172. return false;
  173. }
  174. String token = this.getToken(WeChatType.WEWEB);
  175. String result = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token, JSONObject.toJSONString(object));
  176. System.out.printf(result);
  177. return true;
  178. }
  179. public String getTicket(String type) {
  180. String token = this.getToken(WeChatType.WEWEB);
  181. HashMap<String, Object> paramMap = new HashMap<>();
  182. paramMap.put("access_token", token);
  183. paramMap.put("type", type);
  184. String result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/ticket/getticket", paramMap);
  185. JSONObject jsonObject = JSONObject.parseObject(result);
  186. if (jsonObject.containsKey("ticket")) {
  187. //throw new MyException(result);
  188. return jsonObject.get("ticket").toString();
  189. } else {
  190. return "";
  191. }
  192. }
  193. public HashMap<String, Object> SdkSign(String url,String type) throws Exception {
  194. String nonceStr = UUID.randomUUID().toString();
  195. String timestamp = Long.toString(System.currentTimeMillis() / 1000);
  196. String signature = "";
  197. String jsapiTicket = getTicket(type);
  198. String string1 = "jsapi_ticket=" + jsapiTicket +
  199. "&noncestr=" + nonceStr +
  200. "&timestamp=" + timestamp +
  201. "&url=" + url;
  202. try {
  203. MessageDigest crypt = MessageDigest.getInstance("SHA-1");
  204. crypt.reset();
  205. crypt.update(string1.getBytes("UTF-8"));
  206. signature = byteToHex(crypt.digest());
  207. HashMap<String, Object> resultMap = new HashMap<>();
  208. resultMap.put("url",url);
  209. // resultMap.put("jsapi_ticket",jsapiTicket);
  210. resultMap.put("nonceStr",nonceStr);
  211. resultMap.put("timestamp",timestamp);
  212. resultMap.put("signature",signature);
  213. return resultMap;
  214. } catch (NoSuchAlgorithmException e) {
  215. e.printStackTrace();
  216. } catch (UnsupportedEncodingException e) {
  217. e.printStackTrace();
  218. }
  219. return null;
  220. }
  221. private String byteToHex(final byte[] hash) {
  222. Formatter formatter = new Formatter();
  223. for (byte b : hash) {
  224. formatter.format("%02x", b);
  225. }
  226. String result = formatter.toString();
  227. formatter.close();
  228. return result;
  229. }
  230. }