import com.yz.discount.common.basic.config.Config;
import com.yz.discount.common.bean.MerchantOCRInfo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.Map;
import java.util.TreeMap;
@Component
public class TencentOCRUtil {
private Logger log = LoggerFactory.getLogger(TencentOCRUtil.class);
@Autowired
private Config config;
private static int appId = 1106741691;
private static String appkey = "vonHYFFpNGsygJGI";
public static long getTimeStamp(){
return System.currentTimeMillis()/1000;
}
public static String getNonceStr(){
return UUIDGenerator.getUUID();
}
/**
* 识别营业执照
* @param newImageName
* @param imageType
* @return
*/
public String getOCRLicence(String newImageName, String imageType){
try {
Map<String,String> param = new TreeMap<>();
param.put("app_id",URLEncoder.encode(String.valueOf(appId), "UTF-8"));
param.put("time_stamp",URLEncoder.encode(String.valueOf(getTimeStamp()), "UTF-8"));
param.put("nonce_str",URLEncoder.encode(getNonceStr(), "UTF-8"));
appkey = URLEncoder.encode(appkey, "UTF-8");
String image = getImageStr(config.getShopImageUrl()+File.separator+ newImageName + imageType);
param.put("image",URLEncoder.encode(image.replace("\r\n", ""), "UTF-8"));
String sign = getReqSign(param,appkey);
param.put("sign",sign);
String result = HttpsClient.httpsPost("https://api.ai.qq.com/fcgi-bin/ocr/ocr_bizlicenseocr",
param);
int ret = Integer.valueOf(JSONObject.fromObject(result).get("ret").toString());
if(ret == 0){
return result;
}else {
log.error("识别营业执照失败:{}",JSONObject.fromObject(result).get("msg").toString());
return "";
}
}catch (Exception e){
e.printStackTrace();
}
return "";
}
/**
* 识别身份证
* @param newImageName
* @param imageType
* @return
*/
public String getOCRIDCard(String newImageName, String imageType, Integer cardType){
try {
Map<String,String> param = new TreeMap<>();
param.put("app_id",URLEncoder.encode(String.valueOf(appId), "UTF-8"));
String image = getImageStr(config.getShopImageUrl()+ File.separator+ newImageName + imageType);
param.put("image",URLEncoder.encode(image.replace("\r\n", ""), "UTF-8"));
param.put("card_type", URLEncoder.encode(cardType+"","UTF-8"));
param.put("time_stamp",URLEncoder.encode(String.valueOf(getTimeStamp()), "UTF-8"));
param.put("nonce_str",URLEncoder.encode(getNonceStr(), "UTF-8"));
appkey = URLEncoder.encode(appkey, "UTF-8");
String sign = getReqSign(param,appkey);
param.put("sign",sign);
String result = HttpsClient.httpsPost("https://api.ai.qq.com/fcgi-bin/ocr/ocr_idcardocr",
param);
int ret = Integer.valueOf(JSONObject.fromObject(result).get("ret").toString());
if(ret == 0){
return result;
}else {
log.error("**************识别身份证{}失败,错误信息:{}",cardType == 0?"正面":"反面",JSONObject.fromObject(result).get("msg").toString());
return "";
}
}catch (Exception e){
e.printStackTrace();
}
return "";
}
/**
* 获取签名
* @param param
* @param appkey
* @return
* @throws Exception
*/
public static String getReqSign(Map<String,String> param,String appkey){
StringBuffer appendStr = new StringBuffer();
for (String key : param.keySet()){
if(!StringUtils.isEmpty(param.get(key))) {
appendStr.append(key).append("=")
.append(param.get(key))
.append("&");
}
}
appendStr.append("app_key=").append(appkey);
return EncryptUtil.MD5Upper(appendStr.toString());
}
/**
* 将图片转为base64编码
* @param imgFile
* @return
*/
public static String getImageStr(String imgFile) {
InputStream inputStream = null;
byte[] data = null;
try {
inputStream = new FileInputStream(imgFile);
data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 加密
// System.out.println("---------------图片编码java.util:"+new String(Base64.getEncoder().encode(data)));
// BASE64Encoder encoder = new BASE64Encoder();
// System.out.println("***************图片编码sun.misc:"+encoder.encode(data));
return new String(Base64.getEncoder().encode(data));
// BASE64Encoder encoder = new BASE64Encoder();
// return encoder.encode(data);
}
/**
* 获取营业执照识别数据
* @param result
* @return
*/
public MerchantOCRInfo getLicenceInfo(String result){
String data = JSONObject.fromObject(result).get("data").toString();
String itemList = JSONObject.fromObject(data).get("item_list").toString();
JSONArray array = JSONArray.fromObject(itemList);
MerchantOCRInfo ocrInfo = new MerchantOCRInfo();
for (int i = 0; i < array.size(); i++){
JSONObject item = JSONObject.fromObject(array.get(i).toString());
String itemKey = item.get("item").toString();
if("注册号".equals(itemKey)){
String itemValue = item.get("itemstring").toString();
ocrInfo.setRegisterNumber(itemValue);
}else if("法定代表人".equals(itemKey)){
String itemValue = item.get("itemstring").toString();
ocrInfo.setLegalPerson(itemValue);
}else if("公司名称".equals(itemKey)){
String itemValue = item.get("itemstring").toString();
ocrInfo.setCompanyName(itemValue);
}else if("地址".equals(itemKey)){
String itemValue = item.get("itemstring").toString();
ocrInfo.setCompanyAddress(itemValue);
}else if("营业期限".equals(itemKey)){
String itemValue = item.get("itemstring").toString();
ocrInfo.setBusinessTerm(itemValue);
}
}
return ocrInfo;
}
/**
* 获取身份证识别数据
* @param result
* @return
*/
public MerchantOCRInfo getIDCardInfo(String result,int cardType){
MerchantOCRInfo ocrInfo = new MerchantOCRInfo();
if(cardType == 0){ //正面
String data = JSONObject.fromObject(result).get("data").toString();
JSONObject dataObject = JSONObject.fromObject(data);
ocrInfo.setName(dataObject.get("name").toString());
ocrInfo.setSex(dataObject.get("sex").toString());
ocrInfo.setNation(dataObject.get("nation").toString());
ocrInfo.setBirth(dataObject.get("birth").toString());
ocrInfo.setAddress(dataObject.get("address").toString());
ocrInfo.setId(dataObject.get("id").toString());
}else if(cardType == 1){ //反面
String data = JSONObject.fromObject(result).get("data").toString();
JSONObject dataObject = JSONObject.fromObject(data);
ocrInfo.setAuthority(dataObject.get("authority").toString());
ocrInfo.setValidDate(dataObject.get("valid_date").toString());
}
return ocrInfo;
}
}
腾讯OCR识别营业执照、身份证工具类
猜你喜欢
转载自blog.csdn.net/kanglovejava/article/details/80271137
今日推荐
周排行