PHP QQ 登录接口应用

原始出处

http://nightwizard.blog.51cto.com/2181643/607938



//---------------------------
<?php
class qzone
{
  var $appid = "***********"; //换成您的
  var $appkey = "**********"; //换成您的

  //除去数组中的空值和签名模式
  function filter($parameter)
  {
    $para = array();
    while (list($key, $val) = each($parameter))
    {
      if ($key == "sign" || $key == "sign_type" || $val == "")
      {
        continue;
      }
      else
      {
        $para[$key] = $parameter[$key];
      }
    }
    return $para;
  }

  /**
   * 生成请求代码
   * @param String $callback 回调地址
   */
  function request($callback = '')
  {
    //必要参数,不要随便更改!!
    $params = array();
    $params["oauth_version"] = "1.0";
    $params["oauth_signature_method"] = "HMAC-SHA1";
    $params["oauth_timestamp"] = time();
    $params["oauth_nonce"] = mt_rand();
    $params["oauth_consumer_key"] = $this->appid;

    $sign = $this->sign($params, "GET"."&".rawurlencode(
      "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token")."&", $this
      ->appkey.'&');

    $url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token?".$this
      ->format($params)."&"."oauth_signature=".rawurlencode($sign);

    $request = file_get_contents($url); //print_r($url);print_r($request);die;

    $result = array();

    parse_str($request, $result);

    if (!isset($result['oauth_token']))
    {
      //错误返回输出
      die();
    }

    $_SESSION["qq_token"] = $result["oauth_token"];
    $_SESSION["qq_secret"] = $result["oauth_token_secret"];

    //302跳转到授权页面
    $redirect .=
      "http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize?oauth_consumer_key=".$this->appid."&oauth_token=".$result["oauth_token"]."&oauth_callback=".rawurlencode($callback); //die($redirect);
    header("Location:$redirect");
  }

  /**
   * 响应操作
   */
  function respond()
  {
    $params = array();
    $params["oauth_version"] = "1.0";
    $params["oauth_signature_method"] = "HMAC-SHA1";
    $params["oauth_timestamp"] = time();
    $params["oauth_nonce"] = mt_rand();
    $params["oauth_consumer_key"] = $this->appid;
    $params["oauth_token"] = $_SESSION["qq_token"];
    $params["oauth_vericode"] = $_REQUEST["oauth_vericode"];

    //echo "sig:$sig/n";
    //echo "str:$str/n";

    $sign = $this->sign($params, "GET"."&".rawurlencode(
      "http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token")."&", $this
      ->appkey.'&'.$_SESSION["qq_secret"]);

    $url = "http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token?".$this
      ->format($params)."&"."oauth_signature=".rawurlencode($sign);

    $request = file_get_contents($url);

    $result = array();

    parse_str($request, $result);

    if (isset($result["error_code"]))
    {
      return false;
    }

    //验证签名
    $key = $this->appkey;
    $str = $_REQUEST["openid"].trim($_REQUEST["timestamp"]);

    if ($_REQUEST["oauth_signature"] != $this->sign(array(), $str, $key))
    {
      return false;
    }

    $_SESSION["qq_token"] = $result["oauth_token"];
    $_SESSION["qq_secret"] = $result["oauth_token_secret"];
    $_SESSION["qq_openid"] = $result["openid"];


    return true;
  }


  //链接字符串
  function format($parameter)
  {
    $parameter = $this->filter($parameter);

    ksort($parameter);
    reset($parameter);

    $params = '';
    foreach($parameter AS $key => $val)
    {
      $params .= "$key=$val&";
    }

    $params = substr($params, 0,  - 1);
    return $params;
  }

  function sign($parameter, $source, $key)
  {
    $params = $source.rawurlencode($this->format($parameter));
    //$key = $this->appkey . '&' . $secret;
    $sign = "";
    if (function_exists('hash_hmac'))
    {
      $sign = base64_encode(hash_hmac("sha1", $params, $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).$params))));
      $sign = base64_encode($hmac);
    }

    return $sign;
  }

  /**
   * 远程获取数据
   * $url 指定URL完整路径地址
   * @param $input_charset 编码格式。默认值:空值
   * @param $time_out 超时时间。默认值:60
   * return 远程输出的数据
   */
  function getHttpRequest($url, $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"] = $this->appid;
    $params["oauth_token"] = $access_token;
    $params["openid"] = $openid;
    unset($params["oauth_signature"]);

    $sign = $this->sign($params, "GET"."&".rawurlencode("$url")."&", $this
      ->appkey.'&'.$_SESSION["qq_secret"]);

    $url = $url."?".$this->format($params)."&"."oauth_signature=".rawurlencode
      ($sign);

    $result = file_get_contents($url);

    return json_decode(str_replace(array("/n", "/t"), '', $result), true);
  }
}

//---------------------------
?>

使用方法
请求代码
<?php
//---------------------------
//请求
$qzone = new qzone;
$qzone->request('域名/qzone/login');
//---------------------------
?>
接受代码
<?php
//---------------------------
//接收
if ($qzone->respond())
{
  //如果成功,获取用户信息
  $result = $qq->getHttpRequest(
    "http://openapi.qzone.qq.com/user/get_user_info", $_SESSION["qq_token"],
    $_SESSION["qq_secret"], $_SESSION["qq_openid"]);

  //下面是数据库操作业务
}

//---------------------------
?>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值