前段时间,微信小程序收到信息提醒,要对用户输入的内容进行检查。而实现这功能需要一台服务器或者使用云开发。经过一轮考虑后,但最终选择微信云托管。
选择微信云托管的原因
- 天然鉴权
微信私有协议自动获取 OpenID、UnionID 等登录态信息;无需维护 access_token 与证书,免鉴权调用微信开放接口; - 资源复用
很多业务情况下,我们需要在多个小程序或公众号中提供统一的后端服务;微信云托管目前支持将一个「小程序/小游戏/公众号」的云托管环境共享给同主体的其他「小程序/小游戏/公众号」。 设置资源复用时,被复用方不需要也开通微信云托管。即从理论上来说,同一个主体的多个小程序/公众号,只需开通一个云托管即可,避免创建过多帐号。
另外需要注意在小程序端,通过 wx.cloud.callContainer 向你的云托管服务发起请求时,你的服务会在 header 中获得该请求用户的全部信息。
云托管环境
小编用的是thinkphp-apache。因为小编是在Windows上开发的,为了方便调试,所以只能舍弃thinphp-nginx,选择thinkphp-apache。但是不可否认,thinkphp-nginx在性能上比thinkphp-apache好。感觉php越来越不行了,或许Python的Django 也是一个不错的选择。
请求web服务器工具的选择
只能使用Guzzlehttp,不能使用curl。因为需要把传输的数据放到body里面,curl没这功能。
补充:guzzlehttp安装命令如下
composer require guzzlehttp/guzzle
核心代码
后端php代码如下,另外需要注意下,敏感内容检查的情景(scene)建议选择“2-评论”。因为这个检查范围最广泛。
use GuzzleHttp\Client;
$content = Request::param('content/s', '');
$reuse = Request::param('reuse/b', false);
if ($reuse == true) {
// 资源复用的情况
$url = 'http://api.weixin.qq.com/wxa/msg_sec_check?from_appid=' . Request::header('x-wx-from-appid');
$openid = Request::header('x-wx-from-openid');
} else {
$url = 'http://api.weixin.qq.com/wxa/msg_sec_check';
$openid = Request::header('x-wx-openid');
}
$http = new Client();
$response = $http->post($url, [
'body' => json_encode([
'content' => $content,
'version' => 2,
'openid' => $openid,
'scene' => 2
], JSON_UNESCAPED_UNICODE),
]);
$apiResult = json_decode($response->getBody());
微信小程序代码
// 资源复用情况下,调用
const c1 = new wx.cloud.Cloud({
resourceAppid: 'xxxxxxxxx',
resourceEnv: 'prod-xxxxxxxxx',
})
await c1.init()
const res = await c1.callContainer({
"config": {
"env": "prod-xxxxxxxx"
},
"path": "/api/msgcheck",
"header": {
"X-WX-SERVICE": "thinkphp-apache-xxxx",
"content-type": "application/json"
},
"method": "POST",
"data": { content: this.data.valueAdd, reuse: true }
})
配置接口
使用云托管需要配置接口,接口名如下: /wxa/msg_sec_check
吐槽一下
为了减少运营成本,在微信云托管里是可以设计成没流量就自动注销服务器了。而当有流量后又自动开启。而开启需要20秒的时间。这会导致敏感内容检查失败。。。