ecology_maven/weaver/fna/invoice/utils/HttpUtil.java

537 lines
18 KiB
Java
Raw Normal View History

2021-11-14 15:29:16 +08:00
/*
*
* Copyright (c) 2001-2018 .
* ,.
*
*/
package weaver.fna.invoice.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.Charsets;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import net.sf.json.JSONObject;
import sun.misc.BASE64Encoder;
import weaver.conn.RecordSet;
import weaver.fna.invoice.Constants;
import weaver.fna.invoice.common.FnaInvoiceCommon;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.systeminfo.SystemEnv;
/**
* @author zhangwj
* @Jan 23, 2019
*/
@SuppressWarnings("unchecked")
public class HttpUtil {
/**
* post
* @param url
* @param params
* @return
*/
public static Map<String,Object> post(String url, Map<String, String> params) {
CloseableHttpClient cilent = HttpClients.createDefault();
Map<String,Object> reponseMap = new HashMap<String,Object>();
try {
HttpPost post = postForm(url, params);
reponseMap = invoke(cilent, post);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
cilent.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return reponseMap;
}
/**
* invoke
* @param httpclient
* @param httpost
* @return
*/
private static Map<String,Object> invoke(CloseableHttpClient httpclient,
HttpUriRequest httpost) {
Map<String,Object> returnMap = new HashMap<String,Object>();
HttpResponse response = sendRequest(httpclient, httpost);
String body = paseResponse(response);
// 请求返回结果状态
returnMap.put("statusCode", response.getStatusLine().getStatusCode());
returnMap.put("response", body);
return returnMap;
}
/**
* sendRequest
* @param httpclient
* @param httpost
* @return
*/
private static HttpResponse sendRequest(CloseableHttpClient httpclient,
HttpUriRequest httpost) {
HttpResponse response = null;
try {
response = httpclient.execute(httpost);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
/**
* paseResponse
* @param response
* @return
*/
private static String paseResponse(HttpResponse response) {
HttpEntity entity = response.getEntity();
String body = null;
try {
body = EntityUtils.toString(entity, "UTF-8");
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return body;
}
/**
* HttpPost
* @param url
* @param params
* @return
*/
private static HttpPost postForm(String url, Map<String, String> params) {
HttpPost httpost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(120000).setConnectionRequestTimeout(120000)
.setSocketTimeout(120000).build();
httpost.setConfig(requestConfig);
if(params!=null){
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
Set<String> keySet = params.keySet();
for (String key : keySet) {
nvps.add(new BasicNameValuePair(key, params.get(key)));
}
httpost.setEntity(new UrlEncodedFormEntity(nvps, Charsets.UTF_8));
}
return httpost;
}
/**
* Base64
* @param str
* @return
*/
public static String getBase64(String str) {
byte[] b = null;
String s = "";
try {
b = str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (b != null) {
s = new BASE64Encoder().encode(b);
}
return s;
}
public static JSONObject postImage(byte[] bytes,User user){
new BaseBean().writeLog("开始调用发票识别接口...");
RecordSet rs = new RecordSet();
JSONObject jsonObject = new JSONObject();
HttpURLConnection connection = null;
OutputStream outputStream = null;
boolean existEffectOcr=false;
boolean existEffectCloud=false;
int imageCatalog = 0;
//ocr
String interfaceurl = "";
String appKey = "";
String secret = "";
//Cloud
String cid = "";
String ocrUrl = "";
String uploadFileUrl = "";
String tokenUrl = "";
String userName = "";
String password = "";
try {
JSONObject interfaceInfo = InvoiceCloudUtil.getInterfaceInfo(user, true, false, true);
JSONObject cloudInfo = interfaceInfo.getJSONObject("cloud");
JSONObject ocrInfo = interfaceInfo.getJSONObject("ocr");
existEffectCloud = cloudInfo.getBoolean("existEffectCloud");
existEffectOcr = ocrInfo.getBoolean("existEffectOcr");
if(existEffectCloud){
imageCatalog = cloudInfo.getInt("imageCatalog");
cid = cloudInfo.getString("cid");
ocrUrl = cloudInfo.getString("ocrUrl");
tokenUrl = cloudInfo.getString("tokenUrl");
uploadFileUrl = cloudInfo.getString("uploadFileUrl");
userName = cloudInfo.getString("userName");
password = cloudInfo.getString("password");
}else if(existEffectOcr){
imageCatalog = ocrInfo.getInt("imageCatalog");
interfaceurl = ocrInfo.getString("interfaceurl");
appKey = ocrInfo.getString("appKey");
secret = ocrInfo.getString("secret");
}
if(!existEffectCloud && !existEffectOcr){
throw new Exception(SystemEnv.getHtmlLabelName(520791, user.getLanguage()));//后台【预算】-【发票管理】-【发票接口配置】未配置生效的票据接口!
}
if(imageCatalog==0){
throw new Exception("发票识别接口未配置发票图片目录");
}
if(existEffectCloud){
JSONObject resultJsonObj = InvoiceCloudUtil.invoiceOCR(bytes, cid, ocrUrl,tokenUrl,uploadFileUrl, user, userName, password);
jsonObject.put("status", resultJsonObj.get("status"));
jsonObject.put("returnInfo", resultJsonObj.getJSONObject("returnInfo"));
}else{
jsonObject = invoiceOCR(appKey,secret,interfaceurl,bytes,connection,outputStream);
}
} catch (Exception e) {
jsonObject.put("status", Constants.ERROR_CODE);
jsonObject.put("errMsg", e.getMessage());
}finally {
if(connection!=null){
connection.disconnect();
}
}
FnaInvoiceCommon.addFnainvoiceLog("1",bytes,"","","","","",
jsonObject, user, "OCR",appKey);
new BaseBean().writeLog("结束调用发票识别接口...");
new BaseBean().writeLog("jsonObject:"+jsonObject.toString());
return jsonObject;
}
private static JSONObject invoiceOCR(String appKey,String secret,String interfaceurl,byte[] bytes,
HttpURLConnection connection,OutputStream outputStream) throws Exception {
JSONObject resultJsonObj = new JSONObject();
Map<String, Object> params = new LinkedHashMap<String, Object>();
String timestamp = System.currentTimeMillis() / 1000 +"";
String type="0";
String token=getEncode(appKey+"+"+timestamp+"+"+FnaInvoiceCommon.fnaDecrypt(secret));
//key
params.put("app_key", appKey);
//token
params.put("token", token.toLowerCase());
//当前时间戳
params.put("timestamp", timestamp);
//识别类型
params.put("type", type);
new BaseBean().writeLog("-----------------param-------------------"+params);
URL url = new URL(interfaceurl);
//判断是是否配置代理
if(ProxyUtil.ifExistsProxy()){
connection = (HttpURLConnection) url.openConnection(ProxyUtil.getProxy());
Map<String,String> propertyMap = ProxyUtil.getProxyProperty();
String proxyUser = propertyMap.getOrDefault("proxyUser", "");//用户名
String proxyPwd = propertyMap.getOrDefault("proxyPwd", "");//密码
if(!"".equals(proxyUser)&&!"".equals(proxyPwd)){
String headerkey = "Proxy-Authorization";
String headerValue = "Basic "+Base64.encodeBase64String((proxyUser+":"+proxyPwd).getBytes());//帐号密码用:隔开base64加密方式
connection.setRequestProperty(headerkey, headerValue);
}
}else{
connection = (HttpURLConnection) url.openConnection();
}
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=----request");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");
connection.setRequestProperty("Accept", "*/*");
connection.setRequestProperty("Range", "bytes="+"");
connection.setConnectTimeout(60000);
connection.setReadTimeout(60000);
connection.setRequestMethod("POST");
StringBuffer buffer = new StringBuffer();
for(Map.Entry<String, Object> entry:params.entrySet()){
buffer.append("------request\r\n");
buffer.append("Content-Disposition: form-data; name=\"");
buffer.append(entry.getKey());
buffer.append("\"\r\n\r\n");
buffer.append(entry.getValue());
buffer.append("\r\n");
}
outputStream = connection.getOutputStream();
outputStream.write(buffer.toString().getBytes());
outputStream.write(("------request\r\n").getBytes());
outputStream.write(("Content-Disposition: form-data; name=\"image_file\";filename=\"发票1.jpg\"\r\n").getBytes());
outputStream.write(("Content-Type: image/jpeg").getBytes());
outputStream.write(("\"\r\n\r\n").getBytes());
outputStream.write(bytes);
outputStream.write(("\r\n").getBytes());
outputStream.write(("------request--\r\n").getBytes());
outputStream.flush();
outputStream.close();
StringBuffer returnInfo = new StringBuffer();
int resultCode = connection.getResponseCode();
if(HttpURLConnection.HTTP_OK==resultCode){
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
String line;
while ((line = reader.readLine()) != null){
returnInfo.append(line.trim());
}
reader.close();
connection.disconnect();
resultJsonObj.put("status", Constants.SUCCESS_CODE);
resultJsonObj.put("returnInfo", JSONObject.fromObject(returnInfo.toString()));
}else{
throw new Exception("error responsecode :"+resultCode);
}
return resultJsonObj;
}
/**
*
* @Title: checkshibie
* @Description:
* @param: @param user
* @param: @return
* @return: boolean
* @throws
*/
public static boolean checkIdentify(User user){
boolean existEffectOcr=false;
RecordSet rs = new RecordSet();
//如果有生效的未开启分部的ocr直接使用
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=0 and status=1 and subIdStatus=0 ");
if(rs.next()){
existEffectOcr = true;
}
if(!existEffectOcr){
//查询当前人员所在分部的发票云接口
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=0 and status=1 and subIdStatus=1 ");
while (rs.next()){
String subIds = Util.null2String(rs.getString("subIds"));
String[] subIds_split = subIds.split(",");
for(int i=0;i<subIds_split.length;i++){
if(subIds_split[i].equals(user.getUserSubCompany1())){
existEffectOcr = true;
break;
}
}
if(existEffectOcr){
break;
}
}
}
return existEffectOcr;
}
/**
* token
* @return
*/
public static JSONObject getToken(String client_secret,String client_id,String tokenURL) throws Exception{
JSONObject jsonObject = new JSONObject();
String content = "";
String token = "";
JSONObject tokenJson = new JSONObject();
tokenJson.put("client_secret", client_secret);
tokenJson.put("client_id", client_id);
String url = tokenURL+"&client_id="+client_id+"&client_secret="+client_secret;
CloseableHttpClient httpclient = HttpClients.createDefault();
//请求报文
StringEntity s = new StringEntity(tokenJson.toString(), "UTF-8");
s.setContentEncoding("UTF-8");
s.setContentType("application/json");//发送json数据需要设置contentType
// 构造消息头
HttpPost post = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(120000).setConnectionRequestTimeout(120000)
.setSocketTimeout(120000).build();
post.setConfig(requestConfig);// 设置超时时间
post.setHeader("Accept-Charset", "UTF-8");
post.setHeader("Charset", "UTF-8");
post.setEntity(s);
HttpResponse res = httpclient.execute(post);
if(res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
content = EntityUtils.toString(res.getEntity());// 返回json格式
}else {
throw new Exception("获取token失败");
}
String REPLYCODE = "0";
String REPLYMSG = "";
Document document = DocumentHelper.parseText(content);
Element rootElement = document.getRootElement();
List<Element> rootlist = rootElement.elements();
for(int i = 0;i<rootlist.size();i++){
Element element = rootlist.get(i);
if("HEAD".equals(element.getName())){
Element SERVICE = (Element) element.elements().get(0);
List<Element> replayList = SERVICE.elements();
for(int j = 0;j<replayList.size();j++){
String tag = replayList.get(j).getName();
if("REPLYCODE".equalsIgnoreCase(tag)){
REPLYCODE = replayList.get(j).getText();
}
if("REPLYMSG".equalsIgnoreCase(tag)){
REPLYMSG = replayList.get(j).getText();
}
}
}
if("BODY".equals(element.getName())){
List<Element> replayList = element.elements();
for(int j = 0;j<replayList.size();j++){
String tag = replayList.get(j).getName();
if("access_token".equalsIgnoreCase(tag)){
token = replayList.get(j).getText();
}
}
}
}
if(!"0".equals(REPLYCODE)) {
throw new Exception(REPLYMSG);
}
if("".equals(token)) {
throw new Exception("获取token失败");
}
jsonObject.put("status", "0");
jsonObject.put("token", token);
return jsonObject;
}
/**
* openid
* @param token
* @return
*/
public static JSONObject getOpenID(String token,String openIdURL,String client_id) throws Exception{
JSONObject jsonObject = new JSONObject();
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet get = new HttpGet(openIdURL+"&client_id="+client_id+"&access_token="+token);
String content = "";
String openId = "";
HttpResponse response = httpClient.execute(get);
content = EntityUtils.toString(response.getEntity());
String REPLYCODE = "0";
String REPLYMSG = "";
Document document = DocumentHelper.parseText(content);
Element rootElement = document.getRootElement();
List<Element> rootlist = rootElement.elements();
for(int i = 0;i<rootlist.size();i++){
Element element = rootlist.get(i);
if("HEAD".equals(element.getName())){
Element SERVICE = (Element) element.elements().get(0);
List<Element> replayList = SERVICE.elements();
for(int j = 0;j<replayList.size();j++){
String tag = replayList.get(j).getName();
if("REPLYCODE".equalsIgnoreCase(tag)){
REPLYCODE = replayList.get(j).getText();
}
if("REPLYMSG".equalsIgnoreCase(tag)){
REPLYMSG = replayList.get(j).getText();
}
}
}
if("BODY".equals(element.getName())){
List<Element> replayList = element.elements();
for(int j = 0;j<replayList.size();j++){
String tag = replayList.get(j).getName();
if("openID".equalsIgnoreCase(tag)){
openId = replayList.get(j).getText();
}
}
}
}
if(!"0".equals(REPLYCODE)) {
throw new Exception(REPLYMSG);
}
if("".equals(openId)) {
throw new Exception("获取openId失败");
}
jsonObject.put("status", "0");
jsonObject.put("openId", openId);
return jsonObject;
}
static final char HEXDIGITS[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'
};
private static String getEncode(String key) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
try {
messageDigest.update(key.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
messageDigest.update(key.getBytes());
}
byte digest[] = messageDigest.digest();
int j = digest.length;
char str[] = new char[j * 2];
int k = 0;
for(int i = 0; i < j; i++)
{
byte byte0 = digest[i];
str[k++] = HEXDIGITS[byte0 >>> 4 & 0xf];
str[k++] = HEXDIGITS[byte0 & 0xf];
}
return new String(str);
}
}