问题开始

最近,我收到了微信公众平台的通知,说我微信小程序未接入内容安全审核接口,并给了我7天时间整改。当时我并未在意,因为我已接入微信的security.msgSecCheck文本内容审核接口,以为这仅仅只是微信抽风罢了。可是,到了整改期限后,微信小程序官方真的封禁了我微信小程序的各种能力

我这才开始注意此问题

排查及解决过程

为了验证微信是否为误封,我手动提交了一些违法关键词,发现微信接口确实返回的”ok”、”pass”等结果。由此看来,可能确实是我的调用方式或者微信的接口存在问题。我开始在网上查询相关信息。主流的讨论一共有这两种

  • 微信的文本内容安全审核接口就算个装模做样的东西,完全没用。需要购买专业的内容安全审核接口
  • 微信的文本内容安全审核接口需要传入UTF-8的编码类型,否则其他一律返回“ok”,“pass”

对于第一种,如果真的是这样,我可能会选择原地关闭我的微信小程序,因为这种内容安全审核接口确实有点贵,而且按字收费,指不定哪天亏一套房。但是转念一想,如果这接口是个装饰,为什么网上没人骂?应该是我调用方法的问题

对于第二种,我觉得可能,因为该问题大概率是我的调用问题

我尝试对发送数据进行了UTF-8编码(也就是php中的函数utf8_encode),但是并没任何效果,当时的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
use GuzzleHttp;
$http = new GuzzleHttp\Client;
$response = $http->post('https://api.weixin.qq.com/wxa/msg_sec_check', [
'query' => [
"access_token" => $accessToken,
],
'json' => [
'content' => utf8_encode($context),
'version' => 2,
'openid' => $openid,
'scene' => 1
]
]);
$apiResult = json_decode($response->getBody());

当我准备放弃时,突然想到,php中将json转换为json字符串的时候,会自动将UTF-8编码转换为UNICODE编码。那么会不会是GuzzleHttp把我的json数据转换为字符串时,把整个json转换为了UNICODE编码呢?于是,我尝试不使用GuzzleHttp自带的json编码,而是自定义发送body,并设置json编码时禁止将UTF-8编码转换为UNICODE,测试,问题成功解决!当时代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
use GuzzleHttp;
$http = new GuzzleHttp\Client;
$response = $http->post('https://api.weixin.qq.com/wxa/msg_sec_check', [
'query' => [
"access_token" => $accessToken,
],
'body' => json_encode([
'content' => $context,
'version' => 2,
'openid' => $openid,
'scene' => 4
], JSON_UNESCAPED_UNICODE),
]);
$apiResult = json_decode($response->getBody());

向微信提交申诉后,成功恢复了微信小程序的各种能力

问题复盘

导致问题的原因

向微信发送HTTP请求时,发送的JSON数据的编码被自动转换为UNICODE编码,导致微信服务器无法识别,从而返回错误的判断结果

问题来源

1.本人在开发时虽注意到security.msgSecCheck接口需使用UTF-8编码,并使用utf8_encode进行编码,但是没注意到GuzzleHttp发送请时,自动将json字符串转换为unicode编码
2.当此接口输入错误编码时,接口没有返回异常信息。


广告
广告正在加载中...
暂不开放评论,如对本文有任何疑问,请联系i#mr-wu.top(#替换为@)