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