作用
主要是用于当监听用户的各种动作。比如关注、取关、用户发送文本消息、链接、语音、视频消息等。
监听到这些时间,可以做出响应的反应
流程
- 登录微信公众号后台。
- 左侧菜单栏中,设置与开发-基本配置-服务器配置。
- 修改配置,如图
解释一下:
URL: 自己服务器的地址,一般是个GET请求方式的接口。
TOKEN:自己随便写的,可以是123456。主要用于验签。
EncodingAESKey:系统随机生成的,也是用于验签。
重点。代码示例如下.以tp框架为例
//定义路由
Route::any('subscribe', 'home/Wechat/subscribe');//这里定义的是any,其实get就可以了。
//控制器代码
public function subscribe(Request $request)
{
//接收参数,验签的标识
$echoStr = $request->param('echostr');
if (!empty($echoStr)) {
//不为空,去校验
$this->valid($request->param());
//必须要在主方法中echo;
echo $echoStr;
exit;
} else {
//响应用户对公众号发送的消息
$this->responseMsg($request->param()); //这个方法的代码详见另一篇文章
exit;
}
}
/**
* Description:公众号服务器验签
* @param $data
* @return bool
* @date 2024/4/26 9:40
* @author zls
*/
public function valid($data)
{
$echoStr = $data['echoStr'];
$signature = $data['signature'];
$timestamp = $data['timestamp'];
$nonce = $data['nonce'];
$token = "hsmjmessage";//公众号后台自定义
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
return true;
// 这里比较坑!!!
// 不可以在调用的方法中echo $echoStr; 必须要在主方法中echo;
// echo $echoStr;
// exit;
} else {
Log::info("验签失败");
return json(false);
}
}
一些问题
- 如果报错什么服务器错误,那就是你接口中的代码有问题!自己打印Log,在服务器中排查即可。
- 如果报token校验错误,那就是在调用的方法中直接
echo $echoStr;
多打印日志,官方文档不好找。