From bbda2ee1af4e86d76f93e00386d77efb56c60d5f Mon Sep 17 00:00:00 2001 From: puhanshu <a9236326> Date: 星期六, 23 七月 2022 15:42:06 +0800 Subject: [PATCH] bug修改 --- springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxXCXTempSend.java | 252 +++++++++++++++++++++++++++++-------------------- 1 files changed, 148 insertions(+), 104 deletions(-) diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxXCXTempSend.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxXCXTempSend.java index 85cac1b..c19972e 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxXCXTempSend.java +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxXCXTempSend.java @@ -1,134 +1,65 @@ package com.panzhihua.common.utlis; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.panzhihua.common.constants.SecurityConstants; -import lombok.extern.slf4j.Slf4j; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +import com.panzhihua.common.controller.BaseController; +import com.panzhihua.common.model.vos.R; +import com.panzhihua.common.model.vos.user.SysAppConfigVO; +import com.panzhihua.common.service.user.UserService; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; -import java.io.*; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.Map; -import java.util.concurrent.TimeUnit; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.panzhihua.common.constants.SecurityConstants; + +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; @Slf4j @Component -public class WxXCXTempSend { +public class WxXCXTempSend extends BaseController { + public static final String APP_ID = "wx118de8a734d269f0"; + private static final String APP_SECRET = "0264342daefde5cd70a6adada09ee5b1"; private static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"; private static String APP_IMAGE_URL = "https://www.psciio.com//idcard/8fa82cfba258498eab2fa818220fb592.jpg"; private static String APP_IMAGE_NAME = "5.jpg"; + @Resource + private RedisTemplate redisTemplate; + UserService userService; - public static final String APP_ID = "wx0cef797390444b75"; - private static final String APP_SECRET = "c7ea9aaa7e391a487e8a5b9ba61045d1"; - - @Autowired - private StringRedisTemplate redisTemplate; - - /** - * 获取小程序token,(ps:0=token获取失败) - * - * @return - */ - public String getAccessToken() throws Exception { -// String accessToken = ; -// Boolean aBoolean = redisTemplate.hasKey(SecurityConstants.APPLETS_ACCESS_TOKEN); -// ValueOperations<String, String> valueOperations = redisTemplate.opsForValue(); -// if(aBoolean){ -// Long expireTime = Long.parseLong(valueOperations.get(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME)); -// if(expireTime <= System.currentTimeMillis()){ -// redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_TOKEN);//如果过期则删除 -// redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME);//如果过期则删除 -// -// valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN, accessToken); -// valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME, System.currentTimeMillis() + 1100000 + ""); -// }else{ -// accessToken = valueOperations.get(SecurityConstants.APPLETS_ACCESS_TOKEN); -// } -// }else{ -// accessToken = getAppAccessToken(); -// valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN, accessToken); -// valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME, System.currentTimeMillis() + 1100000 + ""); -// } - return getAppAccessToken(); - } - - private String getAppAccessToken() throws Exception{ - String accessToken = "0"; - try { - //此处APP_ID APP_SECRET 在微信小程序后端可见 -// String accessTokenUrl = String.format(TEMP_URL, APP_ID, APP_SECRET); - String accessTokenUrl = ACCESS_TOKEN_URL + "&appid=" + APP_ID + "&secret=" + APP_SECRET; - String result = HttpClientUtil.httpGet(accessTokenUrl, null, null); - Map<String, Object> resultMap = JSON.parseObject(result, Map.class); - if(resultMap.containsKey("access_token")) { - accessToken = resultMap.get("access_token").toString(); - } - } catch (IOException ioe) { - log.error("小程序http请求异常"); - ioe.printStackTrace(); - } - return accessToken; - } - - public String getMediaId(String accessToken){ - String mediaId = ""; - Boolean aBoolean = redisTemplate.hasKey(SecurityConstants.APPLETS_ACCESS_MEDIA_ID); - ValueOperations<String, String> valueOperations = redisTemplate.opsForValue(); - if(aBoolean){ - Long expireTime = Long.parseLong(valueOperations.get(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME)); - if(expireTime <= System.currentTimeMillis()){ - redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_MEDIA_ID);//如果过期则删除 - redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME);//如果过期则删除 - mediaId = getAppMediaId(accessToken); - valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID, mediaId); - valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME, System.currentTimeMillis() + 259000000 + ""); - }else{ - mediaId = valueOperations.get(SecurityConstants.APPLETS_ACCESS_MEDIA_ID); - } - }else{ - mediaId = getAppMediaId(accessToken); - valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID, mediaId); - valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME, System.currentTimeMillis() + 259000000 + ""); - } - return mediaId; - } - - private String getAppMediaId(String accessToken){ - String appMediaId = ""; - try { - MultipartFile file = createFileItem(APP_IMAGE_URL,APP_IMAGE_NAME); - appMediaId = uploadFile(file,accessToken); - }catch (Exception e){ - log.error("上传临时图片素材失败,错误原因:" + e.getMessage()); - } - return appMediaId; - } - + private static WxXCXTempSend wxXCXTempSend; /** * url转变为 MultipartFile对象 + * * @param url * @param fileName * @return * @throws Exception */ - private static MultipartFile createFileItem(String url, String fileName) throws Exception{ + private static MultipartFile createFileItem(String url, String fileName) throws Exception { FileItem item = null; try { - HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); conn.setReadTimeout(30000); conn.setConnectTimeout(30000); - //设置应用程序要从网络连接读取数据 + // 设置应用程序要从网络连接读取数据 conn.setDoInput(true); conn.setRequestMethod("GET"); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { @@ -136,7 +67,8 @@ FileItemFactory factory = new DiskFileItemFactory(16, null); String textFieldName = "uploadfile"; - item = factory.createItem(textFieldName, ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName); + item = + factory.createItem(textFieldName, ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName); OutputStream os = item.getOutputStream(); int bytesRead = 0; @@ -155,6 +87,112 @@ } /** + * 获取小程序token,(ps:0=token获取失败) + * + * @return + */ + public String getAccessToken() throws Exception { + String appid=this.getAppId(); + String accessToken = ""; + Boolean aBoolean = wxXCXTempSend.redisTemplate.hasKey(SecurityConstants.APPLETS_ACCESS_TOKEN+"_"+appid); + ValueOperations<String, String> valueOperations = wxXCXTempSend.redisTemplate.opsForValue(); + if(aBoolean){ + Long expireTime = Long.parseLong(valueOperations.get(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME+"_"+appid)); + if(expireTime <= System.currentTimeMillis()){ + wxXCXTempSend.redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_TOKEN+"_"+appid);//如果过期则删除 + wxXCXTempSend.redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME+"_"+appid);//如果过期则删除 + + valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN+"_"+appid, getAppAccessToken(appid)); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME+"_"+appid, System.currentTimeMillis() + 1100000 + ""); + }else{ + accessToken = valueOperations.get(SecurityConstants.APPLETS_ACCESS_TOKEN+"_"+appid); + } + }else{ + accessToken = getAppAccessToken(appid); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN+"_"+appid, accessToken); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN_TIME+"_"+appid, System.currentTimeMillis() + 1100000 + ""); + } + return accessToken; + } + + public String getAppAccessToken(String appid) throws Exception { + R<SysAppConfigVO> sysAppConfigVOR=userService.selectByAppid(appid); + String accessToken = "0"; + try { + log.info("获取微信token参数:appid=" + APP_ID + ",appSecret=" + APP_SECRET); + String accessTokenUrl = ACCESS_TOKEN_URL + "&appid=" + sysAppConfigVOR.getData().getAppId() + "&secret=" + sysAppConfigVOR.getData().getSecret(); + String result = HttpClientUtil.httpGet(accessTokenUrl, null, null); + Map<String, Object> resultMap = JSON.parseObject(result, Map.class); + if (resultMap.containsKey("access_token")) { + accessToken = resultMap.get("access_token").toString(); + } + } catch (IOException ioe) { + log.error("小程序http请求异常"); + ioe.printStackTrace(); + } + return accessToken; + } + + /** + * 获取西区社区通微信token + * @return 西区社区通微信token + * @throws Exception 异常 + */ + public String getXQAppAccessToken() throws Exception { + String accessToken = "0"; + try { + // 此处APP_ID APP_SECRET 在微信小程序后端可见 + // String accessTokenUrl = String.format(TEMP_URL, APP_ID, APP_SECRET); + String accessTokenUrl = ACCESS_TOKEN_URL + "&appid=" + APP_ID + "&secret=" + APP_SECRET; + String result = HttpClientUtil.httpGet(accessTokenUrl, null, null); + Map<String, Object> resultMap = JSON.parseObject(result, Map.class); + if (resultMap.containsKey("access_token")) { + accessToken = resultMap.get("access_token").toString(); + } + } catch (IOException ioe) { + log.error("小程序http请求异常"); + ioe.printStackTrace(); + } + return accessToken; + } + + public String getMediaId(String accessToken) { + String mediaId = ""; + Boolean aBoolean = redisTemplate.hasKey(SecurityConstants.APPLETS_ACCESS_MEDIA_ID); + ValueOperations<String, String> valueOperations = redisTemplate.opsForValue(); + if (aBoolean) { + Long expireTime = Long.parseLong(valueOperations.get(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME)); + if (expireTime <= System.currentTimeMillis()) { + redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_MEDIA_ID);// 如果过期则删除 + redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME);// 如果过期则删除 + mediaId = getAppMediaId(accessToken); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID, mediaId); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME, + System.currentTimeMillis() + 259000000 + ""); + } else { + mediaId = valueOperations.get(SecurityConstants.APPLETS_ACCESS_MEDIA_ID); + } + } else { + mediaId = getAppMediaId(accessToken); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID, mediaId); + valueOperations.set(SecurityConstants.APPLETS_ACCESS_MEDIA_ID_TIME, + System.currentTimeMillis() + 259000000 + ""); + } + return mediaId; + } + + private String getAppMediaId(String accessToken) { + String appMediaId = ""; + try { + MultipartFile file = createFileItem(APP_IMAGE_URL, APP_IMAGE_NAME); + appMediaId = uploadFile(file, accessToken); + } catch (Exception e) { + log.error("上传临时图片素材失败,错误原因:" + e.getMessage()); + } + return appMediaId; + } + + /** * 微信小程序临时素材上传 * * @param file @@ -162,12 +200,12 @@ * @author yixiu * @throws Exception */ - public String uploadFile(MultipartFile file,String access_token) throws Exception { + public String uploadFile(MultipartFile file, String access_token) throws Exception { String url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + access_token + "&type=image"; String result = null; String fileName = file.getOriginalFilename(); URL urlObj = new URL(url); - HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); + HttpURLConnection con = (HttpURLConnection)urlObj.openConnection(); con.setRequestMethod("POST"); con.setDoInput(true); con.setDoOutput(true); @@ -186,7 +224,7 @@ sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"media\";filename=\"" + fileName + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); - byte[] head = sb.toString().getBytes("utf-8"); + byte[] head = sb.toString().getBytes(StandardCharsets.UTF_8); // 获得输出流 OutputStream out = new DataOutputStream(con.getOutputStream()); // 输出表头 @@ -201,7 +239,7 @@ } in.close(); // 结尾部分 - byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线 + byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes(StandardCharsets.UTF_8);// 定义最后数据分隔线 out.write(foot); out.flush(); out.close(); @@ -235,4 +273,10 @@ return null; } + @PostConstruct + public void init() { + wxXCXTempSend = this; + wxXCXTempSend.redisTemplate = this.redisTemplate; + } + } -- Gitblit v1.7.1