1.问题分析

官方指引:

如果按照指引代码里直接回包写 return 'success';或者空字符串的话,验签通过也会报以上错误,原因是在配置的时候不能返回 return 'success';而应该是echo $_GET["echostr"];
2.完整代码示例
// 配置 Token
const TOKEN = 'AAAAA';
/**
* 接收推送消息
*/
public function receive(): string
{
// 获取 URL 参数
$signature = input('get.signature');
$timestamp = input('get.timestamp');
$nonce = input('get.nonce');
// 验证签名
if ($this->checkSignature($signature, $timestamp, $nonce)) {
// 签名验证通过,获取请求体
$postData = file_get_contents("php://input");
// 记录日志
write_log($postData, 'receive');
$jsonData = json_decode($postData, true);
// 返回响应,关键在此处,配置时写return $_GET["echostr"];其他正常的监听写return 'success';
return 'success';
} else {
// 签名验证失败
return 'Invalid signature';
}
}
/**
* 验证签名
*/
private function checkSignature($signature, $timestamp, $nonce)
{
$token = self::TOKEN;
$tmpArr = [$token, $timestamp, $nonce];
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
// 打印调试信息
// write_log($tmpStr, 'receive');
return $tmpStr === $signature;
}
3.相关文档
- 官方文档:消息推送 | 微信开放文档
- 调试工具:微信公众平台接口调试工具
- 请求构造:微信调试工具
4190

被折叠的 条评论
为什么被折叠?



