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 { 
 | 
    /** 
 | 
     * 小程序秘钥 
 | 
     */ 
 | 
    private static final String XCX_SECRET = "xcx_secret"; 
 | 
    /** 
 | 
     * 小程序appid 
 | 
     */ 
 | 
    private static final String XCX_APPID = "xcx_appid"; 
 | 
    /** 
 | 
     * 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) throws Exception { 
 | 
        LogUtil.debug("scene={},page={},fileName={}",scene,page,fileName); 
 | 
        //获取token 
 | 
        String appid = PropertiesUtil.getString(XCX_APPID); 
 | 
        String secret = PropertiesUtil.getString(XCX_SECRET); 
 | 
         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<String, Object> 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(); 
 | 
            /*Object inputObj= response.getEntity().getContent(); 
 | 
            if(inputObj instanceof InputStream){ 
 | 
                String strError = streamToString(inputStream,"GBK"); 
 | 
                LogUtil.info("-------------二维码生成------"+strError); 
 | 
                return "error:" + strError; 
 | 
            }*/ 
 | 
  
 | 
            // 图片保存目录路径 
 | 
            String baseSavePath = PropertiesUtil.getString(AppConstance.FILES_TORAGE_PATH); 
 | 
            File targetFile = new File(baseSavePath); 
 | 
            if(!targetFile.exists()){ 
 | 
                targetFile.mkdirs(); 
 | 
            } 
 | 
  
 | 
            /*String inputstreamtofile = inputstreamtofile(inputStream, targetFile); 
 | 
            if(null != inputstreamtofile){ 
 | 
                return inputstreamtofile; 
 | 
            }*/ 
 | 
  
 | 
            // 创建图片文件夹 
 | 
            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); 
 | 
            //本地调试创建(不用删) 
 | 
            /*String filePath = "e:/test.png"; 
 | 
            File file = new File(filePath); 
 | 
            if (!file.exists()) { 
 | 
                file.mkdir(); 
 | 
            } 
 | 
            FileOutputStream outs = new FileOutputStream(file);*/ 
 | 
            byte[] buffer = new byte[1024]; 
 | 
            int bytesRead = 0; 
 | 
            while((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) { 
 | 
                out.write(buffer, 0, bytesRead); 
 | 
                //outs.write(buffer, 0, bytesRead); 
 | 
            } 
 | 
            out.flush(); 
 | 
            out.close(); 
 | 
            //outs.flush(); 
 | 
            //outs.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<String> entity = new HttpEntity<String>(url, headers); 
 | 
        ResponseEntity<String> 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(); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |