| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 | <?php/** * PHP SDK for QQ登录 OpenAPI * * @version 1.3 * @author connect@qq.com * @copyright ? 2011, Tencent Corporation. All rights reserved. *//** * @brief 本文件包含了OAuth认证过程中会用到的公用方法  *//** * @brief 对参数进行字典升序排序 * * @param $params 参数列表 * * @return 排序后用&链接的key-value对(key1=value1&key2=value2...) */function get_normalized_string($params){    ksort($params);    $normalized = array();    foreach($params as $key => $val)    {        $normalized[] = $key."=".$val;    }    return implode("&", $normalized);}/** * @brief 使用HMAC-SHA1算法生成oauth_signature签名值  * * @param $key  密钥 * @param $str  源串 * * @return 签名值 */function get_signature($str, $key){    $signature = "";    if (function_exists('hash_hmac'))    {        $signature = base64_encode(hash_hmac("sha1", $str, $key, true));    }    else    {        $blocksize	= 64;        $hashfunc	= 'sha1';        if (strlen($key) > $blocksize)        {            $key = pack('H*', $hashfunc($key));        }        $key	= str_pad($key,$blocksize,chr(0x00));        $ipad	= str_repeat(chr(0x36),$blocksize);        $opad	= str_repeat(chr(0x5c),$blocksize);        $hmac 	= pack(            'H*',$hashfunc(                ($key^$opad).pack(                    'H*',$hashfunc(                        ($key^$ipad).$str                    )                )            )        );        $signature = base64_encode($hmac);    }    return $signature;} /** * @brief 对字符串进行URL编码,遵循rfc1738 urlencode * * @param $params * * @return URL编码后的字符串 */function get_urlencode_string($params){    ksort($params);    $normalized = array();    foreach($params as $key => $val)    {        $normalized[] = $key."=".rawurlencode($val);    }    return implode("&", $normalized);}/** * @brief 检查openid是否合法 * * @param $openid  与用户QQ号码一一对应 * @param $timestamp 时间戳 * @param $sig  签名值 * * @return true or false */function is_valid_openid($appkey,$openid, $timestamp, $sig){    $key = $appkey;    $str = $openid.$timestamp;    $signature = get_signature($str, $key);    //echo "sig:$sig\n";    //echo "str:$str\n";    return $sig == $signature; }/** * @brief 所有Get请求都可以使用这个方法 * * @param $url * @param $appid * @param $appkey * @param $access_token * @param $access_token_secret * @param $openid * * @return true or false */function do_get($url, $appid, $appkey, $access_token, $access_token_secret, $openid){    $sigstr = "GET"."&".rawurlencode("$url")."&";    //必要参数, 不要随便更改!!    $params = $_GET;    $params["oauth_version"]          = "1.0";    $params["oauth_signature_method"] = "HMAC-SHA1";    $params["oauth_timestamp"]        = time();    $params["oauth_nonce"]            = mt_rand();    $params["oauth_consumer_key"]     = $appid;    $params["oauth_token"]            = $access_token;    $params["openid"]                 = $openid;    unset($params["oauth_signature"]);    //参数按照字母升序做序列化    $normalized_str = get_normalized_string($params);    $sigstr        .= rawurlencode($normalized_str);    //签名,确保php版本支持hash_hmac函数    $key = $appkey."&".$access_token_secret;    $signature = get_signature($sigstr, $key);    $url      .= "?".$normalized_str."&"."oauth_signature=".rawurlencode($signature);    //echo "$url\n";    return file_get_contents($url);}/** * @brief 所有multi-part post 请求都可以使用这个方法 * * @param $url * @param $appid * @param $appkey * @param $access_token * @param $access_token_secret * @param $openid * */function do_multi_post($url, $appid, $appkey, $access_token, $access_token_secret, $openid){    //构造签名串.源串:方法[GET|POST]&uri&参数按照字母升序排列    $sigstr = "POST"."&"."$url"."&";    //必要参数,不要随便更改!!    $params = $_POST;    $params["oauth_version"]          = "1.0";    $params["oauth_signature_method"] = "HMAC-SHA1";    $params["oauth_timestamp"]        = time();    $params["oauth_nonce"]            = mt_rand();    $params["oauth_consumer_key"]     = $appid;    $params["oauth_token"]            = $access_token;    $params["openid"]                 = $openid;    unset($params["oauth_signature"]);    //获取上传图片信息    foreach ($_FILES as $filename => $filevalue)    {        if ($filevalue["error"] != UPLOAD_ERR_OK)        {            //echo "upload file error $filevalue['error']\n";            //exit;        }         $params[$filename] = file_get_contents($filevalue["tmp_name"]);    }    //对参数按照字母升序做序列化    $sigstr .= get_normalized_string($params);    //签名,需要确保php版本支持hash_hmac函数    $key = $appkey."&".$access_token_secret;    $signature = get_signature($sigstr, $key);    $params["oauth_signature"] = $signature;     //处理上传图片    foreach ($_FILES as $filename => $filevalue)    {        $tmpfile = dirname($filevalue["tmp_name"])."/".$filevalue["name"];        move_uploaded_file($filevalue["tmp_name"], $tmpfile);        $params[$filename] = "@$tmpfile";    }    /*    echo "len: ".strlen($sigstr)."\n";    echo "sig: $sigstr\n";    echo "key: $appkey&\n";    */    $ch = curl_init();    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);     curl_setopt($ch, CURLOPT_POST, TRUE);     curl_setopt($ch, CURLOPT_POSTFIELDS, $params);     curl_setopt($ch, CURLOPT_URL, $url);    $ret = curl_exec($ch);    //$httpinfo = curl_getinfo($ch);    //print_r($httpinfo);    curl_close($ch);    //删除上传临时文件    unlink($tmpfile);    return $ret;}/** * @brief 所有post 请求都可以使用这个方法 * * @param $url * @param $appid * @param $appkey * @param $access_token * @param $access_token_secret * @param $openid * */function do_post($url, $appid, $appkey, $access_token, $access_token_secret, $openid){    //构造签名串.源串:方法[GET|POST]&uri&参数按照字母升序排列    $sigstr = "POST"."&".rawurlencode($url)."&";    //必要参数,不要随便更改!!    $params = $_POST;    $params["oauth_version"]          = "1.0";    $params["oauth_signature_method"] = "HMAC-SHA1";    $params["oauth_timestamp"]        = time();    $params["oauth_nonce"]            = mt_rand();    $params["oauth_consumer_key"]     = $appid;    $params["oauth_token"]            = $access_token;    $params["openid"]                 = $openid;    unset($params["oauth_signature"]);    //对参数按照字母升序做序列化    $sigstr .= rawurlencode(get_normalized_string($params));    //签名,需要确保php版本支持hash_hmac函数    $key = $appkey."&".$access_token_secret;    $signature = get_signature($sigstr, $key);     $params["oauth_signature"] = $signature;     $postdata = get_urlencode_string($params);    //echo "$sigstr******\n";    //echo "$postdata\n";    $ch = curl_init();    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);     curl_setopt($ch, CURLOPT_POST, TRUE);     curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);     curl_setopt($ch, CURLOPT_URL, $url);    $ret = curl_exec($ch);    curl_close($ch);    return $ret;}?>
 |