From 04ee9afc3f33f48327e360be965f882ffd2c16be Mon Sep 17 00:00:00 2001
From: huanghongfa <huanghongfa123456>
Date: 星期三, 28 七月 2021 16:00:52 +0800
Subject: [PATCH] 修改bug
---
springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxXCXTempSend.java | 215 +++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 182 insertions(+), 33 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 e1c81f8..85cac1b 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,14 +1,23 @@
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 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.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.IOException;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -17,6 +26,8 @@
public class WxXCXTempSend {
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";
public static final String APP_ID = "wx0cef797390444b75";
private static final String APP_SECRET = "c7ea9aaa7e391a487e8a5b9ba61045d1";
@@ -30,23 +41,26 @@
* @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 expire = redisTemplate.boundHashOps(SecurityConstants.APPLETS_ACCESS_TOKEN).getExpire();
- if(expire <= 0){
- redisTemplate.delete(SecurityConstants.APPLETS_ACCESS_TOKEN);//如果过期则删除
- accessToken = getAppAccessToken();
- valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN, accessToken,110, TimeUnit.MINUTES);
- }else{
- accessToken = valueOperations.get(SecurityConstants.APPLETS_ACCESS_TOKEN);
- }
- }else{
- accessToken = getAppAccessToken();
- valueOperations.set(SecurityConstants.APPLETS_ACCESS_TOKEN, accessToken,110, TimeUnit.MINUTES);
- }
- return accessToken;
+// 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{
@@ -67,23 +81,158 @@
return accessToken;
}
- public static void main(String[] args) throws Exception {
-// String accessToken = "0";
-// try {
-// //此处APP_ID APP_SECRET 在微信小程序后端可见
-// String accessTokenUrl = String.format(TEMP_URL, APP_ID, 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();
-// }
-// System.out.println(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;
+ }
+ /**
+ * url转变为 MultipartFile对象
+ * @param url
+ * @param fileName
+ * @return
+ * @throws Exception
+ */
+ private static MultipartFile createFileItem(String url, String fileName) throws Exception{
+ FileItem item = null;
+ try {
+ 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) {
+ InputStream is = conn.getInputStream();
+
+ FileItemFactory factory = new DiskFileItemFactory(16, null);
+ String textFieldName = "uploadfile";
+ item = factory.createItem(textFieldName, ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName);
+ OutputStream os = item.getOutputStream();
+
+ int bytesRead = 0;
+ byte[] buffer = new byte[8192];
+ while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ os.close();
+ is.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("文件下载失败", e);
+ }
+
+ return new CommonsMultipartFile(item);
+ }
+
+ /**
+ * 微信小程序临时素材上传
+ *
+ * @param file
+ * @return
+ * @author yixiu
+ * @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();
+ con.setRequestMethod("POST");
+ con.setDoInput(true);
+ con.setDoOutput(true);
+ con.setUseCaches(false);
+ // 设置请求头信息
+ con.setRequestProperty("Connection", "Keep-Alive");
+ con.setRequestProperty("Charset", "UTF-8");
+ // 设置边界
+ String BOUNDARY = "----------" + System.currentTimeMillis();
+ con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
+ // 请求正文信息
+ // 第一部分:
+ StringBuilder sb = new StringBuilder();
+ sb.append("--"); // 必须多两道线
+ sb.append(BOUNDARY);
+ 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");
+ // 获得输出流
+ OutputStream out = new DataOutputStream(con.getOutputStream());
+ // 输出表头
+ out.write(head);
+ // 文件正文部分
+ // 把文件已流文件的方式 推入到url中
+ DataInputStream in = new DataInputStream(file.getInputStream());
+ int bytes = 0;
+ byte[] bufferOut = new byte[1024];
+ while ((bytes = in.read(bufferOut)) != -1) {
+ out.write(bufferOut, 0, bytes);
+ }
+ in.close();
+ // 结尾部分
+ byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
+ out.write(foot);
+ out.flush();
+ out.close();
+ StringBuffer buffer = new StringBuffer();
+ BufferedReader reader = null;
+ try {
+ // 定义BufferedReader输入流来读取URL的响应
+ reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ buffer.append(line);
+ }
+ if (result == null) {
+ result = buffer.toString();
+ }
+ } catch (IOException e) {
+ System.out.println("发送POST请求出现异常! {}");
+ e.printStackTrace();
+ throw new IOException("数据读取异常");
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ // 获取到返回HTTP结果
+ Map<String, Object> map = JSONObject.parseObject(result, Map.class);
+ if (map.containsKey("media_id")) {
+ return map.get("media_id").toString();
+ }
+ System.out.println("小程序上传临时素材出错,返回信息为: " + result);
+ return null;
+ }
}
--
Gitblit v1.7.1