| @@ -5,12 +5,14 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import me.chanjar.weixin.mp.api.WxMpOcrService; | import me.chanjar.weixin.mp.api.WxMpOcrService; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult; | import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult; | ||||
| import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor; | |||||
| import java.io.File; | import java.io.File; | ||||
| import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||||
| import java.net.URLEncoder; | import java.net.URLEncoder; | ||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
| import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.FILEIDCARD; | |||||
| import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.IDCARD; | import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.IDCARD; | ||||
| /** | /** | ||||
| @@ -37,7 +39,9 @@ public class WxMpOcrServiceImpl implements WxMpOcrService { | |||||
| } | } | ||||
| @Override | @Override | ||||
| public WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) { | |||||
| return null; | |||||
| public WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) throws WxErrorException { | |||||
| String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), String.format(FILEIDCARD.getUrl(this.wxMpService.getWxMpConfigStorage()), | |||||
| imgType.getType()), imgFile); | |||||
| return WxMpOcrIdCardResult.fromJson(result); | |||||
| } | } | ||||
| } | } | ||||
| @@ -440,7 +440,9 @@ public interface WxMpApiUrl { | |||||
| /** | /** | ||||
| * 身份证识别. | * 身份证识别. | ||||
| */ | */ | ||||
| IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s&img_url=%s"); | |||||
| IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s&img_url=%s"), | |||||
| FILEIDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s"); | |||||
| private String prefix; | private String prefix; | ||||
| private String path; | private String path; | ||||
| @@ -0,0 +1,57 @@ | |||||
| package me.chanjar.weixin.mp.util.requestexecuter.ocr; | |||||
| import me.chanjar.weixin.common.error.WxError; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | |||||
| import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler; | |||||
| import org.apache.http.HttpEntity; | |||||
| import org.apache.http.HttpHost; | |||||
| import org.apache.http.client.config.RequestConfig; | |||||
| import org.apache.http.client.methods.CloseableHttpResponse; | |||||
| import org.apache.http.client.methods.HttpPost; | |||||
| import org.apache.http.entity.mime.HttpMultipartMode; | |||||
| import org.apache.http.entity.mime.MultipartEntityBuilder; | |||||
| import org.apache.http.impl.client.CloseableHttpClient; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * @author : zhayueran | |||||
| * @Date: 2019/6/27 14:06 | |||||
| * @Description: | |||||
| */ | |||||
| public class OcrDiscernApacheHttpRequestExecutor extends OcrDiscernRequestExecutor<CloseableHttpClient, HttpHost> { | |||||
| public OcrDiscernApacheHttpRequestExecutor(RequestHttp requestHttp) { | |||||
| super(requestHttp); | |||||
| } | |||||
| @Override | |||||
| public String execute(String uri, File file) throws WxErrorException, IOException { | |||||
| HttpPost httpPost = new HttpPost(uri); | |||||
| if (requestHttp.getRequestHttpProxy() != null) { | |||||
| RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build(); | |||||
| httpPost.setConfig(config); | |||||
| } | |||||
| if (file != null) { | |||||
| HttpEntity entity = MultipartEntityBuilder | |||||
| .create() | |||||
| .addBinaryBody("file", file) | |||||
| .setMode(HttpMultipartMode.RFC6532) | |||||
| .build(); | |||||
| httpPost.setEntity(entity); | |||||
| } | |||||
| try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) { | |||||
| String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | |||||
| WxError error = WxError.fromJson(responseContent); | |||||
| if (error.getErrorCode() != 0) { | |||||
| throw new WxErrorException(error); | |||||
| } | |||||
| return responseContent; | |||||
| } finally { | |||||
| httpPost.releaseConnection(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,36 @@ | |||||
| package me.chanjar.weixin.mp.util.requestexecuter.ocr; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | |||||
| import me.chanjar.weixin.common.util.http.RequestExecutor; | |||||
| import me.chanjar.weixin.common.util.http.RequestHttp; | |||||
| import me.chanjar.weixin.common.util.http.ResponseHandler; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * @author : zhayueran | |||||
| * @Date: 2019/6/27 15:06 | |||||
| * @Description: | |||||
| */ | |||||
| public abstract class OcrDiscernRequestExecutor<H, P> implements RequestExecutor<String, File> { | |||||
| protected RequestHttp<H, P> requestHttp; | |||||
| public OcrDiscernRequestExecutor(RequestHttp requestHttp) { | |||||
| this.requestHttp = requestHttp; | |||||
| } | |||||
| @Override | |||||
| public void execute(String uri, File data, ResponseHandler<String> handler) throws WxErrorException, IOException { | |||||
| handler.handle(this.execute(uri, data)); | |||||
| } | |||||
| public static RequestExecutor<String, File> create(RequestHttp requestHttp) { | |||||
| switch (requestHttp.getRequestType()) { | |||||
| case APACHE_HTTP: | |||||
| return new OcrDiscernApacheHttpRequestExecutor(requestHttp); | |||||
| default: | |||||
| return null; | |||||
| } | |||||
| } | |||||
| } | |||||