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;
- }
- ?>
|