package com.matrix.component.tools; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.PropertiesUtil; import com.matrix.core.tools.StringUtils; import com.matrix.system.common.constance.AppConstance; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.springframework.http.*; import org.springframework.web.client.RestTemplate; import java.io.*; import java.util.HashMap; import java.util.Map; public class WxacodeUtil { /** * token获取地址 */ private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET"; /** * token获取地址 */ private static final String GET_WXACODE ="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="; public static String getWxacode(String scene,String page,String fileName,String appid,String secret) throws Exception { LogUtil.debug("scene={},page={},fileName={}",scene,page,fileName); //获取token String result1 = get(TOKEN_URL.replace("APPID", appid).replace("SECRET", secret)); String access_token = JSONObject.parseObject(result1).getString("access_token"); if(StringUtils.isNotBlank(access_token)) { Map params = new HashMap<>(); params.put("scene", scene); params.put("page", page); params.put("width", 430); params.put("is_hyaline", true); CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(GET_WXACODE+access_token); String body = JSON.toJSONString(params); StringEntity entity; entity = new StringEntity(body); entity.setContentType("image/png"); httpPost.setEntity(entity); HttpResponse response; response = httpClient.execute(httpPost); InputStream inputStream = response.getEntity().getContent(); // 图片保存目录路径 String baseSavePath = PropertiesUtil.getString(AppConstance.FILES_TORAGE_PATH); File targetFile = new File(baseSavePath); if(!targetFile.exists()){ targetFile.mkdirs(); } // 创建图片文件夹 baseSavePath += "wxacode" + File.separatorChar; File saveDirFile = new File(baseSavePath); if (!saveDirFile.exists()) { saveDirFile.mkdirs(); } String qrcodePath = baseSavePath + fileName + ".png"; FileOutputStream out = new FileOutputStream(qrcodePath); LogUtil.debug("qrcodePath:{}",qrcodePath); byte[] buffer = new byte[1024]; int bytesRead = 0; while((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) { out.write(buffer, 0, bytesRead); } out.flush(); out.close(); return qrcodePath; } else { return null; } } public static String inputstreamtofile(InputStream ins,File file){ try { OutputStream os = new FileOutputStream(file); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); ins.close(); }catch (Exception e) { String strError = streamToString(ins,"GBK"); LogUtil.info("-------------二维码生成------"+strError); return "error:" + strError; } return null; } /** * 发送get请求 * @param url * @return */ public static String get(String url) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); HttpEntity entity = new HttpEntity(url, headers); ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, String.class); return responseEntity.getBody(); } public static String streamToString(InputStream in, String encoding){ // 将流转换为字符串 ByteArrayOutputStream bos = null; try { // 1.创建内存输出流,将读到的数据写到内存输出流中 bos = new ByteArrayOutputStream(); // 2.创建字节数组 byte[] arr = new byte[1024]; int len; while(-1 != (len = in.read(arr))) { bos.write(arr, 0, len); } // 3.将内存输出流的数据全部转换为字符串 return bos.toString(encoding); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("提取 requestBody 异常", e); } finally { if(null != bos) { try { // 其实这个内存输出流可关可不关,因为它的close方法里面没做任何操作。 bos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }