From aa241a47c90ed776062adf0b8daccf288a21836f Mon Sep 17 00:00:00 2001 From: liujie <liujie> Date: 星期四, 10 八月 2023 09:55:54 +0800 Subject: [PATCH] 合并代码 --- driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java | 415 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 415 insertions(+), 0 deletions(-) diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java new file mode 100644 index 0000000..6a9780c --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java @@ -0,0 +1,415 @@ +package com.supersavedriving.driver.modular.system.util.weChat; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.supersavedriving.driver.core.util.ToolUtil; +import com.supersavedriving.driver.modular.system.util.RedisUtil; +import com.supersavedriving.driver.modular.system.util.UUIDUtil; +import com.supersavedriving.driver.modular.system.util.httpClinet.HttpClientUtil; +import com.supersavedriving.driver.modular.system.util.httpClinet.HttpResult; +import com.supersavedriving.driver.modular.system.util.weChat.model.Code2Session; +import org.apache.commons.codec.digest.DigestUtils; +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.*; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +/** + * 微信工具类 + */ +@Component +public class WeChatUtil { + + private static Logger logger = LoggerFactory.getLogger(WeChatUtil.class); + + @Value("${wx.appletsAppid}") + private String wxAppletsAppid; + + @Value("${wx.appletsAppSecret}") + private String wxAppletsAppSecret; + + @Value("${wx.officialAccountAppid}") + private String officialAccountAppid; + + @Value("{wx.officialAccountAppSecret}") + private String officialAccountAppSecret; + + @Value("${wx.appid}") + private String webAppId; + + @Value("${wx.appSecret}") + private String webAppSecret; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private RedisUtil redisUtil; + + + + { + new Thread(new Runnable() { + @Override + public void run() { + try { +// Thread.sleep(30000); +// new Timer().schedule(new TimerTask() { +// @Override +// public void run() { +// try { +// String wxAppletsAccessToken = getWxAppletsAccessToken(); +// if(ToolUtil.isEmpty(wxAppletsAccessToken)){ +// System.err.println("获取微信小程序access_token失败"); +// return; +// } +// redisUtil.setStrValue("wxAppletsAccessToken", wxAppletsAccessToken, 7000); +// }catch (Exception e){ +// e.printStackTrace(); +// } +// } +// }, 0, 7000000); + }catch (Exception e){ + e.printStackTrace(); + } + } + }).start(); + + } + + + /** + * 小程序使用jscode获取openid + * @param jscode + * @return + */ + public Code2Session code2Session(String jscode) throws Exception{ + String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret + + "&js_code=" + jscode + "&grant_type=authorization_code"; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form"); + if(null == httpResult || httpResult.getCode() != 200){ + return null; + } + Code2Session code2Session = JSON.parseObject(httpResult.getData(), Code2Session.class); + return code2Session; + } + + + /** + * 获取微信小程序token + * @return + */ + public String getWxAppletsAccessToken() throws Exception{ + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form"); + if(httpResult.getCode() != 200){ + return ""; + } + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + return jsonObject.getString("access_token"); + } + + + /*** + * 获取jsapiTicket(小程序) + * 来源 www.vxzsk.com + * @return + */ + public String getWxAppletsJSApiTicket() throws Exception{ + String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken"); + String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + wxAppletsAccessToken + "&type=jsapi"; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", urlStr, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + logger.debug(httpResult.getData()); + String ticket = JSONObject.parseObject(httpResult.getData()).getString("ticket"); + return ticket; + } + + /** + * 通过config接口注入权限验证配置(小程序) + * 附录1-JS-SDK使用权限签名算法, + * @return + */ + public Map<String,Object> getWxAppletsSignatureConfig(String url) throws Exception{ + //获取token + try { + url = URLDecoder.decode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + String ticket = getWxAppletsJSApiTicket(); + String noncestr = UUIDUtil.getRandomCode(); + Long timestamp = System.currentTimeMillis(); + String content = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; + String signature = DigestUtils.sha1Hex(content); + Map<String,Object> map=new HashMap<>(); + map.put("appId", wxAppletsAppid); + map.put("timestamp", timestamp); + map.put("nonceStr", noncestr); + map.put("signature", signature); + return map; + } + + + + /** + * 网站应用登录 + * @param code + * @return + */ + public Map<String, String> webAccessToken(String code) throws Exception{ + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + webAppId + "&secret=" + webAppSecret + "&code=" + code + "&grant_type=authorization_code"; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + int errcode = jsonObject.getIntValue("errcode"); + Map<String, String> map = new HashMap<>(); + if(errcode == 0){//成功 + map.put("access_token", jsonObject.getString("access_token")); + map.put("openid", jsonObject.getString("openid")); + map.put("refresh_token", jsonObject.getString("refresh_token")); + map.put("unionid", jsonObject.getString("unionid")); + return map; + } + if(errcode == -1){//系统繁忙,此时请开发者稍候再试 + map.put("msg", jsonObject.getString("errmsg")); + return map; + } + if(errcode == 40029){//code 无效 + map.put("msg", jsonObject.getString("errmsg")); + return map; + } + if(errcode == 45011){//频率限制,每个用户每分钟100次 + map.put("msg", jsonObject.getString("errmsg")); + return map; + } + return map; + } + + + /** + * 获取微信个人信息 + * @param access_token + * @param openid + * @return + */ + public Map<String, Object> getUserInfo(String access_token, String openid) throws Exception{ + String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + JSONObject jsonObject = JSON.parseObject(httpResult.getData()); + int errcode = jsonObject.getIntValue("errcode"); + Map<String, Object> map = new HashMap<>(); + if(errcode == 0){//成功 + map.put("nickname", jsonObject.getString("nickname")); + map.put("openid", jsonObject.getString("openid")); + map.put("sex", jsonObject.getString("sex")); + map.put("headimgurl", jsonObject.getString("headimgurl")); + return map; + } + if(errcode == -1){//系统繁忙,此时请开发者稍候再试 + map.put("msg", jsonObject.getString("errmsg")); + return map; + } + if(errcode == 40029){//code 无效 + map.put("msg", jsonObject.getString("errmsg")); + return map; + } + if(errcode == 45011){//频率限制,每个用户每分钟100次 + map.put("msg", jsonObject.getString("errmsg")); + return map; + } + return map; + } + + + /** + * 公众号获取openid + * @param code + * @return + */ + public Map<String,Object> getOpenId(String code) throws Exception{ + if (code == null || code.length() == 0) { + return null; + } + String grantType = "authorization_code"; + String params = "appid=" + officialAccountAppid + "&secret=" + officialAccountAppSecret + "&code=" + code + "&grant_type=" + grantType; + logger.debug("sssss"+params); + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", "https://api.weixin.qq.com/sns/oauth2/access_token?" + params, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + JSONObject json = JSON.parseObject(httpResult.getData()); + logger.debug(json.toJSONString()); + String openId = json.get("openid").toString(); + String accessToken = json.get("access_token").toString(); + Integer expiresIn = json.getInteger("expires_in"); + String refresh_token = json.getString("refresh_token"); + String unionid = json.getString("unionid"); + Map<String,Object> map=new HashMap<>(); + map.put("openId",openId); + map.put("accessToken",accessToken); + map.put("expiresIn", expiresIn); + map.put("refreshToken", refresh_token); + map.put("unionid", unionid); + return map; + } + + + /*** + * 获取acess_token (公众号) + * 来源www.vxzsk.com + * @return + */ + public String getAccessToken() throws Exception{ + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + officialAccountAppid + + "&secret=" + officialAccountAppSecret; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + String accessToken = JSONObject.parseObject(httpResult.getData()).getString("access_token"); + return accessToken; + } + + /*** + * 获取jsapiTicket(公众号) + * 来源 www.vxzsk.com + * @return + */ + public String getJSApiTicket() throws Exception{ + //获取token + String acess_token = redisUtil.getValue("acess_token"); + String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + acess_token + "&type=jsapi"; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", urlStr, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + logger.debug(httpResult.getData()); + String ticket = JSONObject.parseObject(httpResult.getData()).getString("ticket"); + return ticket; + } + + /** + * 通过config接口注入权限验证配置(公众号) + * 附录1-JS-SDK使用权限签名算法, + * @return + */ + public Map<String,Object> getSignatureConfig(String url) throws Exception{ + //获取token + try { + url = URLDecoder.decode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + String ticket = getJSApiTicket(); + String noncestr = UUIDUtil.getRandomCode(); + Long timestamp = System.currentTimeMillis(); + String content = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; + String signature = DigestUtils.sha1Hex(content); + Map<String,Object> map=new HashMap<>(); + map.put("appId", officialAccountAppid); + map.put("timestamp", timestamp); + map.put("nonceStr", noncestr); + map.put("signature", signature); + return map; + } + + + /** + * 公众号获取用户个人信息 + * @param access_token + * @param openid + * @return + */ + public Map<String, Object> queryUserInfo(String access_token, String openid) throws Exception{ + String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN"; + HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form"); + if(httpResult.getCode() != 200){ + return null; + } + logger.debug(httpResult.getData()); + JSONObject j = JSON.parseObject(httpResult.getData()); + Map<String, Object> map = new HashMap<>(); + map.put("nickname", j.getString("nickname")); + map.put("sex", j.getInteger("sex")); + map.put("headimgurl", j.getString("headimgurl")); + map.put("unionid", j.getString("unionid")); + return map; + } + + + /** + * 获取小程序二维码 + * @param page 跳转页 例如 pages/index/index + * @param scene 参数 a=1&b=2 + */ + public InputStream getwxacodeunlimit(String page, String scene, String envVersion) throws Exception{ + try { + String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken"); + String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + wxAppletsAccessToken; + Map<String, Object> param = new HashMap<>(); + param.put("scene", scene); + param.put("page", page); + param.put("env_version", envVersion); + HttpHeaders httpHeaders = new HttpHeaders(); + MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8"); + httpHeaders.setContentType(type); + HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders); + ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class, new Object[0]); + String body1 = exchange.getBody(); +// System.err.println(body1); + ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); + byte[] body = entity.getBody(); +// System.err.println(Base64.encodeBase64String(body)); + return new ByteArrayInputStream(body); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + + /** + * 获取小程序urlscheme码 + * @return + */ + public String getUrlscheme(String path) throws Exception{ + String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken"); + String url = "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + wxAppletsAccessToken; + Map<String, Object> param = new HashMap<>(); + param.put("is_expire", true); + param.put("expire_type", 1); + param.put("expire_interval", 180); + Map<String, Object> map1 = new HashMap<>(); + map1.put("path", path); + map1.put("query", ""); + map1.put("env_version", "release"); + param.put("jump_wxa", map1); + HttpHeaders httpHeaders = new HttpHeaders(); + MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8"); + httpHeaders.setContentType(type); + HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders); + ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + String body1 = exchange.getBody(); + return body1; + } +} -- Gitblit v1.7.1