537 lines
18 KiB
Java
537 lines
18 KiB
Java
/*
|
||
*
|
||
* 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);
|
||
}
|
||
|
||
}
|