ホームページ  >  記事  >  バックエンド開発  >  qq ログイン API php class_PHP チュートリアル

qq ログイン API php class_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:49:25788ブラウズ

/**
* QQ運用カテゴリー
* $作者: シュンジ $
* $Id: cls_qq.php 17171 2011-05-30 06:14:00Z シュンジ $
*/
クラスqq_api
{
var $appid = ”;
var $appkey = ”;
var $callback = ”;
var $login_type = 1;
/**
*コンストラクター
*
* @アクセス公開
* @param string $ver バージョン番号
*
* @return void
*/
関数 qq_api($appid, $appkey,$callback,$login_type)
{
$this->appid = $appid;
$this->appkey = $appkey;
$this->callback = $callback;
$this->login_type = $login_type;
}
/**
* @brief QQ ログイン ページにジャンプします。エンコードする場合は、RFC 1738 に従ってください。 *
* @param $appid
* @param $appkey
* @param $callback
*
* @return 返される文字列の形式は次のとおりです: oauth_token=xxx&openid=xxx&oauth_signature=xxx×tamp=xxx&oauth_vericode=xxx
*/
関数 redirect_to_login()
{
//QQ ログイン ページのインターフェイス アドレスにジャンプします。変更しないでください!!
$redirect = “http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize?oauth_consumer_key=”.$this->appid.”&”;
// get_request_token インターフェースを呼び出して、未承認の一時トークンを取得します
$result = array();
$request_token = $this->get_request_token();
parse_str($request_token, $result);
//リクエストトークン、リクエストトークンシークレットを保存する必要があります
// デモでは、グローバル変数に直接保存します。
//ウェブサイト上に複数のサブドメインが存在するか、同じメインドメイン名と異なるサーバーが存在するためにセッションが共有できない問題を回避するため
//開発者は、上記 2 つの問題を解決するために、この SDK の comm/session.php のコメントに従って session.php に必要な変更を加えることが求められます。
$_SESSION["トークン"] = $result["oauth_token"];
$_SESSION["シークレット"] = $result["oauth_token_secret"];
//print_r($_SESSION);
if ($result["oauth_token"] == "")
{
//サンプルコードではエラー状態は処理されません。実際の状況では、ウェブサイトはエラー状況を独自に処理する必要があります
終了します;
}
////リクエストURLを構築します
$redirect .= “oauth_token=".$result["oauth_token"]."&oauth_callback=".rawurlencode($this->callback);
header(“場所:$redirect”);
}
/**
* @brief 一時トークンをリクエストします。エンコードする際は RFC 1738 に従ってください。 *
* @param $appid
* @param $appkey
*
* @return 返される文字列の形式は次のとおりです: oauth_token=xxx&oauth_token_secret=xxx
*/
関数 get_request_token()
{
//一時トークンをリクエストするためのインターフェースアドレス、変更しないでください!!
$url = “http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token?”;
// oauth_signature 署名値を生成します。署名値の生成方法の詳細については、(http://wiki.opensns.qq.com/wiki/[QQ ログイン] 署名パラメーター oauth_signature の説明) を参照してください。 //(1) 署名値を生成するソース文字列を構築します (HTTP リクエスト メソッド & urlencode(uri) & urlencode(a=x&b=y&…))
$sigstr = "GET"."&".rawurlencode("http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token")."&";
//必要なパラメータ
$params = 配列();
$params["oauth_version"] = “1.0″;
$params["oauth_signature_method"] = "HMAC-SHA1";
$params["oauth_timestamp"] = 時間();
$params["oauth_nonce"] = mt_rand();
$params["oauth_consumer_key"] = $this->appid;
//パラメータをアルファベットの昇順でシリアル化します
$normalized_str = $this->get_normalized_string($params);
$sigstr .= rawurlencode($normalized_str);
//(2) キーを構築する
$key = $this->appkey.”&”;
//(3) oauth_signature 署名値を生成します。ここで、PHP バージョンが hash_hmac 関数をサポートしていることを確認する必要があります
$signature = $this->get_signature($sigstr, $key);
//リクエストURLを構築します
$url .= $normalized_str.”&”.”oauth_signature=”.rawurlencode($signature);
//エコー “$sigstrn”;
//エコー “$urln”;
return file_get_contents($url);
}
/*
* @brief ユーザー情報を取得するには、エンコードするときに RFC 1738 に従ってください。 *
* @param $appid
* @param $appkey
* @param $access_token
* @param $access_token_secret
* @param $openid
*
*/
関数 get_user_info($access_token, $access_token_secret, $openid)
{
//ユーザー情報を取得するためのインターフェースアドレスは変更しないでください!!
$url = “http://openapi.qzone.qq.com/user/get_user_info”;
$info = $this->do_get($url, $access_token, $access_token_secret, $openid);
$arr = array();
$arr = json_decode($info, true);
$arr を返します;
}
/**
* @brief access_token を取得します。リクエストは URL エンコードする必要があります。エンコードする場合は RFC 1738 に従ってください。 *
* @param $appid
* @param $appkey
* @param $request_token
* @param $request_token_secret
* @param $vericode
*
* @return 返される文字列の形式は次のとおりです: oauth_token=xxx&oauth_token_secret=xxx&openid=xxx&oauth_signature=xxx&oauth_vericode=xxx×tamp=xxx
*/
関数 get_access_token($request_token, $request_token_secret, $vericode)
{
//Qzone アクセス許可を持つ access_token のインターフェース アドレスを要求します。変更しないでください!!
$url = “http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token?”;
// oauth_signature 署名値を生成します。署名値の生成方法の詳細については、(http://wiki.opensns.qq.com/wiki/[QQ ログイン] 署名パラメーター oauth_signature の説明) を参照してください。 //(1) 署名値を生成するソース文字列を構築します (HTTP リクエスト メソッド & urlencode(uri) & urlencode(a=x&b=y&…))
$sigstr = “GET”.”&”.rawurlencode(”http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token”).”&”;
//必要なパラメータなので、むやみに変更しないでください!!
$params = 配列();
$params["oauth_version"] = “1.0″;
$params["oauth_signature_method"] = "HMAC-SHA1";
$params["oauth_timestamp"] = 時間();
$params["oauth_nonce"] = mt_rand();
$params["oauth_consumer_key"] = $this->appid;
$params["oauth_token"] = $request_token;
$params["oauth_vericode"] = $vericode;
//パラメータをアルファベットの昇順でシリアル化します
$normalized_str = $this->get_normalized_string($params);
$sigstr .= rawurlencode($normalized_str);
//エコー “sigstr = $sigstr”;
//(2) キーを構築する
$key = $this->appkey.”&”.$request_token_secret;
//(3) oauth_signature 署名値を生成します。ここで、PHP バージョンが hash_hmac 関数をサポートしていることを確認する必要があります
$signature = $this->get_signature($sigstr, $key);
//リクエストURLを構築します
$url .= $normalized_str.”&”.”oauth_signature=”.rawurlencode($signature);
return file_get_contents($url);
}
/**
* @brief パラメータを辞書の昇順に並べ替えます
*
* @param $params パラメータリスト
*
* @ソート後に & でリンクされたキーと値のペアを返します (key1=value1&key2=value2…)
*/
関数 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 署名値
*/
関数 get_signature($str, $key)
{
$signature = “”;
if (function_exists(‘hash_hmac’))
{
$signature =base64_encode(hash_hmac(“sha1″, $str, $key, true));
}
それ以外
{
$ブロックサイズ = 64;
$hashfunc = ‘sha1’;
if (strlen($key) > $blocksize)
{
$key = Pack(‘H*’, $hashfunc($key));
}
$key = str_pad($key,$blocksize,chr(0×00));
$ipad = str_repeat(chr(0×36),$blocksize);
$opad = str_repeat(chr(0x5c),$blocksize);
$hmac = パック(
‘H*’,$hashfunc(
($key^$opad).pack(
‘H*’,$hashfunc(
($key^$ipad).$str
)
)
)
);
$signature = Base64_encode($hmac);
}
$signature を返します;
}
/**
* @brief rfc1738 urlencode に従って文字列を URL エンコードします
*
* @param $params
*
* @return URLエンコードされた文字列
*/
関数 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 $timestampTimestamp
* @param $sig 署名値
*
* @return true または false
*/
関数 is_valid_openid($openid, $timestamp, $sig)
{
$key = $this->appkey;
$str = $openid.$timestamp;
$signature = $this->get_signature($str, $key);
//エコー “sig:$sign”;
//エコー “str:$strn”;
return $sig == $signature;
}
/**
* @brief すべての Get リクエストはこのメソッドを使用できます
*
* @param $url
* @param $appid
* @param $appkey
* @param $access_token
* @param $access_token_secret
* @param $openid
*
* @return true または false
*/
関数 do_get($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"]);
//パラメータ按照字母升序做序列化
$normalized_str = $this->get_normalized_string($params);
$sigstr .= rawurlencode($normalized_str);
//签名,确保php版本サポートhash_hmac関数数
$key = $this->appkey.”&”.$access_token_secret;
$signature = $this->get_signature($sigstr, $key);
$url .= “?”.$normalized_str.”&”.”oauth_signature=”.rawurlencode($signature);
//エコー “$urln”;
return file_get_contents($url);
}
/**
* @brief すべてのマルチパート投稿リクエストはこのメソッドを使用できます
*
* @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 “アップロード ファイル エラー $filevalue['error']n”;
//終了;
}
$params[$filename] = file_get_contents($filevalue["tmp_name"]);
}
//パラメータ按照字母升序做序列化
$sigstr .= $this->get_normalized_string($params);
//签名、必要确保php版本サポートhash_hmac関数数
$key = $appkey.”&”.$access_token_secret;
$signature = $this->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: $sigstrn”;
echo "キー: $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);
//アップロード一時ファイルを削除
リンク解除($tmpfile);
$ret を返します;
}
/**
* @brief すべての投稿リクエストはこのメソッドを使用できます
*
* @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"] = 時間();
$params["oauth_nonce"] = mt_rand();
$params["oauth_consumer_key"] = $appid;
$params["oauth_token"] = $access_token;
$params["openid"] = $openid;
unset($params["oauth_signature"]);
//パラメータをアルファベットの昇順でシリアル化します
$sigstr .= rawurlencode($this->get_normalized_string($params));
//署名。php バージョンが hash_hmac 関数をサポートしていることを確認する必要があります
$key = $appkey.”&”.$access_token_secret;
$signature = $this->get_signature($sigstr, $key);
$params["oauth_signature"] = $signature;
$postdata = $this->get_urlencode_string($params);
//エコー “$sigstr******n”;
//エコー “$postdatan”;
$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);
$ret を返します;
}
}
?>
現在はログイン機能のみですが、メソッドは今後のプロジェクトで引き続き更新されます

俊子ネットワーク PHP ウェブサイト構築より抜粋

www.bkjia.com本当http://www.bkjia.com/PHPjc/478352.html技術記事 ?php /*** QQ 操作クラス * $Author: shunzi $ * $Id: cls_qq.php 17171 2011-05-30 06:14:00Z shunzi $*/ クラス qq_api { var $appid = ; var $callback = ;
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。