From 8e97b778f3cbca2c65649d8841df511c759bce60 Mon Sep 17 00:00:00 2001 From: Boris Date: Fri, 27 Sep 2019 11:56:03 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20#1217=20=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E5=A2=9E=E5=8A=A0=E6=A0=A1=E9=AA=8C=E5=9B=BE=E7=89=87?= =?UTF-8?q?/=E9=9F=B3=E9=A2=91=E6=98=AF=E5=90=A6=E5=90=AB=E6=9C=89?= =?UTF-8?q?=E8=BF=9D=E6=B3=95=E8=BF=9D=E8=A7=84=E5=86=85=E5=AE=B9=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 添加 微信内容异步检测接口 * 消息route 增加 title 参数 --- .../wx/miniapp/api/WxMaSecCheckService.java | 25 ++++++++++++++++++- .../api/impl/WxMaSecCheckServiceImpl.java | 25 +++++++++++++------ .../bean/WxMaMediaAsyncCheckResult.java | 25 +++++++++++++++++++ .../wx/miniapp/constant/WxMaConstants.java | 16 ++++++++++++ .../message/WxMaMessageRouterRule.java | 19 ++++++++++++++ .../api/impl/WxMaSecCheckServiceImplTest.java | 3 ++- 6 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java index 842d0662f..4c821e071 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java @@ -1,5 +1,6 @@ package cn.binarywang.wx.miniapp.api; +import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult; import java.io.File; import me.chanjar.weixin.common.error.WxErrorException; @@ -18,6 +19,8 @@ public interface WxMaSecCheckService { String MSG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/msg_sec_check"; + String MEDIA_CHECK_ASYNC_URL = "https://api.weixin.qq.com/wxa/media_check_async"; + /** *
    * 校验一张图片是否含有违法违规内容.
@@ -39,5 +42,25 @@ public interface WxMaSecCheckService {
    * 详情请见: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/msgSecCheck.html
    * 
*/ - boolean checkMessage(String msgString); + boolean checkMessage(String msgString) throws WxErrorException; + + + /** + *
+   * 异步校验图片/音频是否含有违法违规内容。
+   * 应用场景举例:
+   * 语音风险识别:社交类用户发表的语音内容检测;
+   * 图片智能鉴黄:涉及拍照的工具类应用(如美拍,识图类应用)用户拍照上传检测;电商类商品上架图片检测;媒体类用户文章里的图片检测等;
+   * 敏感人脸识别:用户头像;媒体类用户文章里的图片检测;社交类用户上传的图片检测等。
+   * 频率限制:
+   * 单个 appId 调用上限为 2000 次/分钟,200,000 次/天;文件大小限制:单个文件大小不超过10M
+   * 详情请见:
+   * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.mediaCheckAsync.html
+   * 
+ * @param mediaUrl 要检测的多媒体url + * @param mediaType 媒体类型,{@link cn.binarywang.wx.miniapp.constant.WxMaConstants.SecCheckMediaType} + * @return + */ + WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl,int mediaType) throws WxErrorException; + } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java index a0d585ccb..c69ca5eb1 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java @@ -2,14 +2,14 @@ package cn.binarywang.wx.miniapp.api.impl; import cn.binarywang.wx.miniapp.api.WxMaSecCheckService; import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult; import com.google.gson.JsonObject; +import java.io.File; import lombok.AllArgsConstructor; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; -import java.io.File; - /** *
  *
@@ -20,6 +20,7 @@ import java.io.File;
  */
 @AllArgsConstructor
 public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
+
   private WxMaService service;
 
   @Override
@@ -31,16 +32,24 @@ public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
   }
 
   @Override
-  public boolean checkMessage(String msgString) {
+  public boolean checkMessage(String msgString) throws WxErrorException {
     JsonObject jsonObject = new JsonObject();
     jsonObject.addProperty("content", msgString);
-    try {
-      this.service.post(MSG_SEC_CHECK_URL, jsonObject.toString());
-    } catch (WxErrorException e) {
-      return false;
-    }
+
+    this.service.post(MSG_SEC_CHECK_URL, jsonObject.toString());
 
     return true;
   }
 
+  @Override
+  public WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl, int mediaType)
+    throws WxErrorException {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("media_url", mediaUrl);
+    jsonObject.addProperty("media_type", mediaType);
+
+    return WxMaMediaAsyncCheckResult
+      .fromJson(this.service.post(MEDIA_CHECK_ASYNC_URL, jsonObject.toString()));
+  }
+
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
new file mode 100644
index 000000000..807f80765
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
@@ -0,0 +1,25 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import java.io.Serializable;
+
+public class WxMaMediaAsyncCheckResult implements Serializable {
+
+  private static final long serialVersionUID = 3928132365399916183L;
+
+  /**
+   * 任务id,用于匹配异步推送结果
+   */
+  @SerializedName("trace_id")
+  private String traceId;
+
+
+  public static WxMaMediaAsyncCheckResult fromJson(String json) {
+    return WxMaGsonBuilder.create().fromJson(json, WxMaMediaAsyncCheckResult.class);
+  }
+
+  public String toJson() {
+    return WxMaGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
index 1ea3595e9..efd2b2291 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
@@ -69,4 +69,20 @@ public class WxMaConstants {
      */
     public static final int ERR_40014 = 40014;
   }
+
+  /**
+   * 内容安全检测的媒体类型
+   */
+  public static final class SecCheckMediaType {
+
+    /**
+     * 音频
+     */
+    public static final int VOICE = 1;
+
+    /**
+     * 图片
+     */
+    public static final int IMAGE = 2;
+  }
 }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
index 5ea3fb8a9..41f3e9957 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
@@ -32,6 +32,8 @@ public class WxMaMessageRouterRule {
 
   private String rContent;
 
+  private String title;
+
   private WxMaMessageMatcher matcher;
 
   private boolean reEnter = false;
@@ -60,6 +62,16 @@ public class WxMaMessageRouterRule {
     return this;
   }
 
+  /**
+   * 标题,发送小程序页卡时有效
+   * @param title
+   * @return
+   */
+  public WxMaMessageRouterRule title(String title){
+    this.title = title;
+    return this;
+  }
+
   /**
    * 如果event等于某值.
    */
@@ -100,6 +112,8 @@ public class WxMaMessageRouterRule {
     return this;
   }
 
+
+
   /**
    * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候.
    */
@@ -164,6 +178,8 @@ public class WxMaMessageRouterRule {
     return end();
   }
 
+
+
   /**
    * 将微信自定义的事件修正为不区分大小写.
    * 比如框架定义的事件常量为click,但微信传递过来的却是CLICK
@@ -183,6 +199,9 @@ public class WxMaMessageRouterRule {
           .matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
         &&
         (this.matcher == null || this.matcher.match(wxMessage))
+        &&
+        (this.title == null || this.title
+          .equals(wxMessage.getTitle() == null ? null : wxMessage.getTitle().trim()))
       ;
   }
 
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
index df9ccaa82..19bca1ca4 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
@@ -38,12 +38,13 @@ public class WxMaSecCheckServiceImplTest {
     return new Object[][]{
       {"特3456书yuuo莞6543李zxcz蒜7782法fgnv级", false},
       {"完2347全dfji试3726测asad感3847知qwez到", false},
+      {"提现&下载&棋牌游戏&网页", false},
       {"hello world!", true}
     };
   }
 
   @Test(dataProvider = "secData")
-  public void testCheckMessage(String msg, boolean result) {
+  public void testCheckMessage(String msg, boolean result) throws WxErrorException {
     assertThat(this.wxService.getSecCheckService()
       .checkMessage(msg))
       .isEqualTo(result);