在我们提交URL和Token信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数: Signature(微信加密签名)、timestamp(时间戳)、nonce(随机数)、echostr(随机字符串)。
Signature 结合了开发者填写的Token参数和请求中的timestamp参数、nonce参数。
$_GET是php的全局数组变量,存储了GET请求携带的变量名称和值,通过该变量我们就能获取微信服务器中携带的上述四个参数的值了。
/**
* 验证URL来源是否正确
* @return boolean
*/
private function checkSignature()
{
//获取参数值
$signature = $_GET['signature'];
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$params = array($this->_token, $timestamp, $nonce); //按照字典顺序排序将三个参数排序
sort($params);
$sig = sha1(implode($params)); //将数组拼接成字符串在shal加密
return $sig == $signature; //判断获取的签名是否和本地计算的相同
}
/**
*检查签名
*如果正确,将微信服务器中的echostr字段原样返回
*/
private function sourceCheck()
{
if ($this->checkSignature()) {
$echostr = $_GET['echostr'];
echo $echostr;
}else{
throw new Exception('Wrong Signature');
}
exit(0);
}
}