Browse Source

:new: #1527 微信小程序增加OCR身份证识别和银行卡识别等接口

Binary Wang 4 years ago
parent
commit
978ada7373
25 changed files with 756 additions and 176 deletions
  1. 2 1
      spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java
  2. 20 20
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
  3. 29 0
      weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBankCardResult.java
  4. 10 9
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java
  5. 10 10
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java
  6. 6 6
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java
  7. 11 10
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java
  8. 5 6
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrIdCardResult.java
  9. 4 4
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java
  10. 6 6
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java
  11. 0 0
      weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
  12. 2 2
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
  13. 6 0
      weixin-java-miniapp/pom.xml
  14. 7 0
      weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
  15. 7 0
      weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
  16. 151 0
      weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java
  17. 385 0
      weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImplTest.java
  18. 17 0
      weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/test/TestConstants.java
  19. 3 2
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
  20. 4 3
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
  21. 32 32
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java
  22. 0 28
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java
  23. 12 12
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
  24. 25 25
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
  25. 2 0
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java

+ 2 - 1
spring-boot-starters/wx-java-mp-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/mp/config/WxMpServiceAutoConfiguration.java

@@ -1,6 +1,7 @@
 package com.binarywang.spring.starter.wxjava.mp.config;
 
 import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties;
+import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.mp.api.*;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceHttpClientImpl;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
@@ -176,7 +177,7 @@ public class WxMpServiceAutoConfiguration {
 
   @Bean
   @Deprecated
-  public WxMpOcrService wxMpOcrService(WxMpService wxMpService) {
+  public WxOcrService wxMpOcrService(WxMpService wxMpService) {
     return wxMpService.getOcrService();
   }
 

+ 20 - 20
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java

@@ -1,12 +1,12 @@
-package me.chanjar.weixin.mp.api;
+package me.chanjar.weixin.common.api;
 
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrBankCardResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrBizLicenseResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrCommResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult;
 
 import java.io.File;
 
@@ -17,7 +17,7 @@ import java.io.File;
  * @author <a href="https://github.com/binarywang">Binary Wang</a>
  * @date 2019-06-22
  */
-public interface WxMpOcrService {
+public interface WxOcrService {
 
   /**
    * 身份证OCR识别接口.
@@ -26,7 +26,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrIdCardResult
    * @throws WxErrorException .
    */
-  WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException;
+  WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException;
 
   /**
    * 身份证OCR识别接口.
@@ -35,7 +35,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrIdCardResult
    * @throws WxErrorException .
    */
-  WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException;
+  WxOcrIdCardResult idCard(File imgFile) throws WxErrorException;
 
   /**
    * 银行卡OCR识别接口
@@ -44,7 +44,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrBankCardResult
    * @throws WxErrorException .
    */
-  WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException;
+  WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException;
 
   /**
    * 银行卡OCR识别接口
@@ -53,7 +53,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrBankCardResult
    * @throws WxErrorException .
    */
-  WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException;
+  WxOcrBankCardResult bankCard(File imgFile) throws WxErrorException;
 
   /**
    * 行驶证OCR识别接口
@@ -62,7 +62,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrDrivingResult
    * @throws WxErrorException .
    */
-  WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException;
+  WxOcrDrivingResult driving(String imgUrl) throws WxErrorException;
 
   /**
    * 行驶证OCR识别接口
@@ -71,7 +71,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrDrivingResult
    * @throws WxErrorException .
    */
-  WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException;
+  WxOcrDrivingResult driving(File imgFile) throws WxErrorException;
 
   /**
    * 驾驶证OCR识别接口
@@ -80,7 +80,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrDrivingLicenseResult
    * @throws WxErrorException .
    */
-  WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException;
+  WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException;
 
   /**
    * 驾驶证OCR识别接口
@@ -89,7 +89,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrDrivingLicenseResult
    * @throws WxErrorException .
    */
-  WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException;
+  WxOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException;
 
   /**
    * 营业执照OCR识别接口
@@ -98,7 +98,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrBizLicenseResult
    * @throws WxErrorException .
    */
-  WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException;
+  WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException;
 
   /**
    * 营业执照OCR识别接口
@@ -107,7 +107,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrBizLicenseResult
    * @throws WxErrorException .
    */
-  WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException;
+  WxOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException;
 
   /**
    * 通用印刷体OCR识别接口
@@ -117,7 +117,7 @@ public interface WxMpOcrService {
    * @return WxMpOcrCommResult
    * @throws WxErrorException .
    */
-  WxMpOcrCommResult comm(String imgUrl) throws WxErrorException;
+  WxOcrCommResult comm(String imgUrl) throws WxErrorException;
 
   /**
    * 通用印刷体OCR识别接口
@@ -127,5 +127,5 @@ public interface WxMpOcrService {
    * @return WxMpOcrCommResult
    * @throws WxErrorException .
    */
-  WxMpOcrCommResult comm(File imgFile) throws WxErrorException;
+  WxOcrCommResult comm(File imgFile) throws WxErrorException;
 }

+ 29 - 0
weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/ocr/WxOcrBankCardResult.java

@@ -0,0 +1,29 @@
+package me.chanjar.weixin.common.bean.ocr;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 银行卡OCR识别结果
+ *
+ * @author Theo Nie
+ */
+@Data
+public class WxOcrBankCardResult implements Serializable {
+
+  private static final long serialVersionUID = 554136620394204143L;
+  @SerializedName("number")
+  private String number;
+
+  @Override
+  public String toString() {
+    return WxGsonBuilder.create().toJson(this);
+  }
+
+  public static WxOcrBankCardResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxOcrBankCardResult.class);
+  }
+}

+ 10 - 9
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBizLicenseResult.java

@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 
@@ -10,7 +10,7 @@ import java.io.Serializable;
  * @author Theo Nie
  */
 @Data
-public class WxMpOcrBizLicenseResult implements Serializable {
+public class WxOcrBizLicenseResult implements Serializable {
   private static final long serialVersionUID = -5007671093920178291L;
 
   /**
@@ -82,26 +82,27 @@ public class WxMpOcrBizLicenseResult implements Serializable {
    * 图片大小
    */
   @SerializedName("img_size")
-  private WxMpOcrImgSize imgSize;
+  private WxOcrImgSize imgSize;
 
-  public static WxMpOcrBizLicenseResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrBizLicenseResult.class);
+  public static WxOcrBizLicenseResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxOcrBizLicenseResult.class);
   }
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 
   @Data
   public static class CertPosition implements Serializable {
     private static final long serialVersionUID = 290286813344131863L;
+
     @SerializedName("pos")
-    private WxMpOcrPos pos;
+    private WxOcrPos pos;
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 }

+ 10 - 10
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrCommResult.java

@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 import java.util.List;
@@ -11,35 +11,35 @@ import java.util.List;
  * @author Theo Nie
  */
 @Data
-public class WxMpOcrCommResult implements Serializable {
+public class WxOcrCommResult implements Serializable {
   private static final long serialVersionUID = 455833771627756440L;
 
   @SerializedName("img_size")
-  private WxMpOcrImgSize imgSize;
+  private WxOcrImgSize imgSize;
   @SerializedName("items")
   private List<Items> items;
 
-  public static WxMpOcrCommResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrCommResult.class);
+  public static WxOcrCommResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxOcrCommResult.class);
   }
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 
   @Data
   public static class Items implements Serializable {
-
     private static final long serialVersionUID = 3066181677009102791L;
+
     @SerializedName("text")
     private String text;
     @SerializedName("pos")
-    private WxMpOcrPos pos;
+    private WxOcrPos pos;
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 }

+ 6 - 6
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingLicenseResult.java

@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 
@@ -10,7 +10,7 @@ import java.io.Serializable;
  * @author Theo Nie
  */
 @Data
-public class WxMpOcrDrivingLicenseResult implements Serializable {
+public class WxOcrDrivingLicenseResult implements Serializable {
   private static final long serialVersionUID = -6984670645802585738L;
 
   /**
@@ -71,10 +71,10 @@ public class WxMpOcrDrivingLicenseResult implements Serializable {
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 
-  public static WxMpOcrDrivingLicenseResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrDrivingLicenseResult.class);
+  public static WxOcrDrivingLicenseResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxOcrDrivingLicenseResult.class);
   }
 }

+ 11 - 10
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrDrivingResult.java

@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 
@@ -10,9 +10,9 @@ import java.io.Serializable;
  * @author Theo Nie
  */
 @Data
-public class WxMpOcrDrivingResult implements Serializable {
-
+public class WxOcrDrivingResult implements Serializable {
   private static final long serialVersionUID = -7477484374200211303L;
+
   /**
    * 车牌号码
    */
@@ -107,26 +107,27 @@ public class WxMpOcrDrivingResult implements Serializable {
    * 图片大小
    */
   @SerializedName("img_size")
-  private WxMpOcrImgSize imgSize;
+  private WxOcrImgSize imgSize;
 
   @Data
   public static class CardPosition implements Serializable {
     private static final long serialVersionUID = 2884515165228160517L;
+
     @SerializedName("pos")
-    private WxMpOcrPos pos;
+    private WxOcrPos pos;
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 
-  public static WxMpOcrDrivingResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrDrivingResult.class);
+  public static WxOcrDrivingResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxOcrDrivingResult.class);
   }
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 }

+ 5 - 6
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrIdCardResult.java

@@ -1,9 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 
@@ -14,7 +13,7 @@ import java.io.Serializable;
  * @date 2019-06-23
  */
 @Data
-public class WxMpOcrIdCardResult implements Serializable {
+public class WxOcrIdCardResult implements Serializable {
   private static final long serialVersionUID = 8184352486986729980L;
 
   @SerializedName("type")
@@ -26,8 +25,8 @@ public class WxMpOcrIdCardResult implements Serializable {
   @SerializedName("valid_date")
   private String validDate;
 
-  public static WxMpOcrIdCardResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrIdCardResult.class);
+  public static WxOcrIdCardResult fromJson(String json) {
+    return WxGsonBuilder.create().fromJson(json, WxOcrIdCardResult.class);
   }
 
 }

+ 4 - 4
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrImgSize.java

@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 
@@ -10,7 +10,7 @@ import java.io.Serializable;
  * @author Theo Nie
  */
 @Data
-public class WxMpOcrImgSize implements Serializable {
+public class WxOcrImgSize implements Serializable {
   private static final long serialVersionUID = 5234409123551074168L;
 
   @SerializedName("w")
@@ -20,6 +20,6 @@ public class WxMpOcrImgSize implements Serializable {
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 }

+ 6 - 6
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrPos.java

@@ -1,8 +1,8 @@
-package me.chanjar.weixin.mp.bean.ocr;
+package me.chanjar.weixin.common.bean.ocr;
 
 import com.google.gson.annotations.SerializedName;
 import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
 
 import java.io.Serializable;
 
@@ -10,7 +10,7 @@ import java.io.Serializable;
  * @author Theo Nie
  */
 @Data
-public class WxMpOcrPos implements Serializable {
+public class WxOcrPos implements Serializable {
   private static final long serialVersionUID = 4204160206873907920L;
 
   @SerializedName("left_top")
@@ -24,11 +24,11 @@ public class WxMpOcrPos implements Serializable {
 
   @Override
   public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
+    return WxGsonBuilder.create().toJson(this);
   }
 
   @Data
-  public static class Coordinate implements Serializable{
+  public static class Coordinate implements Serializable {
     private static final long serialVersionUID = 8675059935386304399L;
     @SerializedName("x")
     private int x;
@@ -37,7 +37,7 @@ public class WxMpOcrPos implements Serializable {
 
     @Override
     public String toString() {
-      return WxMpGsonBuilder.create().toJson(this);
+      return WxGsonBuilder.create().toJson(this);
     }
   }
 }

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java → weixin-java-common/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java


+ 2 - 2
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java

@@ -12,8 +12,8 @@ import java.io.IOException;
 /**
  * .
  *
- * @author   zhayueran
- * @date  2019/6/27 15:06
+ * @author zhayueran
+ * @date 2019/6/27 15:06
  */
 public abstract class OcrDiscernRequestExecutor<H, P> implements RequestExecutor<String, File> {
   protected RequestHttp<H, P> requestHttp;

+ 6 - 0
weixin-java-miniapp/pom.xml

@@ -90,6 +90,12 @@
       <version>1.0.0</version>
       <optional>true</optional>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>3.3.3</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>

+ 7 - 0
weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java

@@ -2,6 +2,7 @@ package cn.binarywang.wx.miniapp.api;
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.common.service.WxService;
 import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
@@ -288,4 +289,10 @@ public interface WxMaService extends WxService {
    */
   WxMaLiveGoodsService getLiveGoodsService();
 
+  /**
+   * 获取ocr实现接口服务对象
+   *
+   * @return 。
+   */
+  WxOcrService getOcrService();
 }

+ 7 - 0
weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java

@@ -10,6 +10,7 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.error.WxError;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -57,6 +58,7 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
   private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this);
   private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this);
   private final WxMaLiveGoodsService liveGoodsService = new WxMaLiveGoodsServiceImpl(this);
+  private final WxOcrService ocrService = new WxMaOcrServiceImpl(this);
 
   private int retrySleepMillis = 1000;
   private int maxRetryTimes = 5;
@@ -401,4 +403,9 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
     return this.liveGoodsService;
   }
 
+  @Override
+  public WxOcrService getOcrService() {
+    return this.ocrService;
+  }
+
 }

+ 151 - 0
weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImpl.java

@@ -0,0 +1,151 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.api.WxOcrService;
+import me.chanjar.weixin.common.bean.ocr.*;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * ocr 接口实现.
+ *
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ * @date 2019-06-22
+ */
+@RequiredArgsConstructor
+public class WxMaOcrServiceImpl implements WxOcrService {
+  private static final String IDCARD = "https://api.weixin.qq.com/cv/ocr/idcard?img_url=%s";
+  private static final String FILEIDCARD = "https://api.weixin.qq.com/cv/ocr/idcard";
+  private static final String BANK_CARD = "https://api.weixin.qq.com/cv/ocr/bankcard?img_url=%s";
+  private static final String FILE_BANK_CARD = "https://api.weixin.qq.com/cv/ocr/bankcard";
+  private static final String DRIVING = "https://api.weixin.qq.com/cv/ocr/driving?img_url=%s";
+  private static final String FILE_DRIVING = "https://api.weixin.qq.com/cv/ocr/driving";
+  private static final String DRIVING_LICENSE = "https://api.weixin.qq.com/cv/ocr/drivinglicense?img_url=%s";
+  private static final String FILE_DRIVING_LICENSE = "https://api.weixin.qq.com/cv/ocr/drivinglicense";
+  private static final String BIZ_LICENSE = "https://api.weixin.qq.com/cv/ocr/bizlicense?img_url=%s";
+  private static final String FILE_BIZ_LICENSE = "https://api.weixin.qq.com/cv/ocr/bizlicense";
+  private static final String COMM = "https://api.weixin.qq.com/cv/ocr/comm?img_url=%s";
+  private static final String FILE_COMM = "https://api.weixin.qq.com/cv/ocr/comm";
+
+  private final WxMaService mainService;
+
+  @Override
+  public WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.mainService.get(String.format(IDCARD, imgUrl), null);
+    return WxOcrIdCardResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrIdCardResult idCard(File imgFile) throws WxErrorException {
+    String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
+      FILEIDCARD, imgFile);
+    return WxOcrIdCardResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.mainService.get(String.format(BANK_CARD, imgUrl), null);
+    return WxOcrBankCardResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrBankCardResult bankCard(File imgFile) throws WxErrorException {
+    String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
+      FILE_BANK_CARD, imgFile);
+    return WxOcrBankCardResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrDrivingResult driving(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.mainService.get(String.format(DRIVING, imgUrl), null);
+    return WxOcrDrivingResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrDrivingResult driving(File imgFile) throws WxErrorException {
+    String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
+      FILE_DRIVING, imgFile);
+    return WxOcrDrivingResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.mainService.get(String.format(DRIVING_LICENSE, imgUrl), null);
+    return WxOcrDrivingLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException {
+    String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
+      FILE_DRIVING_LICENSE, imgFile);
+    return WxOcrDrivingLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.mainService.get(String.format(BIZ_LICENSE, imgUrl), null);
+    return WxOcrBizLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException {
+    String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
+      FILE_BIZ_LICENSE, imgFile);
+    return WxOcrBizLicenseResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrCommResult comm(String imgUrl) throws WxErrorException {
+    try {
+      imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
+    } catch (UnsupportedEncodingException e) {
+      // ignore cannot happen
+    }
+
+    final String result = this.mainService.get(String.format(COMM, imgUrl), null);
+    return WxOcrCommResult.fromJson(result);
+  }
+
+  @Override
+  public WxOcrCommResult comm(File imgFile) throws WxErrorException {
+    String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
+      FILE_COMM, imgFile);
+    return WxOcrCommResult.fromJson(result);
+  }
+}

+ 385 - 0
weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaOcrServiceImplTest.java

@@ -0,0 +1,385 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import cn.binarywang.wx.miniapp.test.TestConstants;
+import me.chanjar.weixin.common.bean.ocr.*;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.fs.FileUtils;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import javax.inject.Inject;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author <a href="https://github.com/binarywang">Binary Wang</a>
+ * @date 2020-07-05
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaOcrServiceImplTest {
+  @Inject
+  private WxMaService service;
+
+  @Test
+  public void testIdCard() throws WxErrorException {
+    final WxOcrIdCardResult result = this.service.getOcrService().idCard(
+      "https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testIdCard2() throws Exception {
+    InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxOcrIdCardResult result = this.service.getOcrService().idCard(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBankCard() throws WxErrorException {
+    final WxOcrBankCardResult result = this.service.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBankCard2() throws Exception {
+    InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxOcrBankCardResult result = this.service.getOcrService().bankCard(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDriving() throws WxErrorException {
+    final WxOcrDrivingResult result = this.service.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDriving2() throws Exception {
+    InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxOcrDrivingResult result = this.service.getOcrService().driving(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDrivingLicense() throws WxErrorException {
+    final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testDrivingLicense2() throws Exception {
+    InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBizLicense() throws WxErrorException {
+    final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testBizLicense2() throws Exception {
+    InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testComm() throws WxErrorException {
+    final WxOcrCommResult result = this.service.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  @Test
+  public void testComm2() throws Exception {
+    InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+    File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+    final WxOcrCommResult result = this.service.getOcrService().comm(tempFile);
+    assertThat(result).isNotNull();
+    System.out.println(result);
+  }
+
+  private InputStream getImageStream(String url) {
+    try {
+      HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+      connection.setReadTimeout(5000);
+      connection.setConnectTimeout(5000);
+      connection.setRequestMethod("GET");
+      if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
+        return connection.getInputStream();
+      }
+    } catch (IOException e) {
+      System.out.println("获取网络图片出现异常,图片路径为:" + url);
+    }
+    return null;
+  }
+
+  public static class MockTest {
+    private final WxMaService wxService = mock(WxMaService.class);
+
+    @Test
+    public void testIdCard() throws Exception {
+      String returnJson = "{\"type\":\"Back\",\"name\":\"张三\",\"id\":\"110101199909090099\",\"valid_date\":\"20110101-20210201\"}";
+
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMaOcrServiceImpl wxMpOcrService = new WxMaOcrServiceImpl(wxService);
+
+      final WxOcrIdCardResult result = wxMpOcrService.idCard("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testBankCard() throws Exception {
+      String returnJson = "{\"number\":\"24234234345234\"}";
+
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService);
+      final WxOcrBankCardResult result = ocrService.bankCard("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testDriving() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0,\n" +
+        "    \"errmsg\": \"ok\",\n" +
+        "    \"plate_num\": \"粤xxxxx\", //车牌号码\n" +
+        "    \"vehicle_type\": \"小型普通客车\", //车辆类型\n" +
+        "    \"owner\": \"东莞市xxxxx机械厂\", //所有人\n" +
+        "    \"addr\": \"广东省东莞市xxxxx号\", //住址\n" +
+        "    \"use_character\": \"非营运\", //使用性质\n" +
+        "    \"model\": \"江淮牌HFCxxxxxxx\", //品牌型号\n" +
+        "    \"vin\": \"LJ166xxxxxxxx51\", //车辆识别代号\n" +
+        "    \"engine_num\": \"J3xxxxx3\", //发动机号码\n" +
+        "    \"register_date\": \"2018-07-06\", //注册日期\n" +
+        "    \"issue_date\": \"2018-07-01\", //发证日期\n" +
+        "    \"plate_num_b\": \"粤xxxxx\", //车牌号码\n" +
+        "    \"record\": \"441xxxxxx3\", //号牌\n" +
+        "    \"passengers_num\": \"7人\", //核定载人数\n" +
+        "    \"total_quality\": \"2700kg\", //总质量\n" +
+        "    \"prepare_quality\": \"1995kg\", //整备质量\n" +
+        "    \"overall_size\": \"4582x1795x1458mm\", //外廓尺寸\n" +
+        "    \"card_position_front\": {//卡片正面位置(检测到卡片正面才会返回)\n" +
+        "        \"pos\": {\n" +
+        "            \"left_top\": {\n" +
+        "                \"x\": 119, \n" +
+        "                \"y\": 2925\n" +
+        "            }, \n" +
+        "            \"right_top\": {\n" +
+        "                \"x\": 1435, \n" +
+        "                \"y\": 2887\n" +
+        "            }, \n" +
+        "            \"right_bottom\": {\n" +
+        "                \"x\": 1435, \n" +
+        "                \"y\": 3793\n" +
+        "            }, \n" +
+        "            \"left_bottom\": {\n" +
+        "                \"x\": 119, \n" +
+        "                \"y\": 3831\n" +
+        "            }\n" +
+        "        }\n" +
+        "    }, \n" +
+        "    \"card_position_back\": {//卡片反面位置(检测到卡片反面才会返回)\n" +
+        "        \"pos\": {\n" +
+        "            \"left_top\": {\n" +
+        "                \"x\": 1523, \n" +
+        "                \"y\": 2849\n" +
+        "            }, \n" +
+        "            \"right_top\": {\n" +
+        "                \"x\": 2898, \n" +
+        "                \"y\": 2887\n" +
+        "            }, \n" +
+        "            \"right_bottom\": {\n" +
+        "                \"x\": 2927, \n" +
+        "                \"y\": 3831\n" +
+        "            }, \n" +
+        "            \"left_bottom\": {\n" +
+        "                \"x\": 1523, \n" +
+        "                \"y\": 3831\n" +
+        "            }\n" +
+        "        }\n" +
+        "    }, \n" +
+        "    \"img_size\": {//图片大小\n" +
+        "        \"w\": 3120, \n" +
+        "        \"h\": 4208\n" +
+        "    }\n" +
+        "}";
+
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService);
+
+      final WxOcrDrivingResult result = ocrService.driving("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testDrivingLicense() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0,\n" +
+        "    \"errmsg\": \"ok\",\n" +
+        "    \"id_num\": \"660601xxxxxxxx1234\", //证号\n" +
+        "    \"name\": \"张三\", //姓名\n" +
+        "    \"sex\": \"男\", //性别\n" +
+        "    \"nationality\": \"中国\", //国籍\n" +
+        "    \"address\": \"广东省东莞市xxxxx号\", //住址\n" +
+        "    \"birth_date\": \"1990-12-21\", //出生日期\n" +
+        "    \"issue_date\": \"2012-12-21\", //初次领证日期\n" +
+        "    \"car_class\": \"C1\", //准驾车型\n" +
+        "    \"valid_from\": \"2018-07-06\", //有效期限起始日\n" +
+        "    \"valid_to\": \"2020-07-01\", //有效期限终止日\n" +
+        "    \"official_seal\": \"xx市公安局公安交通管理局\" //印章文字\n" +
+        "}";
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMaOcrServiceImpl wxMpOcrService = new WxMaOcrServiceImpl(wxService);
+
+      final WxOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testBizLicense() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0, \n" +
+        "    \"errmsg\": \"ok\", \n" +
+        "    \"reg_num\": \"123123\",//注册号\n" +
+        "    \"serial\": \"123123\",//编号\n" +
+        "    \"legal_representative\": \"张三\", //法定代表人姓名\n" +
+        "    \"enterprise_name\": \"XX饮食店\", //企业名称\n" +
+        "    \"type_of_organization\": \"个人经营\", //组成形式\n" +
+        "    \"address\": \"XX市XX区XX路XX号\", //经营场所/企业住所\n" +
+        "    \"type_of_enterprise\": \"xxx\", //公司类型\n" +
+        "    \"business_scope\": \"中型餐馆(不含凉菜、不含裱花蛋糕,不含生食海产品)。\", //经营范围\n" +
+        "    \"registered_capital\": \"200万\", //注册资本\n" +
+        "    \"paid_in_capital\": \"200万\", //实收资本\n" +
+        "    \"valid_period\": \"2019年1月1日\", //营业期限\n" +
+        "    \"registered_date\": \"2018年1月1日\", //注册日期/成立日期\n" +
+        "    \"cert_position\": { //营业执照位置\n" +
+        "        \"pos\": {\n" +
+        "            \"left_top\": {\n" +
+        "                \"x\": 155, \n" +
+        "                \"y\": 191\n" +
+        "            }, \n" +
+        "            \"right_top\": {\n" +
+        "                \"x\": 725, \n" +
+        "                \"y\": 157\n" +
+        "            }, \n" +
+        "            \"right_bottom\": {\n" +
+        "                \"x\": 743, \n" +
+        "                \"y\": 512\n" +
+        "            }, \n" +
+        "            \"left_bottom\": {\n" +
+        "                \"x\": 164, \n" +
+        "                \"y\": 525\n" +
+        "            }\n" +
+        "        }\n" +
+        "    }, \n" +
+        "    \"img_size\": { //图片大小\n" +
+        "        \"w\": 966, \n" +
+        "        \"h\": 728\n" +
+        "    }\n" +
+        "}";
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService);
+
+      final WxOcrBizLicenseResult result = ocrService.bizLicense("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+
+    @Test
+    public void testComm() throws Exception {
+      String returnJson = "{\n" +
+        "    \"errcode\": 0, \n" +
+        "    \"errmsg\": \"ok\", \n" +
+        "    \"items\": [ //识别结果\n" +
+        "        {\n" +
+        "            \"text\": \"腾讯\", \n" +
+        "            \"pos\": {\n" +
+        "                \"left_top\": {\n" +
+        "                    \"x\": 575, \n" +
+        "                    \"y\": 519\n" +
+        "                }, \n" +
+        "                \"right_top\": {\n" +
+        "                    \"x\": 744, \n" +
+        "                    \"y\": 519\n" +
+        "                }, \n" +
+        "                \"right_bottom\": {\n" +
+        "                    \"x\": 744, \n" +
+        "                    \"y\": 532\n" +
+        "                }, \n" +
+        "                \"left_bottom\": {\n" +
+        "                    \"x\": 573, \n" +
+        "                    \"y\": 532\n" +
+        "                }\n" +
+        "            }\n" +
+        "        }, \n" +
+        "        {\n" +
+        "            \"text\": \"微信团队\", \n" +
+        "            \"pos\": {\n" +
+        "                \"left_top\": {\n" +
+        "                    \"x\": 670, \n" +
+        "                    \"y\": 516\n" +
+        "                }, \n" +
+        "                \"right_top\": {\n" +
+        "                    \"x\": 762, \n" +
+        "                    \"y\": 517\n" +
+        "                }, \n" +
+        "                \"right_bottom\": {\n" +
+        "                    \"x\": 762, \n" +
+        "                    \"y\": 532\n" +
+        "                }, \n" +
+        "                \"left_bottom\": {\n" +
+        "                    \"x\": 670, \n" +
+        "                    \"y\": 531\n" +
+        "                }\n" +
+        "            }\n" +
+        "        }\n" +
+        "    ], \n" +
+        "    \"img_size\": { //图片大小\n" +
+        "        \"w\": 1280, \n" +
+        "        \"h\": 720\n" +
+        "    }\n" +
+        "}";
+      when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+      final WxMaOcrServiceImpl ocrService = new WxMaOcrServiceImpl(wxService);
+
+      final WxOcrCommResult result = ocrService.comm("abc");
+      assertThat(result).isNotNull();
+      System.out.println(result);
+    }
+  }
+}

+ 17 - 0
weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/test/TestConstants.java

@@ -0,0 +1,17 @@
+package cn.binarywang.wx.miniapp.test;
+
+/**
+ * <pre>
+ * 仅供测试使用的一些常量
+ * Created by Binary Wang on 2017-3-9.
+ * </pre>
+ */
+public class TestConstants {
+  ///////////////////////
+  // 文件类型
+  ///////////////////////
+  public static final String FILE_JPG = "jpeg";
+  public static final String FILE_MP3 = "mp3";
+  public static final String FILE_AMR = "amr";
+  public static final String FILE_MP4 = "mp4";
+}

+ 3 - 2
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java

@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.api;
 
+import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.bean.WxNetCheckResult;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -555,7 +556,7 @@ public interface WxMpService extends WxService {
    *
    * @return WxMpWifiService
    */
-  WxMpOcrService getOcrService();
+  WxOcrService getOcrService();
 
   /**
    * 返回图像处理接口的实现类对象,以方便调用其各个接口.
@@ -688,7 +689,7 @@ public interface WxMpService extends WxService {
    *
    * @param ocrService .
    */
-  void setOcrService(WxMpOcrService ocrService);
+  void setOcrService(WxOcrService ocrService);
 
   /**
    * .

+ 4 - 3
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java

@@ -10,6 +10,7 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.common.bean.WxAccessToken;
 import me.chanjar.weixin.common.bean.WxJsapiSignature;
 import me.chanjar.weixin.common.bean.WxNetCheckResult;
@@ -70,7 +71,7 @@ public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestH
   private final WxMpWifiService wifiService = new WxMpWifiServiceImpl(this);
   private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this);
   private WxMpCommentService commentService = new WxMpCommentServiceImpl(this);
-  private WxMpOcrService ocrService = new WxMpOcrServiceImpl(this);
+  private WxOcrService ocrService = new WxMpOcrServiceImpl(this);
   private WxMpImgProcService imgProcService = new WxMpImgProcServiceImpl(this);
 
   @Getter
@@ -663,7 +664,7 @@ public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestH
   }
 
   @Override
-  public WxMpOcrService getOcrService() {
+  public WxOcrService getOcrService() {
     return this.ocrService;
   }
 
@@ -678,7 +679,7 @@ public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestH
   }
 
   @Override
-  public void setOcrService(WxMpOcrService ocrService) {
+  public void setOcrService(WxOcrService ocrService) {
     this.ocrService = ocrService;
   }
 

+ 32 - 32
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImpl.java

@@ -2,14 +2,14 @@ package me.chanjar.weixin.mp.api.impl;
 
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpOcrService;
+import me.chanjar.weixin.common.api.WxOcrService;
 import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrBankCardResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrBizLicenseResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrCommResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult;
 import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor;
 
 import java.io.File;
@@ -37,11 +37,11 @@ import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Ocr.IDCARD;
  * @date 2019-06-22
  */
 @RequiredArgsConstructor
-public class WxMpOcrServiceImpl implements WxMpOcrService {
+public class WxMpOcrServiceImpl implements WxOcrService {
   private final WxMpService mainService;
 
   @Override
-  public WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException {
+  public WxOcrIdCardResult idCard(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -50,18 +50,18 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
 
     final String result = this.mainService.get(String.format(IDCARD.getUrl(this.mainService.getWxMpConfigStorage()),
       imgUrl), null);
-    return WxMpOcrIdCardResult.fromJson(result);
+    return WxOcrIdCardResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException {
+  public WxOcrIdCardResult idCard(File imgFile) throws WxErrorException {
     String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
       FILEIDCARD.getUrl(this.mainService.getWxMpConfigStorage()), imgFile);
-    return WxMpOcrIdCardResult.fromJson(result);
+    return WxOcrIdCardResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException {
+  public WxOcrBankCardResult bankCard(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -70,18 +70,18 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
 
     final String result = this.mainService.get(String.format(BANK_CARD.getUrl(this.mainService.getWxMpConfigStorage()),
       imgUrl), null);
-    return WxMpOcrBankCardResult.fromJson(result);
+    return WxOcrBankCardResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException {
+  public WxOcrBankCardResult bankCard(File imgFile) throws WxErrorException {
     String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
       FILE_BANK_CARD.getUrl(this.mainService.getWxMpConfigStorage()), imgFile);
-    return WxMpOcrBankCardResult.fromJson(result);
+    return WxOcrBankCardResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException {
+  public WxOcrDrivingResult driving(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -90,18 +90,18 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
 
     final String result = this.mainService.get(String.format(DRIVING.getUrl(this.mainService.getWxMpConfigStorage()),
       imgUrl), null);
-    return WxMpOcrDrivingResult.fromJson(result);
+    return WxOcrDrivingResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException {
+  public WxOcrDrivingResult driving(File imgFile) throws WxErrorException {
     String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
       FILE_DRIVING.getUrl(this.mainService.getWxMpConfigStorage()), imgFile);
-    return WxMpOcrDrivingResult.fromJson(result);
+    return WxOcrDrivingResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException {
+  public WxOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -110,18 +110,18 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
 
     final String result = this.mainService.get(String.format(DRIVING_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()),
       imgUrl), null);
-    return WxMpOcrDrivingLicenseResult.fromJson(result);
+    return WxOcrDrivingLicenseResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException {
+  public WxOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException {
     String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
       FILE_DRIVING_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgFile);
-    return WxMpOcrDrivingLicenseResult.fromJson(result);
+    return WxOcrDrivingLicenseResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException {
+  public WxOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -130,18 +130,18 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
 
     final String result = this.mainService.get(String.format(BIZ_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()),
       imgUrl), null);
-    return WxMpOcrBizLicenseResult.fromJson(result);
+    return WxOcrBizLicenseResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException {
+  public WxOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException {
     String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
       FILE_BIZ_LICENSE.getUrl(this.mainService.getWxMpConfigStorage()), imgFile);
-    return WxMpOcrBizLicenseResult.fromJson(result);
+    return WxOcrBizLicenseResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrCommResult comm(String imgUrl) throws WxErrorException {
+  public WxOcrCommResult comm(String imgUrl) throws WxErrorException {
     try {
       imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name());
     } catch (UnsupportedEncodingException e) {
@@ -150,13 +150,13 @@ public class WxMpOcrServiceImpl implements WxMpOcrService {
 
     final String result = this.mainService.get(String.format(COMM.getUrl(this.mainService.getWxMpConfigStorage()),
       imgUrl), null);
-    return WxMpOcrCommResult.fromJson(result);
+    return WxOcrCommResult.fromJson(result);
   }
 
   @Override
-  public WxMpOcrCommResult comm(File imgFile) throws WxErrorException {
+  public WxOcrCommResult comm(File imgFile) throws WxErrorException {
     String result = this.mainService.execute(OcrDiscernRequestExecutor.create(this.mainService.getRequestHttp()),
       FILE_COMM.getUrl(this.mainService.getWxMpConfigStorage()), imgFile);
-    return WxMpOcrCommResult.fromJson(result);
+    return WxOcrCommResult.fromJson(result);
   }
 }

+ 0 - 28
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/ocr/WxMpOcrBankCardResult.java

@@ -1,28 +0,0 @@
-package me.chanjar.weixin.mp.bean.ocr;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
-
-import java.io.Serializable;
-
-/**
- * 银行卡OCR识别结果
- * @author Theo Nie
- */
-@Data
-public class WxMpOcrBankCardResult implements Serializable {
-
-  private static final long serialVersionUID = 554136620394204143L;
-  @SerializedName("number")
-  private String number;
-
-  @Override
-  public String toString() {
-    return WxMpGsonBuilder.create().toJson(this);
-  }
-
-  public static WxMpOcrBankCardResult fromJson(String json) {
-    return WxMpGsonBuilder.create().fromJson(json, WxMpOcrBankCardResult.class);
-  }
-}

+ 12 - 12
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java

@@ -199,8 +199,8 @@ public interface WxMpApiUrl {
      */
     MENU_ADDCONDITIONAL(API_DEFAULT_HOST_URL, "/cgi-bin/menu/addconditional");
 
-    private String prefix;
-    private String path;
+    private final String prefix;
+    private final String path;
 
     @Override
     public String getUrl(WxMpConfigStorage config) {
@@ -224,8 +224,8 @@ public interface WxMpApiUrl {
      */
     SHOW_QRCODE_WITH_TICKET(MP_DEFAULT_HOST_URL, "/cgi-bin/showqrcode?ticket=%s");
 
-    private String prefix;
-    private String path;
+    private final String prefix;
+    private final String path;
 
     @Override
     public String getUrl(WxMpConfigStorage config) {
@@ -252,8 +252,8 @@ public interface WxMpApiUrl {
      */
     SHAKEAROUND_RELATION_SEARCH(API_DEFAULT_HOST_URL, "/shakearound/relation/search");
 
-    private String prefix;
-    private String path;
+    private final String prefix;
+    private final String path;
 
     @Override
     public String getUrl(WxMpConfigStorage config) {
@@ -272,8 +272,8 @@ public interface WxMpApiUrl {
      */
     SEND_MESSAGE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/template/subscribe");
 
-    private String prefix;
-    private String path;
+    private final String prefix;
+    private final String path;
 
     @Override
     public String getUrl(WxMpConfigStorage config) {
@@ -376,8 +376,8 @@ public interface WxMpApiUrl {
      */
     TAGS_GETIDLIST(API_DEFAULT_HOST_URL, "/cgi-bin/tags/getidlist");
 
-    private String prefix;
-    private String path;
+    private final String prefix;
+    private final String path;
 
     @Override
     public String getUrl(WxMpConfigStorage config) {
@@ -426,8 +426,8 @@ public interface WxMpApiUrl {
      */
     VOICE_QUERY_RESULT_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/voice/queryrecoresultfortext");
 
-    private String prefix;
-    private String path;
+    private final String prefix;
+    private final String path;
 
     @Override
     public String getUrl(WxMpConfigStorage config) {

+ 25 - 25
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java

@@ -5,12 +5,12 @@ import me.chanjar.weixin.common.util.fs.FileUtils;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.test.ApiTestModule;
 import me.chanjar.weixin.mp.api.test.TestConstants;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
-import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrBankCardResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrBizLicenseResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrCommResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingLicenseResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrDrivingResult;
+import me.chanjar.weixin.common.bean.ocr.WxOcrIdCardResult;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
@@ -38,11 +38,11 @@ import static org.mockito.Mockito.when;
 @Guice(modules = ApiTestModule.class)
 public class WxMpOcrServiceImplTest {
   @Inject
-  private WxMpService mpService;
+  private WxMpService service;
 
   @Test
   public void testIdCard() throws WxErrorException {
-    final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(
+    final WxOcrIdCardResult result = this.service.getOcrService().idCard(
       "https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
     assertThat(result).isNotNull();
     System.out.println(result);
@@ -52,14 +52,14 @@ public class WxMpOcrServiceImplTest {
   public void testIdCard2() throws Exception {
     InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(tempFile);
+    final WxOcrIdCardResult result = this.service.getOcrService().idCard(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testBankCard() throws WxErrorException {
-    final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+    final WxOcrBankCardResult result = this.service.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -68,14 +68,14 @@ public class WxMpOcrServiceImplTest {
   public void testBankCard2() throws Exception {
     InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard(tempFile);
+    final WxOcrBankCardResult result = this.service.getOcrService().bankCard(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testDriving() throws WxErrorException {
-    final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6");
+    final WxOcrDrivingResult result = this.service.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -84,14 +84,14 @@ public class WxMpOcrServiceImplTest {
   public void testDriving2() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving(tempFile);
+    final WxOcrDrivingResult result = this.service.getOcrService().driving(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testDrivingLicense() throws WxErrorException {
-    final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+    final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -100,14 +100,14 @@ public class WxMpOcrServiceImplTest {
   public void testDrivingLicense2() throws Exception {
     InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense(tempFile);
+    final WxOcrDrivingLicenseResult result = this.service.getOcrService().drivingLicense(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testBizLicense() throws WxErrorException {
-    final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
+    final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -116,14 +116,14 @@ public class WxMpOcrServiceImplTest {
   public void testBizLicense2() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense(tempFile);
+    final WxOcrBizLicenseResult result = this.service.getOcrService().bizLicense(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
 
   @Test
   public void testComm() throws WxErrorException {
-    final WxMpOcrCommResult result = this.mpService.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
+    final WxOcrCommResult result = this.service.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -132,7 +132,7 @@ public class WxMpOcrServiceImplTest {
   public void testComm2() throws Exception {
     InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
     File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
-    final WxMpOcrCommResult result = this.mpService.getOcrService().comm(tempFile);
+    final WxOcrCommResult result = this.service.getOcrService().comm(tempFile);
     assertThat(result).isNotNull();
     System.out.println(result);
   }
@@ -162,7 +162,7 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrIdCardResult result = wxMpOcrService.idCard("abc");
+      final WxOcrIdCardResult result = wxMpOcrService.idCard("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -174,7 +174,7 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrBankCardResult result = wxMpOcrService.bankCard("abc");
+      final WxOcrBankCardResult result = wxMpOcrService.bankCard("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -249,7 +249,7 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrDrivingResult result = wxMpOcrService.driving("abc");
+      final WxOcrDrivingResult result = wxMpOcrService.driving("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -274,7 +274,7 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc");
+      final WxOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -324,7 +324,7 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc");
+      final WxOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }
@@ -386,7 +386,7 @@ public class WxMpOcrServiceImplTest {
       when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
       final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
 
-      final WxMpOcrCommResult result = wxMpOcrService.comm("abc");
+      final WxOcrCommResult result = wxMpOcrService.comm("abc");
       assertThat(result).isNotNull();
       System.out.println(result);
     }

+ 2 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/ProfitSharingServiceImpl.java

@@ -76,6 +76,8 @@ public class ProfitSharingServiceImpl implements ProfitSharingService {
 
   @Override
   public ProfitSharingQueryResult profitSharingQuery(ProfitSharingQueryRequest request) throws WxPayException {
+    request.setAppid(null);
+
     request.checkAndSign(this.payService.getConfig());
     String url = this.payService.getPayBaseUrl() + "/pay/profitsharingquery";