背景:
我们的小程序由于之前没接入微信官方提供的信息安全接口,导致被警告,下掉了被搜索的权限(手动狗头)。然后这两天就花时间在接入上面了,遇到的坑还是挺多的。
微信原开发文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.imgSecCheck.html主要是有两种东西:1、文本消息审核:msgSecCheck2、图片审核:imgSecCheck其实还有一个:mediaCheckAsync,这个是异步审核的,文档下面说:异步检测结果在 30 分钟内会推送到你的消息接收服务器。我们的小程序是一个社区,需要同步检测,所以这个就pass了(狗头)。
开发过程:
0、这两个接口的统一返回结果:
![2d21b08dd6b11bb325fac164cdc7b9c3.png](https://i-blog.csdnimg.cn/blog_migrate/ab4c2920a3c85eb6d4e204d1961efc5f.jpeg)
返回结果
所以就返回的字符串判断为0就完事了。
1、获取token
这两个接口都需要获取到access_token,获取方式就这个东西来:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
2-1、文本审核
文本审核的就比较粗暴了,POST请求到:https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKENbody里面传递一个{"content":"hello world"}看返回结果就完事了。
2-2、图片审核
那就是比较麻烦的图片审核接口了。开发文档里面可以看到
![86d3dd508fa8a2973e36dc6d4bb1af3a.png](https://i-blog.csdnimg.cn/blog_migrate/a3a9e7bbb827648dda100e3cccf177e2.jpeg)
图片审核接口请求参数
他是需要一个FormData的参数,这个就比较恶心了,不能直接把图片的url传过去,需要设置一个类似file的文件。这个后面要处理也不是特别难,我们用的是HttpClient,先接收url参数,再使用HttpGet(HttpPost也行),返回url的response,接着他里面有一个获取文件流的方法,简单不设置参数的写法:
![dbe33aefa212aaa6dea328e497b185c5.png](https://i-blog.csdnimg.cn/blog_migrate/9a7ed5d4266cf25db26ec23c8bd74076.jpeg)
HttpClient请求图片url获取流对象
然后需要将流转化为file
![a2fd71f3ec918ba1e5829298fc54f0c4.png](https://i-blog.csdnimg.cn/blog_migrate/1bce0eb150ca65dae121c6c2883908ca.jpeg)
![7cc54b4de5f23b30dd81815e5c92f01a.png](https://i-blog.csdnimg.cn/blog_migrate/3538880334eda32a5cca3ae1e9b559bc.jpeg)
都是一些最基本的,并没有设置参数啥的
结果:接入微信安全信息审核的接口,就只要实现上面,分别就可以实现文本、图片的审核了。但是现在就存在一个问题,图片的审核接口都是只能一张一张审核的,还需要解析成流再下载成文件,后面测试的时候发现,解析出这样一个文件并调用接口返回参数的步骤差不多需要2秒钟的时间。我们的东西像是B博一样,一次性可以发布多张图片的,这样一张一张审核就会花费不少的时间,用户要等待响应,体验就极差。但是不审核又不行,不然他们不给你程序过呀。
在这个基础上面,就想出能不能有增加用户体验的效果的东西来实现这种功能,后来就想到了用多线程来实现,一次性弄几个线程来分别执行一张图片的审核。但是单单声明出多个子线程,后面要怎么汇聚起来得到结果呢?后来又想到,去年刚毕业找工作的时候,发了疯地看一下面试题,特别是一些并发之类的东西,突然就想起来了JUC下面的工具包有个CountDownLatch这玩意。
通俗一点对它的解释就是:声明出某个数值比如为10,共有10个子线程,每一个子线程执行完之后,10就减1,10个子线程执行完之后,10就变成0,这个时候主线程就等待子线程都执行完,才执行后面的流程。所以,我们有几张图片,就在线程池里面声明出几个子线程,子线程中没有报错的话,就CountDownLatch - 1,主线程最后判断等于0的话,才能执行下一步,如果不为0,说明其中有子线程调用微信审核接口出错,有违规图片。
代码截图
![3412868c28d25a2e869804e0272630f9.png](https://i-blog.csdnimg.cn/blog_migrate/a7a478d9b035f061a27cf427cf3645e6.jpeg)
HttpClient的配置和线程池、CountDownLatch的声明
![822fd824bd40aa3815687a6093eb68ca.png](https://i-blog.csdnimg.cn/blog_migrate/23c6996ea966ac46cc9c53955f924712.jpeg)
循环声明出子线程
![fcc2804b332ea784ab726e5f4e863ec1.png](https://i-blog.csdnimg.cn/blog_migrate/070fb924ca1d175e34937b53156fd0c6.jpeg)
创建临时文件
![e2e408a828240d015c68e7e0a2c049ab.png](https://i-blog.csdnimg.cn/blog_migrate/dfb60585e7bb640b1e2c38cb459982de.jpeg)
调用审核接口
![e82ead07e7253f530ef34846f908d390.png](https://i-blog.csdnimg.cn/blog_migrate/b869594deac7dc17d99a92baafaee8db.jpeg)
Latch逻辑
![739e1d1dd4dbebd1ff3873469940df5f.png](https://i-blog.csdnimg.cn/blog_migrate/7f72b7cd5f5b8929c245f0750b353a9a.jpeg)
主线程等待
(狗头)上面都没有怎么配置一些header、超时多久,还有一些乱七八糟的东西,为了早点接完这个接口提交申诉也只能这样了,后面有时间的话再看一下能不能优化了。
PS:小程序安全审核接口是真的……谁用谁知道系列(狗头)