使用imgSecCheck, msgSecCheck这两个API的时候碰到一些雷,现在就分享下.
msgSecCheck
传输的文本不可以是Unicode编码,要进行解码后再传输, 否则返回的是 "内容正常,无违规内容"
PHP DEMO:
private function scantxt($url, $data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
调用:
$data = ['content' => 'xxxxxxxxxxxxxxxxxxxxxxx'];
scantxt($url, json_encode($data, JSON_UNESCAPED_UNICODE));
imgSecCheck
media参数类型为form-data, 应该是指POST表单的头格式为 Content-Type: multipart/form-data
其实就是服务器端模拟文件上传功能,上传文件给微信服务器, 被上传的文件不支持URL,只能为本地图片,图片路径推荐绝对路径(只要能根据路径找到该文件即可,有的可以相对路径)
PHP 5.5以上和以下使用的API方法不同
其实微信可以考虑支持BASE64,这样更简便.
5. API文章最下方的@, 其实可加可不加, 不加的时候微信也鉴别( @意思是上传的为图片)
private function upimg($url)
{
$file = __DIR__ . '/123.jpg';
$cfile = curl_file_create($file, 'image/jpg', '@testpic'); //这里硬编码了,自己修改
$imgdata = array('media' => $cfile);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); // stop verifying certificate
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $imgdata);
$r = curl_exec($curl);
curl_close($curl);
return $r;
}
public function check_img(){
$url = 'https://api.weixin.qq.com/wxa/img_sec_check?access_token=12_j1nlrQa29SUWYz_3OSEbfjc9vhduVcyu_MkR6VSLXjA86air3rw8xcCtSXeyU1qc3RyYVAR3IB2RLL3XHVYYLOKk5w-N917BgL9R-cILq2Zc0452WwWLoU6blBIxMJhzG7yYnhnROPOhABAYZY';
$file = __DIR__ . '\640.jpg';
$cfile = curl_file_create($file, 'image/jpg', 'testpic'); //这里硬编码了,自己修改
$imgdata = array('media' => $cfile);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); // stop verifying certificate
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $imgdata);
$r = curl_exec($curl);
curl_close($curl);
dump($r);
}
返回的
图片路径没问题,不知道接口是不是这样拼接,还是其他地方有问题,望大神们指点
请问你调用接口,这个问题最后解决了吗
传输的文本不可以是Unicode编码,要进行解码后再传输? 你好,这里需要开发者处理下把unicode转为utf-8(参考链接:https://www.jb51.net/article/70251.htm) 另外,form-data就是http协议里面的formdata哈
检测的内容,通常是文本数据, 从某个URL获取的.
从实用简单角度来说, UNICODE解码或者你说的转UTF-8, 各个开发语言有自己便捷的API, https://www.jb51.net/article/70251.htm 这个里面的转换过于复杂了.
http协议里面的formdata,这个说法有些抽象,从容易理解角度来说, 我认为其实就是模拟文件上传, http头设置Content-Type: multipart/form-data