微信公众号交互代码的一个问题
往微信公众号发送关键词后可以调用自定义的接口进行处理,
wx微信设计了一套交互的协议,其中有一部分是传递的参数需要signature校验。wx微信本身提供了checkSignature函数。以前用过正常,但不知从什么时候起这部分代码总是返回false。
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce =$_GET["nonce"];
$token =TOKEN;
$tmpArr = array($token, $timestamp,$nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr);
$tmpStr = sha1( $tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
解决的方法有2个
1.简单粗暴,直接返回true,不进行校验,快速解决问题
2.找出原因解决它。
试了一下发现居然是sort这个函数,执行sort的结果和要求的不一致。
PHP?sort() 函数用来对数组元素进行升序排序,也就是从低到高排序,语法如下:
bool sort ( array &$arr [, int $sort_mode = SORT_REGULAR ] )
参数说明:
- arr 是要排序的数组。
- sort_mode 表示排序模式,是一个可选参数。sort_mode 可以使用如下的值:
- SORT_REGULAR:正常比较元素,不改变元素的类型(默认值)。
- SORT_NUMERIC:元素被作为数字来比较。
- SORT_STRING:元素被作为字符串来比较。
- SORT_LOCALE_STRING:根据当前的区域(locale)设置把元素当作字符串比较,可以用 setlocale() 来改变。
- SORT_NATURAL:和 natsort() 类似,对每个元素以“自然的顺序”对字符串进行排序,是 PHP 5.4.0 中新增的一个参数。
- SORT_FLAG_CASE:能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串。
sort() 函数调用结束后, arr 数组元素会按照从低到高的顺序重新排列。
返回值:排序成功返回 TRUE,失败返回 FALSE。
可能和sort的对象的数据类型或者编码格式有关,最终通过指定排序的模式为Sort_STRING解决了问题。建议官方代码里也指明排序类型。
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce =$_GET["nonce"];
$token =TOKEN;
$tmpArr = array($token, $timestamp,$nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr);
$tmpStr = sha1( $tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
|