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();
|
}
|
}
|
}
|
}
|
|
}
|