CommonHelper.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package com.wechat.common;
  2. import java.io.UnsupportedEncodingException;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. import javax.servlet.http.HttpServletRequest;
  8. import org.apache.commons.logging.Log;
  9. import org.apache.commons.logging.LogFactory;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.stereotype.Component;
  12. import com.auth0.jwt.JWT;
  13. import com.auth0.jwt.algorithms.Algorithm;
  14. import com.auth0.jwt.exceptions.JWTCreationException;
  15. import com.wechat.activerequests.responses.MessageIdResponse;
  16. import com.wechat.common.utils.AESUtil;
  17. import com.wechat.common.utils.JacksonUtils;
  18. import com.wechat.common.utils.MessageUtils;
  19. import com.wechat.common.utils.NetworkUtils;
  20. import com.wechat.common.utils.NumberUtils;
  21. import com.wechat.common.utils.StringsUtils;
  22. import com.wechat.model.dbEntity.MdeLoginHis;
  23. import com.wechat.model.requestDto.TMsgSendBaseReq;
  24. import com.wechat.service.WeiXinService;
  25. import nl.basjes.parse.useragent.UserAgent;
  26. import nl.basjes.parse.useragent.UserAgentAnalyzer;
  27. /**
  28. * The common method shared in all project
  29. *
  30. * @author Administrator
  31. */
  32. @Component
  33. public class CommonHelper {
  34. // url根目录
  35. @Value("#{configProperties['hostPort']}")
  36. private String urlBase;
  37. // 模板消息发送用url
  38. @Value("#{configProperties['weixin.tmsg.send']}")
  39. private String tmsgSendUrl;
  40. // token过期时间
  41. @Value("#{configProperties['token.expire.minute']}")
  42. private String tokenExpireTime;
  43. private static final Log log = LogFactory.getLog(CommonHelper.class);
  44. public String getIRealIPAddr(HttpServletRequest request) {
  45. String ip = request.getHeader("x-forwarded-for");
  46. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || "null".equalsIgnoreCase(ip)) {
  47. ip = request.getHeader("Proxy-Client-IP");
  48. }
  49. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || "null".equalsIgnoreCase(ip)) {
  50. ip = request.getHeader("WL-Proxy-Client-IP");
  51. }
  52. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || "null".equalsIgnoreCase(ip)) {
  53. ip = request.getRemoteAddr();
  54. }
  55. // 如果通过多级反向代理,X-Forwarded-For的值不止一个,而是一串用逗号分隔的IP值,此时取X-Forwarded-For中第一个非unknown的有效IP字符串
  56. if ((ip.indexOf(",") > -1)) {
  57. ip = ip.split(",")[0];
  58. }
  59. return ip;
  60. }
  61. /**
  62. * 验证是否是手机号码
  63. *
  64. * @param mobile
  65. * @return
  66. */
  67. public boolean isMobile(String mobile) {
  68. Pattern p = null;
  69. Matcher m = null;
  70. p = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$"); // 验证手机号
  71. m = p.matcher(mobile);
  72. return m.matches();
  73. }
  74. /**
  75. * 取得完整的图片访问url
  76. *
  77. * @param mobile
  78. * @return
  79. */
  80. public String getImgUrl(String urlChild) {
  81. return urlBase + urlChild;
  82. }
  83. /**
  84. * 模板消息推送
  85. *
  86. * @param keyWord
  87. * 用户发送的信息
  88. * @return
  89. */
  90. public String send(TMsgSendBaseReq req) {
  91. String url = MessageUtils.getText(tmsgSendUrl, WeiXinService.getInstance().getAccessToken());
  92. MessageIdResponse response = NetworkUtils.getRemoteResponseAsJson(url, req, MessageIdResponse.class);
  93. log.debug("Responded: " + JacksonUtils.beautifulSerialize(response));
  94. // 模板消息推送出错
  95. if (!StringsUtils.isEqual(Constants.STR_OK, Long.toString(response.getErrorCode()))) {
  96. log.error("模板消息推送异常:ErrorMsg=" + response.getErrorMsg() + "; ErrorCode=" + response.getErrorCode()
  97. + "; MessageId=" + response.getMessageId());
  98. // 40001 的情况下强制重取token
  99. if (StringsUtils.isEqual(Constants.STR_TOKEN_ERO, Long.toString(response.getErrorCode()))) {
  100. WeiXinService.getInstance().updAccessTokenInfo();
  101. url = MessageUtils.getText(tmsgSendUrl, WeiXinService.getInstance().getAccessToken());
  102. }
  103. // 重新发送
  104. response = NetworkUtils.getRemoteResponseAsJson(url, req, MessageIdResponse.class);
  105. log.error("模板消息重发:ErrorMsg=" + response.getErrorMsg() + "; ErrorCode=" + response.getErrorCode()
  106. + "; MessageId=" + response.getMessageId());
  107. }
  108. return response.getErrorCode().toString();
  109. }
  110. /**
  111. * token生成
  112. *
  113. * @param userCode 用户code
  114. * @param req
  115. * @param identityFlag 个人企业区分
  116. * @param creatDate 用户注册日期
  117. * @return
  118. * @throws IllegalArgumentException
  119. * @throws JWTCreationException
  120. * @throws UnsupportedEncodingException
  121. */
  122. public String getToken(String userCode, String identityFlag, String creatDate)
  123. throws IllegalArgumentException, JWTCreationException, UnsupportedEncodingException {
  124. Calendar calendar = Calendar.getInstance();
  125. calendar.add(Calendar.MINUTE, NumberUtils.stringToInt(tokenExpireTime, 120));
  126. // 生成token 用户code拼上随机字符串进行md5加密
  127. String token = JWT.create().withClaim(Constants.TOKEN_USER_ID, userCode).withClaim(Constants.TOKEN_IDENTITY_FLAG, identityFlag).withClaim(Constants.TOKEN_CREATDATE, creatDate).withExpiresAt(calendar.getTime())
  128. .sign(Algorithm.HMAC512(Constants.TOKEN_KEY));
  129. return token;
  130. }
  131. /**
  132. * ActivationToken生成 邮箱激活token
  133. *
  134. * @param userCode
  135. * 用户code
  136. * @return token
  137. * @throws UnsupportedEncodingException
  138. * @throws JWTCreationException
  139. * @throws IllegalArgumentException
  140. */
  141. public String getActivationToken(String userCode)
  142. throws IllegalArgumentException, JWTCreationException, UnsupportedEncodingException {
  143. Calendar calendar = Calendar.getInstance();
  144. calendar.add(Calendar.DAY_OF_YEAR, 5);
  145. // 生成token 用户code拼上随机字符串进行md5加密
  146. String token = JWT.create().withClaim(Constants.ACTIVATION_TOKEN, userCode).withExpiresAt(calendar.getTime())
  147. .sign(Algorithm.HMAC512(Constants.TOKEN_KEY));
  148. return token;
  149. }
  150. /**
  151. * 获取客户端信息
  152. * @param request
  153. * @return
  154. */
  155. public MdeLoginHis getDeviceType(HttpServletRequest request) {
  156. MdeLoginHis his = new MdeLoginHis();
  157. String agentString = request.getHeader("User-Agent");
  158. UserAgentAnalyzer a = UserAgentAnalyzer.newBuilder().hideMatcherLoadStats().delayInitialization().build();
  159. UserAgent userAgent = a.parse(agentString);
  160. // 浏览器信息
  161. his.setBrowser(userAgent.getValue(UserAgent.AGENT_NAME));
  162. his.setBrowserVersion(userAgent.getValue(UserAgent.AGENT_NAME_VERSION));
  163. his.setIp(getIRealIPAddr(request));
  164. // 设备信息
  165. String deviceName = userAgent.getValue(UserAgent.DEVICE_NAME);
  166. String lower = agentString.toLowerCase();
  167. if(lower.contains("devtool") || lower.contains("postman") || lower.contains("request") || lower.contains("debug") || lower.contains("api")) {
  168. deviceName = "IT人员!";
  169. }
  170. his.setOperating(deviceName);
  171. // 设备类型
  172. his.setDeviceClass(userAgent.getValue(UserAgent.DEVICE_CLASS));
  173. // 操作系统信息
  174. his.setSystem(userAgent.getValue(UserAgent.OPERATING_SYSTEM_NAME_VERSION));
  175. his.setRemarks(agentString);
  176. return his;
  177. }
  178. /**
  179. * 根据shareJob 获取jobid
  180. * @param request
  181. * @return
  182. */
  183. public int getJobId(String shareJob) {
  184. String jobId = shareJob.substring(10);
  185. return NumberUtils.stringToInt(jobId, 0);
  186. }
  187. /**
  188. * 获取分享用-用户code
  189. * Aes加密
  190. * @param request
  191. * @return
  192. */
  193. public String getShareCodeAes(String userCode, Date creatTime) {
  194. String shareCode = AESUtil.encrypt(userCode+Constants.UNDER_LINE+String.valueOf(creatTime.getTime()), Constants.AES_PASSWORD);
  195. return shareCode;
  196. }
  197. /**
  198. * 获取分享用-用户code
  199. * Aes解密
  200. * @param request
  201. * @return
  202. */
  203. public String[] getUserCodeAes(String shareCode) {
  204. /*
  205. * try { shareCode = URLDecoder.decode(shareCode,"utf-8"); } catch
  206. * (UnsupportedEncodingException e) { // TODO Auto-generated catch block
  207. * e.printStackTrace(); }
  208. */
  209. String shareCodeStr = AESUtil.decryptStr(shareCode, Constants.AES_PASSWORD);
  210. return shareCodeStr.split(Constants.UNDER_LINE);
  211. }
  212. }