SpringBoot微信小程序获取手机号、Ali的ocr识别身份证
一、获取手机号
1.1方法
/***
* 通过工具类,获取手机号,前端传获取手机号的code
*/
@GetMapping("/getUserPhone")
public String getUserPhone(String phoneCode){
String phoneNumber = null;
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + redisUtil.get("wx_access_token").toString();
JSONObject body = new JSONObject();
body.put("code", phoneCode);
try {
String ret = httpPostRaw(url, body.toString(), null, null);
if(ret != null && !"".equals(ret)) {
JSONObject json = JSONObject.parseObject(ret);
JSONObject phone_info = json.getJSONObject("phone_info");
phoneNumber = phone_info.getString("phoneNumber");
}
} catch (Exception e) {
e.printStackTrace();
}
return phoneNumber;
}
1.2httpPostRaw请求工具类
/**
* 参数以raw的方式做post请求
*
* @param url
* @param stringJson
* @param headers
* @param encode
* @return
*/
public static String httpPostRaw(String url, String stringJson, Map<String, String> headers, String encode) {
String str = "";
if (encode == null) {
encode = "utf-8";
}
// HttpClients.createDefault()等价于 HttpClientBuilder.create().build();
CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
HttpPost httpost = new HttpPost(url);
// 设置header
httpost.setHeader("Content-type", "application/json");
if (headers != null && headers.size() > 0) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpost.setHeader(entry.getKey(), entry.getValue());
}
}
// 组织请求参数
StringEntity stringEntity = new StringEntity(stringJson, encode);
httpost.setEntity(stringEntity);
String content = null;
CloseableHttpResponse httpResponse = null;
try {
// 响应信息
httpResponse = closeableHttpClient.execute(httpost);
HttpEntity entity = httpResponse.getEntity();
content = EntityUtils.toString(entity, encode);
System.out.println(content);
str = content;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try { // 关闭连接、释放资源
closeableHttpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
二、Ali的ocr识别身份证
2.1引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
2.2AliyunApiOcrService
@Service
public class AliyunApiOcrService {
private static Logger logger = LoggerFactory.getLogger(AliyunApiOcrService.class);
private static final String FIELD_OCR_HOST_IDCARD = "http://dm-51.data.aliyun.com";
private static final String FIELD_OCR_PATH_IDCARD = "/rest/160601/ocr/ocr_idcard.json";
private static final String FIELD_OCR_HOST_HOUSEHOLD = "https://household.market.alicloudapi.com";
private static final String FIELD_OCR_PATH_HOUSEHOLD = "/api/predict/ocr_household_register";
/**
* 获取header信息.
*
* @return
*/
private Map<String, String> getHeaders(){
Map<String, String> headers = new HashMap<String, String>();
// headers.put("Authorization", "APPCODE " + appCode);
headers.put("Authorization", "APPCODE " + "4417262b392e4d1abbe7dd7df04186ac ");
//根据API的要求,定义相对应的Content-Type
headers.put("Content-Type", "application/json; charset=UTF-8");
return headers;
}
/**
* 公共请求方法.
*
* @param host
* @param path
* @param bodys
* @return
*/
private String generalMethod(String host, String path, String bodys){
String result = "";
Map<String, String> headers = getHeaders();
Map<String, String> querys = new HashMap<String, String>();
try {
/**
* 重要提示如下:
* HttpUtils请从
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下载
*
* 相应的依赖请参照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = HttpUtils.doPost(host, path, "POST", headers, querys, bodys);
int stat = response.getStatusLine().getStatusCode();
if (stat != 200) {
System.out.println("Http code: " + stat);
System.out.println("http header error msg: " + response.getFirstHeader("X-Ca-Error-Message"));
System.out.println("Http body error msg:" + EntityUtils.toString(response.getEntity()));
return null;
}
String res = EntityUtils.toString(response.getEntity());
JSONObject res_obj = JSON.parseObject(res);
System.out.println(res_obj.toJSONString());
result = res_obj.toJSONString();
} catch (Exception e) {
logger.info(e.getMessage());
}
return result;
}
/**
* 身份证识别.
*
* @param side
* @param imgBase64
* @return
*/
public String getIdcardOcr(String side, String imgBase64) {
Map<String, String> headers = getHeaders();
Map<String, String> querys = new HashMap<String, String>();
//configure配置
JSONObject configObj = new JSONObject();
configObj.put("side", side);
String config_str = configObj.toString();
// 拼装请求body的json字符串
JSONObject requestObj = new JSONObject();
requestObj.put("image", imgBase64);
if (configObj.size() > 0) {
requestObj.put("configure", config_str);
}
String bodys = requestObj.toString();
String result = generalMethod(FIELD_OCR_HOST_IDCARD, FIELD_OCR_PATH_IDCARD, bodys);
return result;
}
/**
* 户口本识别.
*
* @param imgBase64
* @return
*/
public String getHouseholdOcr(String imgBase64){
// 拼装请求body的json字符串
JSONObject requestObj = new JSONObject();
requestObj.put("image", imgBase64);
String bodys = requestObj.toString();
String result = generalMethod(FIELD_OCR_HOST_HOUSEHOLD, FIELD_OCR_PATH_HOUSEHOLD, bodys);
return result;
}
}
2.3实体类
@Data
public class IDCardForn {
/**正反面标识:face-人脸面/back-国徽面*/
private String job;
private String image;
}
2.4方法
@Autowired
private AliyunApiOcrService aliyunApiOcrService;
@PostMapping(value = "/getIdcardOcr")
public String getIdcardOcr(@RequestBody IDCardForn idCardForn){
String idcardOcr = aliyunApiOcrService.getIdcardOcr(idCardForn.getJob(), idCardForn.getImage());
if(null == idcardOcr){
return "未识别";
}else{
return idcardOcr;
}
}
一个在学习的开发者,勿喷,欢迎交流