/* package com.ruoyi.user.vx.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.system.util.UUIDUtil; import com.stylefeng.guns.modular.system.util.httpClinet.HttpClientUtil; import com.stylefeng.guns.modular.system.util.httpClinet.HttpResult; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; 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.*; 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 HttpClientUtil httpClientUtil; @Autowired private RestTemplate restTemplate; @Autowired private RedisUtil redisUtil; // 获取微信用户access_token的接口地址 private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token"; // 获取微信用户信息的接口地址 private static final String USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo"; { 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失败"); } redisUtil.setStrValue("wxAppletsAccessToken", wxAppletsAccessToken, 7000); }catch (Exception e){ e.printStackTrace(); } } }, 0, 7000000); }catch (Exception e){ e.printStackTrace(); } } }).start(); } */ /** * 小程序使用jscode获取openid * @param jscode * @return *//* public Map 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"; // String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+wxAppletsAppid+"&secret="+wxAppletsAppSecret+"&code="+jscode+"&grant_type=authorization_code"; HttpResult httpResult = httpClientUtil.pushHttpRequset("GET", url, null, null, "form"); if(null == httpResult || httpResult.getCode() != 200){ return null; } JSONObject jsonObject = JSON.parseObject(httpResult.getData()); int errcode = jsonObject.getIntValue("errcode"); Map map = new HashMap<>(); System.err.println("调用返回"+jsonObject); System.err.println("响应结果"+httpResult); if(errcode == 0){//成功 Map userInfo = getUserInfo(jsonObject.getString("session_key"), jsonObject.getString("openid")); System.err.println(userInfo); // 用户名 // String nickname = userInfo.get("nickname").toString(); // // 用户头像 // String headimgurl = userInfo.get("headimgurl").toString(); // System.err.println("用户名:"+nickname); // System.err.println("头像:"+headimgurl); map.put("openid", jsonObject.getString("openid")); map.put("sessionKey", jsonObject.getString("session_key")); map.put("unionid", jsonObject.getString("unionid")); String wxAppletsAccessToken = getWxAppletsAccessToken(); System.err.println("看看accesstoken:"+wxAppletsAccessToken); Map openid = getUserInfo(wxAppletsAccessToken, jsonObject.getString("openid")); System.err.println("用户信息:"+ openid); 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; } if(errcode == 40226){//高风险等级用户,小程序登录拦截 。 map.put("msg", jsonObject.getString("errmsg")); } map.put("msg", jsonObject.getString("errmsg")); return map; } */ /** * 获取微信小程序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 ""; } System.err.println("获取AAAAAAAAAAAAAAAAAAAAAAAAAA:"+httpResult); 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 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 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 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 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 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 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 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 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; } */ /** * 获取微信用户的access_token * * @param code 微信小程序登录时获取的code * @return 包含access_token和openid的Map * @throws Exception *//* public Map getAccessToken(String code) throws Exception { OkHttpClient client = new OkHttpClient(); String url = ACCESS_TOKEN_URL + "?appid=" + wxAppletsAppid+ "&secret=" + wxAppletsAppSecret + "&code=" + code + "&grant_type=authorization_code"; Request request = new Request.Builder().url(url).get().build(); Response response = client.newCall(request).execute(); String responseStr = response.body().string(); System.err.println("响应结果"+responseStr); JSONObject jsonObject = JSON.parseObject(responseStr); String accessToken = jsonObject.getString("access_token"); String openid = jsonObject.getString("openid"); Map map = new HashMap<>(); map.put("access_token", accessToken); map.put("openid", openid); 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 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 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 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 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 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> requestEntity = new HttpEntity<>(param, httpHeaders); ResponseEntity entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); byte[] body = entity.getBody(); 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 param = new HashMap<>(); param.put("is_expire", true); param.put("expire_type", 1); param.put("expire_interval", 180); Map 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> requestEntity = new HttpEntity<>(param, httpHeaders); ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); String body1 = exchange.getBody(); return body1; } } */