腾讯OCR识别营业执照、身份证工具类


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;
    }
}

猜你喜欢

转载自blog.csdn.net/kanglovejava/article/details/80271137