在做微信公众平台接口程序时验证签名有时一致有时不一致,仔细观察发现一致时GET到的nonce为10位,不一致时为9位、甚至8位。

怎么会有如此奇怪的现象呢?导致我的checkSignature()函数无法依赖。

$nonce = $_GET['nonce'];

这个随机数 nonce 是微信公众号后台下发的,怎么会有时候少一位(甚至少两位)呢?

我的微信公众平台接口程序是用 PHP 5.6 写的。

百思不得其解。

阅读 3.6k
3 个回答
define ( 'SYSTEM_TOKEN', 'weiphp' );
/**
 * 微信接入验证
 * 在入口进行验证而不是放到框架里验证,主要是解决验证URL超时的问题
 */
if (! empty ( $_GET ['echostr'] ) && ! empty ( $_GET ["signature"] ) && ! empty ( $_GET ["nonce"] )) {
    $signature = $_GET ["signature"];
    $timestamp = $_GET ["timestamp"];
    $nonce = $_GET ["nonce"];
    
    $tmpArr = array (
            SYSTEM_TOKEN,
            $timestamp,
            $nonce 
    );
    sort ( $tmpArr, SORT_STRING );
    $tmpStr = sha1 ( implode ( $tmpArr ) );
    
    if ($tmpStr == $signature) {
        echo $_GET ["echostr"];
    }
    exit ();
}

翻看php手册 我终于明白是怎么回事了!!!!!!!!!!

问题出在这句话上面: $tmpArr = sha1 ( implode ( $tmpArr ) );

implode的作用是把数组变成字符串,然后再把这个值付给变量,如果这个变量依然是数组那就容易出问题了,和随机数是8、9、10位没有关系。

解决办法:换成新的变量名:

$tmpStr2 = sha1 ( implode ( $tmpArr ) );


if ($tmpStr2 == $signature) {
    echo $_GET ["echostr"];
}
exit ();

哈哈哈哈哈!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题