<?php


// 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开

$key = "c4ca4238a0b923820dcc509a6f75849b";

$secret = "28c8edde3d61a0411511d3b1866f0636";


echo md5($secret)."<hr>";



// 待发送的数据包

/* $data = array(

    'username' => 'abc@qq.com',

    'sex' => '1',

    'age' => '16',

    'addr' => 'guangzhou',

    'key' => $key,

    'timestamp' => time(),

); */


$data = $_GET;

$data['token']=$secret;

$data['timestamp']=time();

print_r($data);

echo "<hr>";

// 获取sign

function getSign($secret, $data) {

    // 对数组的值按key排序

    ksort($data);

    // 生成url的形式

    $params = http_build_query($data);

    // 生成sign

    $sign = md5($params . $secret);

    return $sign;

}


// 发送的数据加上sign

$data['sign'] = getSign($secret, $data);


/**

 * 后台验证sign是否合法

 * @param  [type] $secret [description]

 * @param  [type] $data   [description]

 * @return [type]         [description]

 */

function verifySign($secret, $data) {

    // 验证参数中是否有签名

    if (!isset($data['sign']) || !$data['sign']) {

        echo '发送的数据签名不存在';

        die();

    }

    if (!isset($data['timestamp']) || !$data['timestamp']) {

        echo '发送的数据参数不合法';

        die();

    }

    // 验证请求, 10分钟失效

    if (time() - $data['timestamp'] > 600) {

        echo '验证失效, 请重新发送请求';

        die();

    }

//取出签名

    $sign = $data['sign'];

//删除数组中的签名

    unset($data['sign']);

//对数组的值按key排序

    ksort($data);

//生成url的形式

    $params = http_build_query($data);

    // $secret 是通过 key 在 api 的数据库中查询得到,或者直接指定

    $sign2 = md5($params . $secret);

    if ($sign == $sign2) {

//return true;

        die('验证通过');

    } else {

        die('请求不合法');

    }

}


//print_r($data);


verifySign($secret, $data);


?>