[入门到吐槽系列] 微信小程序 敏感违规图片检测 mediaCheckAsync,客服接口 消息推送 的各种坑分享!
前言:
最近需要做个用户上传图片,服务端校验图片问题的需求。需要使用小程序消息推送,异步接受腾讯的图片验证回调。实在太多坑了。
相信10分钟看完本文的朋友,可以非常顺利避坑。
前期准备:
首先需要一个消息推送帮助类wechat.class.php,在这里下载:https://github.com/dodgepudding/wechat-php-sdk
小程序管理界面配置接口
测试代码编写:
写一个接收代码php,放在上面URL(服务器地址)对应的服务器上。
<?php define('IN_MOD', TRUE);
header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');//其中PRC为“中华人民共和国 include_once('wechat.class.php'); $options = array(
'token'=>'填写界面配置的 Token(令牌)',
'encodingaeskey'=>'填写界面配置的 EncodingAESKey(消息加密密钥)',
'appid'=>'填写小程序的appid',
'appsecret'=>'填写小程序的appsecret',
); $weObj = new Wechat($options);
$weObj->valid(); return true;
?>
红色部分是需要替换成自己小程序实际配置。
注意把当前文件和wechat.class.php文件放在统一个目录下,可以被URL服务器地址访问。
测试消息推送——巨坑提醒!
打开微信的客服小程序:
注意小程序左上角,有个叫“客服在线”,设置为客服离线!
这是个超级巨坑,如果设置了客服在线,会发现非常多的消息,接口都收不到,只能收到event类型的推送。这里小编被坑了12个小时,无意中才发现。所以要用接口,就必须设置离线。
消息推送——消息转发给客服
由于我们设置了离线,但是对于无法处理的消息,还是要给人工处理,所以代码需要修改:
<?php define('IN_MOD', TRUE);
header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');//其中PRC为“中华人民共和国 include_once('wechat.class.php'); $options = array(
'token'=>'填写界面配置的 Token(令牌)',
'encodingaeskey'=>'填写界面配置的 EncodingAESKey(消息加密密钥)',
'appid'=>'填写小程序的appid',
'appsecret'=>'填写小程序的appsecret',
); $weObj = new Wechat($options);
$weObj->valid(); // RECRIECT TO SERVICE $msg = array(
'ToUserName'=>$weObj->getRev()->getRevFrom(),
'FromUserName'=>$weObj->getRev()->getRevTo(),
'CreateTime'=>$weObj->getRev()->getRevCtime(),
'MsgType'=>'transfer_customer_service',
);
$weObj->transfer_customer_service()->reply();
return true;
?>
增加一段代码,让无法处理的消息,转发给客服小程序。这样即使离线也可以收到推送。
消息推送——回复消息给用户 巨坑2!
这里又出现第二个巨坑,就是不能直接return结构体回复给顾客,必须调用服务端接口。代码如下:
<?php define('IN_MOD', TRUE);
header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');//其中PRC为“中华人民共和国 include_once('wechat.class.php'); $options = array(
'token'=>'填写界面配置的 Token(令牌)',
'encodingaeskey'=>'填写界面配置的 EncodingAESKey(消息加密密钥)',
'appid'=>'填写小程序的appid',
'appsecret'=>'填写小程序的appsecret',
); $weObj = new Wechat($options);
$weObj->valid(); // REPLY TO CUSTOMER if ($weObj->getRev()->getRevType() == 'text' && $weObj->getRev()->getRevContent()."" == "TEST") {
$url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$weObj->checkAuth();
$msg = array(
'touser' => $weObj->getRev()->getRevFrom(),
'msgtype' => 'text',
'text' => array(
'content' => 'HELLOWORLD!'
)
);
$msg = json_encode($msg);
$ret = $weObj->http_post($url, $msg);
return 'success';
} // RECRIECT TO SERVICE $msg = array(
'ToUserName'=>$weObj->getRev()->getRevFrom(),
'FromUserName'=>$weObj->getRev()->getRevTo(),
'CreateTime'=>$weObj->getRev()->getRevCtime(),
'MsgType'=>'transfer_customer_service',
);
$weObj->transfer_customer_service()->reply();
return true;
?>
如果收到的用户消息,并且内容是TEST的时候,返回HELLOWORLD,效果如下:
图片校验是否违法请求1——巨坑3!
相关文档在这里:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.mediaCheckAsync.html
首先使用java构造个http请求,推送给微信:
String mediaurl = "http://www.pixysoft.cn/images/pages/moc/dab7b3_81493ed8bd1e4d53bc3a9ce761734675~mv2.png";
String url = "https://api.weixin.qq.com/wxa/media_check_async?access_token=ACCESS_TOKEN";
JsonObject params = new JsonObject();
params.addProperty("version", 2);
params.addProperty("openid", "o6qII0dUQxFt3Dvs1m6sXv5vZydQ");
params.addProperty("scene", 1);
params.addProperty("media_url", mediaurl);
params.addProperty("media_type", 2); CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(url.replace("ACCESS_TOKEN", WxssJSSDKCache.getAccessToken()));
httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
String body = JsonUtils.toJson(params).toString();
StringEntity entity = new StringEntity(body, "utf-8");
entity.setContentType(ContentType.APPLICATION_JSON.getMimeType()); httpPost.setEntity(entity);
org.apache.http.HttpResponse response1;
response1 = httpClient.execute(httpPost);
InputStream inputStream = response1.getEntity().getContent();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int bytesRead = 0;
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
out.write(buffer, 0, bytesRead);
} out.flush();
out.close();
System.out.println(new String(out.toByteArray()));
- 首先要求这个openid的用户在2小时内登录过小程序。
- 其次通过接口获取access_token,这个步骤咱们就省略了,可以看这里:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
- 最后,注意请求体必须声明"UTF-8"。我看到很多朋友调用敏感字检查的时候,都没有正确返回屏蔽信息,就是因为没有使用utf-8!
调用成功,会返回:
{"errcode":0,"errmsg":"ok","trace_id":"62219863-342b4e47-6dedd2b5"}
图片校验是否违法请求2——异步回调
修改服务端的php代码,新增一个事件监听:
<?php define('IN_MOD', TRUE);
header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');//其中PRC为“中华人民共和国 include_once('wechat.class.php'); $options = array(
'token'=>'填写界面配置的 Token(令牌)',
'encodingaeskey'=>'填写界面配置的 EncodingAESKey(消息加密密钥)',
'appid'=>'填写小程序的appid',
'appsecret'=>'填写小程序的appsecret',
); $weObj = new Wechat($options);
$weObj->valid(); // EVENT HANDLE if ($weObj->getRev()->getRevType() == 'event') {
$event = $weObj->getRev()->getRevEvent();
$event = $event['event'];
if ($event == 'wxa_media_check') {
$url = 'https://www.pixysoft.cn:8443/sso/wxss/callback/wxa_media_check';
$t = time();
$sign = 'wxa_media_check'.$t.$options['appsecret'];
$sign = md5($sign);
$postdata = array(
'req' => json_encode($weObj->getRevData()),
't' => $t,
'sign' => $sign,
);
return $weObj->http_post($url, $postdata);
}
} // REPLY TO CUSTOMER if ($weObj->getRev()->getRevType() == 'text' && $weObj->getRev()->getRevContent()."" == "TEST") {
$url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$weObj->checkAuth();
$msg = array(
'touser' => $weObj->getRev()->getRevFrom(),
'msgtype' => 'text',
'text' => array(
'content' => 'HELLOWORLD!'
)
);
$msg = json_encode($msg);
$ret = $weObj->http_post($url, $msg);
return 'success';
} // RECRIECT TO SERVICE $msg = array(
'ToUserName'=>$weObj->getRev()->getRevFrom(),
'FromUserName'=>$weObj->getRev()->getRevTo(),
'CreateTime'=>$weObj->getRev()->getRevCtime(),
'MsgType'=>'transfer_customer_service',
);
$weObj->transfer_customer_service()->reply();
return true;
?>
判断回调数据是否event,类型是否wxa_media_check,如果是,则表示图片检测结果出来了, 我就把结果打个包,发给服务端程序进一步处理。得到的返回数据是:
格式化一下:
{
"ToUserName": "gh_f8935bc8ccb8",
"FromUserName": "o6qII0bS2NFHsMtZ7XGGPC6JapuA",
"CreateTime": "1646368869",
"MsgType": "event",
"Event": "wxa_media_check",
"appid": "wx207f784d4c617ec9",
"trace_id": "62219863-342b4e47-6dedd2b5",
"version": "2",
"detail": {
"strategy": "content_model",
"errcode": "0",
"suggest": "pass",
"label": "100",
"prob": "90"
},
"errcode": "0",
"errmsg": "ok",
"result": {
"suggest": "pass",
"label": "100"
}
}
到了这里,整个图片检测逻辑就完成了。今天的入门包括了客服接口配置、接口php逻辑编写、图片检测回调。
文所有代码在这里可以下载:
链接: https://pan.baidu.com/s/1pkFfEgFHoHOG0tFiS-P1RA
提取码: ab9u
也欢迎大家关注咱们公众号:辰同学技术 微信公众号,同样会分享各种技术10分钟从入门到吐槽:
[入门到吐槽系列] 微信小程序 敏感违规图片检测 mediaCheckAsync,客服接口 消息推送 的各种坑分享!的更多相关文章
- 微信小程序点击图片放大预览
微信小程序点击图片放大预览使用到 wx.previewImage 接口,可以放大.上/下一张 上代码 wxml代码 <view class='content-img' wx:if="{ ...
- 微信小程序简单封装图片上传组件
微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...
- PHP 实现微信小程序敏感图片、内容检测接口
主要是为了调用微信小程序msgSecCheck.imgSecCheck接口. 先附上小程序接口说明文档地址:https://developers.weixin.qq.com/miniprogram/d ...
- 微信小程序开发之图片预览
实现图片的展示和大图预览 使用wx.previewImage(OBJECT)来实现 OBJECT参数说明: 参数 类型 必填 说明 current String 否 当前显示图片的链接,不填则默认为 ...
- 微信小程序——引入背景图片【六】
前言 之前写了一些小程序的博文只是看文档边看边写,了解下他,这次可是真枪真刀的做了! 框架使用的是美团的mpvue,我也是一边学习,一边写的,如有错误之处,还望大家指出. 在这里我有个问题,为什么微信 ...
- 微信小程序——网盘图片预览
微信小程序图片预览提供了一个wx.previewImage接口,如下图: 现在我需要对网盘文件里的图片预览,但是网盘从后台返回的数据是各种类型的文件,如下图所示: 那么我们需要解决2个问题: 1.从这 ...
- 微信小程序,工具未检测合法域名,400 (Bad Request)错误
1.工具未检测合法域名 这个我就不多说了,如果你新建的时候没有填写AppID的话这个我就不太清楚了 如果新建项目的时候填写了AppID的话,出现这种错误,那你应该去小程序后台 设置->开发者设置 ...
- 微信小程序之裁剪图片成圆形
前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在github上看了一些例子,一般剪裁图片用的都是方形,所以自己打算写一个小组件,可以把图片剪裁成圆形,主 ...
- 微信小程序添加背景图片的坑
给微信小程序页面加载背景图片解决方案 直接附上原文地址: 给微信小程序页面加载背景图片解决方案 - YUSIR 完美CODING世界 - CSDN博客 https://blog.csdn.net/y ...
随机推荐
- Qt之信号与槽
student.h: #ifndef STUDENT_H #define STUDENT_H #include <QObject> class Student:public QObject ...
- 源码安装 python3.7
yum install libffi-devel openssl -y wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz ta ...
- python 列表删除元素,单个元素,多个连续或不连续元素
以列表a为例 import numpy as np a = ['上海市', '云南省', '内蒙古', '四川省', '天津市', '宁夏', '安徽省', '山东省', '山西省'] 删除单个元素 ...
- AT2650 [ARC077C] guruguru
可以发现,如果我们枚举每个理想亮度 \(X\) 然后再求在这个理想亮度情况下的答案是非常难维护的. 不妨反过来,考虑每个位置 \(i, i + 1\) 之间对每个理想亮度 \(X\) 减少次数的贡献. ...
- JDK停止工作
问题:在服务器上运行程序,有时会出现JDK已停止工作,如图: 解决:在网上查找了很多资料,主要有以下几点 1.程序冲突,回想近期是否新安装了程序,将该程序进行关闭之后,再运行程序 2.异常未处理,即代 ...
- C程序:年转化天
突然想算算自己到底活了多少天了,e,就是纯属为了好玩,毕竟咱作为一名C初学者还是要多练练的- 为了好玩,加了个密码登陆的,密码是521,还有就是不太懂时间获取... 具体闰年的判断方法: 代码如下: ...
- VC 模拟键盘输入
转载请注明来源:https://www.cnblogs.com/hookjc/ vc模拟键盘输入keybd_event(VK_LWIN, 0, 0 ,0);keybd_event('M', 0, 0 ...
- VC 获取已系统安装的字体
转载请注明来源:https://www.cnblogs.com/hookjc/ BOOL CALLBACK EnumFonts(CONST LOGFONT* lplf, CONST TEXTMETRI ...
- 转载_认识C语言的32个关键字
简单介绍: 1 auto : 声明自动变量 2 short :声明短整型变量或函数 3 int: 声明整型变量或函数 4 long :声明长整型变量或函数 5 float:声明浮点型变量或函数 6 d ...
- 简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗
UITableView索引功能是常见的,主要是获取中英文的首字母并排序,系统自带获取首字母 //系统获取首字母 - (NSString *) pinyinFirstLetter:(NSString*) ...