package com.ruoyi.errand.utils; import cn.hutool.core.io.FileUtil; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 微信工具类 */ @Slf4j @Component public class WeChatUtil { @Value("${wx.appletsAppid}") private String wxAppletsAppid; @Value("${wx.appletsAppSecret}") private String wxAppletsAppSecret; // @Value("${wx.appid}") private String webAppId; // @Value("${wx.appSecret}") private String webAppSecret; @Resource private RedisService redisService; /** * 小程序使用jscode获取openid * @param jscode * @return */ public Map code2Session(String jscode) { String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret + "&js_code=" + jscode + "&grant_type=authorization_code"; HttpRequest get = HttpUtil.createGet(url); HttpResponse response = get.execute(); int status = response.getStatus(); if(200 != status){ throw new RuntimeException(response.body()); } JSONObject jsonObject = JSONObject.parseObject(response.body()); int errcode = jsonObject.getIntValue("errcode"); Map map = new HashMap<>(); map.put("errcode", errcode); if(errcode == 0){//成功 map.put("openid", jsonObject.getString("openid")); map.put("sessionKey", jsonObject.getString("session_key")); 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 null; } public String getWxAppletsAccessToken(){ Object wxAppletsAccessToken = redisService.getCacheObject("wxAppletsAccessToken"); if(null != wxAppletsAccessToken){ return wxAppletsAccessToken.toString(); } String appletsAccessToken = getAppletsAccessToken(); redisService.setCacheObject("wxAppletsAccessToken", appletsAccessToken, 7200L, TimeUnit.SECONDS); return appletsAccessToken; } /** * 获取微信小程序token * @return */ public String getAppletsAccessToken() { String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret; HttpRequest get = HttpUtil.createGet(url); HttpResponse response = get.execute(); if(response.getStatus() != 200){ return ""; } JSONObject jsonObject = JSONObject.parseObject(response.body()); return jsonObject.getString("access_token"); } /** * 网站应用登录 * @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"; HttpRequest get = HttpUtil.createGet(url); HttpResponse response = get.execute(); if(response.getStatus() != 200){ return null; } JSONObject jsonObject = JSONObject.parseObject(response.body()); 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; HttpRequest get = HttpUtil.createGet(url); HttpResponse response = get.execute(); if(response.getStatus() != 200){ return null; } JSONObject jsonObject = JSONObject.parseObject(response.body()); 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; } /** * 获取小程序二维码 * @param page 跳转页 例如 pages/index/index * @param scene 参数 a=1&b=2 */ /* public InputStream getwxacodeunlimit(String page, String scene, EnvVersion env_version){ try { String token = getWxAppletsAccessToken(); if(StringUtils.isEmpty(token)){ System.err.println("获取接口调用凭证失败"); } String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token; Map param = new HashMap<>(); param.put("scene", scene); param.put("page", page); param.put("env_version", env_version.getVersion()); HttpRequest post = HttpUtil.createPost(url); post.header(Header.CONTENT_TYPE, "application/json;charset=UTF-8"); post.body(JSONObject.toJSONString(param)); HttpResponse execute = post.execute(); byte[] bytes = execute.bodyBytes(); String body1 = execute.body(); return new ByteArrayInputStream(bytes); }catch (Exception e){ e.printStackTrace(); } return null; } */ /** * 获取微信小程序二维码 * @param page * @param scene * @param filePath * @return */ /* public String getwxacodeunlimit(String page, String scene, EnvVersion env_version, String filePath){ InputStream getwxacodeunlimit = getwxacodeunlimit(page, scene, env_version); // File file = FileUtil.writeFromStream(getwxacodeunlimit, new File(filePath)); // return file.getPath(); return ObsUploadUtil.obsUpload("png", getwxacodeunlimit); }*/ }