package com.base.micro.wxUtils;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import com.base.micro.Redis.RedisUtils;
import com.base.micro.system.constants.SysConstants;
import com.base.micro.system.lock.KeyLocks;
import com.base.micro.system.utils.JsonHttp;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
/**
* @Title: WeixinUtil.java
* @Description: 微信工具类
* @author jeason
* @date 2019-03-14 14:13:00
* @version V1.0
*/
public class WeixinUtil {
private final static Logger logger = LoggerFactory.getLogger(WeixinUtil.class);
private static String appId = "xxxxx";
private static String appSecret = "xxxxxxxxxx";
private static String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
private static String msgSecCheckUrl = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token={0}";
private static KeyLocks lock = new KeyLocks();
/**
* 获取token
* @param appId
* @param secret
* @return
*/
public static String getToken(String appId,String secret) {
try {
String url = com.base.micro.system.utils.StringUtils.formatStr(accessTokenUrl, appId, secret);
net.sf.json.JSONObject json = JsonHttp.doGetJson(url);
String accessToken = JsonHttp.getString(json, SysConstants.WX.ACCESS_TOKEN);
return accessToken;
}catch (Exception e){
logger.error("获取access_token失败! message="+e.getMessage());
return null;
}
}
/**
* 获取access_token
* @return
*/
public static String getAccessToken(){
synchronized (lock.lockByKey("WALL_ACCESS_TOKEN")){
Object object = RedisUtils.get("ACCESS_TOKEN");
if(StringUtils.isEmpty(object)){
try {
String url = com.base.micro.system.utils.StringUtils.formatStr(accessTokenUrl, appId, appSecret);
net.sf.json.JSONObject json = JsonHttp.doGetJson(url);
String accessToken = JsonHttp.getString(json, SysConstants.WX.ACCESS_TOKEN);
RedisUtils.set("ACCESS_TOKEN", accessToken, 10*60L);
return accessToken;
}catch (Exception e){
logger.error("获取access_token失败! message="+e.getMessage());
return null;
}
}else{
return object.toString();
}
}
}
/**
* 文字检测
* @param content
* @return
*/
public static Boolean checkMsg(String content) {
String accessToken = getAccessToken();
String url = com.base.micro.system.utils.StringUtils.formatStr(msgSecCheckUrl, accessToken);
Map<String, Object> map = new HashMap<>();
map.put("content", content);
net.sf.json.JSONObject jsonObject = JsonHttp.doPostJson2(url, map);
logger.info("===>jsonObject="+jsonObject.toString());
Integer errcode = jsonObject.getInt("errcode");
if(errcode == 0){
return true;
}else{
String errmsg = jsonObject.getString("errmsg");
if(87014 == errcode){
logger.error("检测失败!["+errmsg+"]");
return false;
}else if(42001 == errcode){
return checkMsg(content);
}
logger.error("检测异常");
return false;
}
}
/**
* 恶意图片过滤
* @param multipartFile
* @return
*/
public static Boolean checkPic(MultipartFile multipartFile) {
try {
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
HttpPost request = new HttpPost("https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + getAccessToken());
request.addHeader("Content-Type", "application/octet-stream");
InputStream inputStream = multipartFile.getInputStream();
byte[] byt = new byte[inputStream.available()];
inputStream.read(byt);
request.setEntity(new ByteArrayEntity(byt, ContentType.create("image/jpg")));
response = httpclient.execute(request);
HttpEntity httpEntity = response.getEntity();
String result = EntityUtils.toString(httpEntity, "UTF-8");// 转成string
JSONObject jso = JSONObject.parseObject(result);
logger.error(jso + "-------------验证效果");
int errcode = (int) jso.get("errcode");
if (errcode == 0) {
return true;
} else if (errcode == 87014) {
logger.error("图片内容违规-----------");
return false;
}else {
logger.error("errCode =" + errcode);
return false;
}
} catch (Exception e) {
e.printStackTrace();
logger.error("----------------调用腾讯内容过滤系统出错------------------");
return false;
}
}
}