utils.func.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <?php
  2. /**
  3. * PHP SDK for QQ登录 OpenAPI
  4. *
  5. * @version 1.3
  6. * @author connect@qq.com
  7. * @copyright ? 2011, Tencent Corporation. All rights reserved.
  8. */
  9. /**
  10. * @brief 本文件包含了OAuth认证过程中会用到的公用方法
  11. */
  12. /**
  13. * @brief 对参数进行字典升序排序
  14. *
  15. * @param $params 参数列表
  16. *
  17. * @return 排序后用&链接的key-value对(key1=value1&key2=value2...)
  18. */
  19. function get_normalized_string($params)
  20. {
  21. ksort($params);
  22. $normalized = array();
  23. foreach($params as $key => $val)
  24. {
  25. $normalized[] = $key."=".$val;
  26. }
  27. return implode("&", $normalized);
  28. }
  29. /**
  30. * @brief 使用HMAC-SHA1算法生成oauth_signature签名值
  31. *
  32. * @param $key 密钥
  33. * @param $str 源串
  34. *
  35. * @return 签名值
  36. */
  37. function get_signature($str, $key)
  38. {
  39. $signature = "";
  40. if (function_exists('hash_hmac'))
  41. {
  42. $signature = base64_encode(hash_hmac("sha1", $str, $key, true));
  43. }
  44. else
  45. {
  46. $blocksize = 64;
  47. $hashfunc = 'sha1';
  48. if (strlen($key) > $blocksize)
  49. {
  50. $key = pack('H*', $hashfunc($key));
  51. }
  52. $key = str_pad($key,$blocksize,chr(0x00));
  53. $ipad = str_repeat(chr(0x36),$blocksize);
  54. $opad = str_repeat(chr(0x5c),$blocksize);
  55. $hmac = pack(
  56. 'H*',$hashfunc(
  57. ($key^$opad).pack(
  58. 'H*',$hashfunc(
  59. ($key^$ipad).$str
  60. )
  61. )
  62. )
  63. );
  64. $signature = base64_encode($hmac);
  65. }
  66. return $signature;
  67. }
  68. /**
  69. * @brief 对字符串进行URL编码,遵循rfc1738 urlencode
  70. *
  71. * @param $params
  72. *
  73. * @return URL编码后的字符串
  74. */
  75. function get_urlencode_string($params)
  76. {
  77. ksort($params);
  78. $normalized = array();
  79. foreach($params as $key => $val)
  80. {
  81. $normalized[] = $key."=".rawurlencode($val);
  82. }
  83. return implode("&", $normalized);
  84. }
  85. /**
  86. * @brief 检查openid是否合法
  87. *
  88. * @param $openid 与用户QQ号码一一对应
  89. * @param $timestamp 时间戳
  90. * @param $sig  签名值
  91. *
  92. * @return true or false
  93. */
  94. function is_valid_openid($appkey,$openid, $timestamp, $sig)
  95. {
  96. $key = $appkey;
  97. $str = $openid.$timestamp;
  98. $signature = get_signature($str, $key);
  99. //echo "sig:$sig\n";
  100. //echo "str:$str\n";
  101. return $sig == $signature;
  102. }
  103. /**
  104. * @brief 所有Get请求都可以使用这个方法
  105. *
  106. * @param $url
  107. * @param $appid
  108. * @param $appkey
  109. * @param $access_token
  110. * @param $access_token_secret
  111. * @param $openid
  112. *
  113. * @return true or false
  114. */
  115. function do_get($url, $appid, $appkey, $access_token, $access_token_secret, $openid)
  116. {
  117. $sigstr = "GET"."&".rawurlencode("$url")."&";
  118. //必要参数, 不要随便更改!!
  119. $params = $_GET;
  120. $params["oauth_version"] = "1.0";
  121. $params["oauth_signature_method"] = "HMAC-SHA1";
  122. $params["oauth_timestamp"] = time();
  123. $params["oauth_nonce"] = mt_rand();
  124. $params["oauth_consumer_key"] = $appid;
  125. $params["oauth_token"] = $access_token;
  126. $params["openid"] = $openid;
  127. unset($params["oauth_signature"]);
  128. //参数按照字母升序做序列化
  129. $normalized_str = get_normalized_string($params);
  130. $sigstr .= rawurlencode($normalized_str);
  131. //签名,确保php版本支持hash_hmac函数
  132. $key = $appkey."&".$access_token_secret;
  133. $signature = get_signature($sigstr, $key);
  134. $url .= "?".$normalized_str."&"."oauth_signature=".rawurlencode($signature);
  135. //echo "$url\n";
  136. return file_get_contents($url);
  137. }
  138. /**
  139. * @brief 所有multi-part post 请求都可以使用这个方法
  140. *
  141. * @param $url
  142. * @param $appid
  143. * @param $appkey
  144. * @param $access_token
  145. * @param $access_token_secret
  146. * @param $openid
  147. *
  148. */
  149. function do_multi_post($url, $appid, $appkey, $access_token, $access_token_secret, $openid)
  150. {
  151. //构造签名串.源串:方法[GET|POST]&uri&参数按照字母升序排列
  152. $sigstr = "POST"."&"."$url"."&";
  153. //必要参数,不要随便更改!!
  154. $params = $_POST;
  155. $params["oauth_version"] = "1.0";
  156. $params["oauth_signature_method"] = "HMAC-SHA1";
  157. $params["oauth_timestamp"] = time();
  158. $params["oauth_nonce"] = mt_rand();
  159. $params["oauth_consumer_key"] = $appid;
  160. $params["oauth_token"] = $access_token;
  161. $params["openid"] = $openid;
  162. unset($params["oauth_signature"]);
  163. //获取上传图片信息
  164. foreach ($_FILES as $filename => $filevalue)
  165. {
  166. if ($filevalue["error"] != UPLOAD_ERR_OK)
  167. {
  168. //echo "upload file error $filevalue['error']\n";
  169. //exit;
  170. }
  171. $params[$filename] = file_get_contents($filevalue["tmp_name"]);
  172. }
  173. //对参数按照字母升序做序列化
  174. $sigstr .= get_normalized_string($params);
  175. //签名,需要确保php版本支持hash_hmac函数
  176. $key = $appkey."&".$access_token_secret;
  177. $signature = get_signature($sigstr, $key);
  178. $params["oauth_signature"] = $signature;
  179. //处理上传图片
  180. foreach ($_FILES as $filename => $filevalue)
  181. {
  182. $tmpfile = dirname($filevalue["tmp_name"])."/".$filevalue["name"];
  183. move_uploaded_file($filevalue["tmp_name"], $tmpfile);
  184. $params[$filename] = "@$tmpfile";
  185. }
  186. /*
  187. echo "len: ".strlen($sigstr)."\n";
  188. echo "sig: $sigstr\n";
  189. echo "key: $appkey&\n";
  190. */
  191. $ch = curl_init();
  192. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  193. curl_setopt($ch, CURLOPT_POST, TRUE);
  194. curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
  195. curl_setopt($ch, CURLOPT_URL, $url);
  196. $ret = curl_exec($ch);
  197. //$httpinfo = curl_getinfo($ch);
  198. //print_r($httpinfo);
  199. curl_close($ch);
  200. //删除上传临时文件
  201. unlink($tmpfile);
  202. return $ret;
  203. }
  204. /**
  205. * @brief 所有post 请求都可以使用这个方法
  206. *
  207. * @param $url
  208. * @param $appid
  209. * @param $appkey
  210. * @param $access_token
  211. * @param $access_token_secret
  212. * @param $openid
  213. *
  214. */
  215. function do_post($url, $appid, $appkey, $access_token, $access_token_secret, $openid)
  216. {
  217. //构造签名串.源串:方法[GET|POST]&uri&参数按照字母升序排列
  218. $sigstr = "POST"."&".rawurlencode($url)."&";
  219. //必要参数,不要随便更改!!
  220. $params = $_POST;
  221. $params["oauth_version"] = "1.0";
  222. $params["oauth_signature_method"] = "HMAC-SHA1";
  223. $params["oauth_timestamp"] = time();
  224. $params["oauth_nonce"] = mt_rand();
  225. $params["oauth_consumer_key"] = $appid;
  226. $params["oauth_token"] = $access_token;
  227. $params["openid"] = $openid;
  228. unset($params["oauth_signature"]);
  229. //对参数按照字母升序做序列化
  230. $sigstr .= rawurlencode(get_normalized_string($params));
  231. //签名,需要确保php版本支持hash_hmac函数
  232. $key = $appkey."&".$access_token_secret;
  233. $signature = get_signature($sigstr, $key);
  234. $params["oauth_signature"] = $signature;
  235. $postdata = get_urlencode_string($params);
  236. //echo "$sigstr******\n";
  237. //echo "$postdata\n";
  238. $ch = curl_init();
  239. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  240. curl_setopt($ch, CURLOPT_POST, TRUE);
  241. curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
  242. curl_setopt($ch, CURLOPT_URL, $url);
  243. $ret = curl_exec($ch);
  244. curl_close($ch);
  245. return $ret;
  246. }
  247. ?>