• QQ登录接口集成,QQ+登录ASP.net+代码,+QQ+oauth的使用 .


    经过两天的努力 已经成功将QQ登录集成到了 城记网 上。感谢腾讯提供的帮助文档,和关键时刻给的技术支持。我的网站是asp.net写的,有需要的网友可以联系我。 呵呵。(尽管是垃圾站,只要你愿意,又有什么关系呢?)

        QQ Oauth 只提供PHP的接入demo ,针对 ASP.net 的只有一个网友开发的SDK包,下载地址还老打不开,后来我从CSDN上下载了一个,看了以后感觉太复杂了,我个人感觉做这么个小事情不需要搞个SDK出来,不如自己按帮助文档去写,这样自己写的方法灵活性就高一些,于是就按文档学习开发。其实文档写得很清晰,耐心一看就明白了。

    不讲太多的郁闷的过程了,直接说解决办法。

    办这个事情主要要知道下面几个事情。

    两个重点(如下):

    第一个重点:请求Token的步骤,

                          1:请求未授权的临时token。请求成功以后会转到QQ登录页面。

                          2:请求已授权的临时token。登陆成功以后获得。

                          3:请求已授权的Access token。

    第二个重点:签名的算法。

                         签名的值计算有一个指定的规则,请参考腾讯开放社区帮助文档,这是最 好的资料。

    注意点:

           没有申请APPID和APPKEY的先去申请。  

           传递的每一参数都要URLENcode,注意是每一个,包括动态生成的签名。

       参数之间是有顺序的,是升序排列的,无论有多少个,都要排序。

       各个步骤之间是有关联的,下一步的提交往往需要上一步的返回参数。

    我采取的文档结构:

    总共三个文件 ,非常简单。

    一个放在APPcode下面的类。用来发送请求和接待参数。

    两个前台页面,主要是对类的调用。

    下面把类的代码完全贴出,你知要一看见类,就知道怎么写前台页面了,很简单。

    1. using System;  
    2. using System.Data;  
    3. using System.Configuration;  
    4. using System.Web;  
    5. using System.Web.Security;  
    6. using System.Web.UI;  
    7. using System.Web.UI.WebControls;  
    8. using System.Web.UI.WebControls.WebParts;  
    9. using System.Web.UI.HtmlControls;  
    10. using System.Text;  
    11. using System.Net;  
    12. using System.Security.Cryptography;  
    13. using System.IO;  
    14. using System.Collections;  
    15.   
    16. /// <summary>  
    17. /// QQOAuth 的摘要说明  
    18. /// 版权:城记网(114box.com),请保留版权  
    19. /// 作者:JXY  
    20. /// Q  Q:281773404  
    21. /// 日 期:2011-08-20  
    22. /// </summary>  
    23. public class QQOAuth  
    24. {  
    25.     public static string appid = "21****";  
    26.     public static string appkey = "427ca17***************************de";  
    27.     public static string questadd = "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token";  
    28.   
    29.     /// <summary>  
    30.     /// 请求临时的Token  
    31.     /// </summary>  
    32.     /// <returns></returns>  
    33.     public static string GetTempToken()  
    34.     {  
    35.         string myrandomnum = oauthnonce(); //随机数  
    36.         string unixtime = GenerateTimeStamp();//时间戳  
    37.         string token_parameter = "oauth_consumer_key=" + appid + "&oauth_nonce=" + myrandomnum + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + unixtime + "&oauth_version=1.0";  
    38.         string code_token_parameter = "GET&" + Uri.EscapeDataString(questadd) + "&" + Uri.EscapeDataString(token_parameter);  
    39.         string miyuetemp = appkey + "&";  
    40.         string signvl = ToBase64hmac(code_token_parameter, miyuetemp);  
    41.         string url = string.Format("{0}?{1}{2}{3}",questadd, token_parameter, "&oauth_signature=", Uri.EscapeDataString(signvl));  
    42.         string QQreturnstr = RequestUrl(url);  
    43.         return QQreturnstr;  
    44.     }  
    45.   
    46.   
    47.     /// <summary>  
    48.     /// 请求ACCESS的Token  
    49.     /// </summary>  
    50.     /// <param name="oauth_token">获得授权临时Token的时候获得的参数</param>  
    51.     /// <param name="oauth_vericode">获得授权临时Token的时候获得的验证代码</param>  
    52.     /// <param name="oauth_token_secret">获得授权临时Token的时候获得的密钥</param>  
    53.     /// <returns>返回ACCess Token</returns>  
    54.     public static string GetAccessToken(string oauth_token, string oauth_vericode, string oauth_token_secret)  
    55.     {  
    56.         string thisquestadd = "http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token";  
    57.         string myrandomnum = oauthnonce(); //随机数  
    58.         string unixtime = GenerateTimeStamp();//时间戳  
    59.         string token_parameter = "oauth_consumer_key=" + appid + "&oauth_nonce=" + myrandomnum + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + unixtime + "&oauth_token=" + oauth_token + "&oauth_vericode=" + oauth_vericode + "&oauth_version=1.0";  
    60.         string code_token_parameter = "GET&" + Uri.EscapeDataString(thisquestadd) + "&" + Uri.EscapeDataString(token_parameter);  
    61.         string miyuetemp = appkey + "&" + oauth_token_secret;  
    62.         string signvl = ToBase64hmac(code_token_parameter, miyuetemp);  
    63.         string url = string.Format("{0}?{1}{2}{3}",thisquestadd, token_parameter, "&oauth_signature=", Uri.EscapeDataString(signvl));  
    64.         string QQreturnstr = RequestUrl(url);  
    65.         return QQreturnstr;  
    66.     }  
    67.   
    68.     /// <summary>  
    69.     /// 获得用户信息的API  
    70.     /// </summary>  
    71.     /// <param name="oauth_token">Access token 请求是返回的</param>  
    72.     /// <param name="openid">Access token 请求是返回的 openid</param>  
    73.     /// <param name="oauth_token_secret">Access token 请求是返回的动态密钥</param>  
    74.     /// <returns>XML</returns>  
    75.     public static string GetQQUserInfo(string oauth_token, string openid, string oauth_token_secret)  
    76.     {  
    77.         string thisquestadd = "http://openapi.qzone.qq.com/user/get_user_info";  
    78.         string myrandomnum = oauthnonce(); //随机数  
    79.         string unixtime = GenerateTimeStamp();//时间戳  
    80.         string token_parameter = "format=xml&oauth_consumer_key=" + appid + "&oauth_nonce=" + myrandomnum + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + unixtime + "&oauth_token=" + oauth_token  + "&oauth_version=1.0&openid="+openid;  
    81.         string code_token_parameter = "GET&" + Uri.EscapeDataString(thisquestadd) + "&" + Uri.EscapeDataString(token_parameter);  
    82.         string miyuetemp = appkey + "&" + oauth_token_secret;  
    83.         string signvl = ToBase64hmac(code_token_parameter, miyuetemp);  
    84.         string url = string.Format("{0}?{1}{2}{3}", thisquestadd, token_parameter, "&oauth_signature=", Uri.EscapeDataString(signvl));  
    85.         string QQreturnstr = RequestUrl(url);  
    86.         return QQreturnstr;  
    87.     }  
    88.   
    89.   
    90.   
    91.   
    92.   
    93.     #region 服务方法  
    94.   
    95.     /// <summary>  
    96.     /// hmacSha1算法加密并返回ToBase64String  
    97.     /// </summary>  
    98.     /// <param name="strText">签名参数字符串</param>  
    99.     /// <param name="strKey">密钥</param>  
    100.     /// <returns>返回一个签名参数值</returns>  
    101.     public static string ToBase64hmac(string strText, string strKey)  
    102.     {  
    103.         HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));  
    104.         byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));  
    105.         return System.Convert.ToBase64String(byteText);  
    106.     }  
    107.   
    108.     /// <summary>  
    109.     /// 请求指定url地址并返回结果  
    110.     /// </summary>  
    111.     /// <param name="url"></param>  
    112.     /// <returns></returns>  
    113.     public static string RequestUrl(string url)  
    114.     {  
    115.         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);  
    116.         request.Method = "GET";  
    117.         request.MaximumAutomaticRedirections = 3;  
    118.         request.Timeout = 0x2710;  
    119.         Stream responseStream = ((HttpWebResponse)request.GetResponse()).GetResponseStream();  
    120.         StreamReader reader = new StreamReader(responseStream);  
    121.         string str = reader.ReadToEnd();  
    122.         reader.Close();  
    123.         responseStream.Close();  
    124.         return str;  
    125.     }  
    126.   
    127.     /// <summary>  
    128.     /// Base64编码,此方法的功能同方法ToBase64hmac  
    129.     /// 目前内有使用该方法  
    130.     /// </summary>  
    131.     /// <returns></returns>  
    132.     public static string HMACSHA1(string consumer_secret, string oauth_token_secret, string signaturebasestring)  
    133.     {  
    134.         HMACSHA1 hmacsha1 = new HMACSHA1();  
    135.         hmacsha1.Key = Encoding.ASCII.GetBytes(consumer_secret + "&" + oauth_token_secret);  
    136.         byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(signaturebasestring);  
    137.         byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);  
    138.         string signature = Convert.ToBase64String(hashBytes);  
    139.         return signature;  
    140.     }  
    141.   
    142.     /// <summary>  
    143.     /// 时间戳返回unix时间戳  
    144.     /// </summary>  
    145.     /// <returns></returns>  
    146.     public static string GenerateTimeStamp()  
    147.     {  
    148.         TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);  
    149.         return Convert.ToInt64(ts.TotalSeconds).ToString();  
    150.     }  
    151.   
    152.     /// <summary>  
    153.     /// 随机字符串   
    154.     /// </summary>  
    155.     /// <returns></returns>  
    156.     public static string oauthnonce()  
    157.     {  
    158.         int number;  
    159.         string checkCode = String.Empty;  
    160.         Random random = new Random();  
    161.         for (int i = 0; i < 9; i++)  
    162.         {  
    163.             number = random.Next(0, 9);  
    164.   
    165.             checkCode += number.ToString();  
    166.         }  
    167.         return checkCode;  
    168.   
    169.     }  
    170.   
    171.     /// <summary>  
    172.     /// 将认证获得的参数简单转化为哈希表  
    173.     /// </summary>  
    174.     /// <param name="varstr">获得参数的字符串</param>  
    175.     /// <returns></returns>  
    176.     public static Hashtable Str2Hash(string varstr)  
    177.     {  
    178.         Hashtable myhash = new Hashtable();  
    179.         if (varstr.Trim() != string.Empty)  
    180.         {  
    181.             string[] temparr = varstr.Split('&');  
    182.             foreach (string onevarstr in temparr)  
    183.             {  
    184.                 string[] onevararr=onevarstr.Split('=');  
    185.                 myhash.Add(onevararr[0], onevararr[1]);  
    186.             }  
    187.             return myhash;  
    188.         }  
    189.         else  
    190.         {  
    191.             return null;  
    192.         }  
    193.     }  
    194.   
    195.     #endregion  
    196.   
    197. }  
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Text;
    using System.Net;
    using System.Security.Cryptography;
    using System.IO;
    using System.Collections;
    
    /// <summary>
    /// QQOAuth 的摘要说明
    /// 版权:城记网(114box.com),请保留版权
    /// 作者:JXY
    /// Q  Q:281773404
    /// 日 期:2011-08-20
    /// </summary>
    public class QQOAuth
    {
        public static string appid = "21****";
        public static string appkey = "427ca17***************************de";
        public static string questadd = "http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token";
    
        /// <summary>
        /// 请求临时的Token
        /// </summary>
        /// <returns></returns>
        public static string GetTempToken()
        {
            string myrandomnum = oauthnonce(); //随机数
            string unixtime = GenerateTimeStamp();//时间戳
            string token_parameter = "oauth_consumer_key=" + appid + "&oauth_nonce=" + myrandomnum + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + unixtime + "&oauth_version=1.0";
            string code_token_parameter = "GET&" + Uri.EscapeDataString(questadd) + "&" + Uri.EscapeDataString(token_parameter);
            string miyuetemp = appkey + "&";
            string signvl = ToBase64hmac(code_token_parameter, miyuetemp);
            string url = string.Format("{0}?{1}{2}{3}",questadd, token_parameter, "&oauth_signature=", Uri.EscapeDataString(signvl));
            string QQreturnstr = RequestUrl(url);
            return QQreturnstr;
        }
    
    
        /// <summary>
        /// 请求ACCESS的Token
        /// </summary>
        /// <param name="oauth_token">获得授权临时Token的时候获得的参数</param>
        /// <param name="oauth_vericode">获得授权临时Token的时候获得的验证代码</param>
        /// <param name="oauth_token_secret">获得授权临时Token的时候获得的密钥</param>
        /// <returns>返回ACCess Token</returns>
        public static string GetAccessToken(string oauth_token, string oauth_vericode, string oauth_token_secret)
        {
            string thisquestadd = "http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token";
            string myrandomnum = oauthnonce(); //随机数
            string unixtime = GenerateTimeStamp();//时间戳
            string token_parameter = "oauth_consumer_key=" + appid + "&oauth_nonce=" + myrandomnum + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + unixtime + "&oauth_token=" + oauth_token + "&oauth_vericode=" + oauth_vericode + "&oauth_version=1.0";
            string code_token_parameter = "GET&" + Uri.EscapeDataString(thisquestadd) + "&" + Uri.EscapeDataString(token_parameter);
            string miyuetemp = appkey + "&" + oauth_token_secret;
            string signvl = ToBase64hmac(code_token_parameter, miyuetemp);
            string url = string.Format("{0}?{1}{2}{3}",thisquestadd, token_parameter, "&oauth_signature=", Uri.EscapeDataString(signvl));
            string QQreturnstr = RequestUrl(url);
            return QQreturnstr;
        }
    
        /// <summary>
        /// 获得用户信息的API
        /// </summary>
        /// <param name="oauth_token">Access token 请求是返回的</param>
        /// <param name="openid">Access token 请求是返回的 openid</param>
        /// <param name="oauth_token_secret">Access token 请求是返回的动态密钥</param>
        /// <returns>XML</returns>
        public static string GetQQUserInfo(string oauth_token, string openid, string oauth_token_secret)
        {
            string thisquestadd = "http://openapi.qzone.qq.com/user/get_user_info";
            string myrandomnum = oauthnonce(); //随机数
            string unixtime = GenerateTimeStamp();//时间戳
            string token_parameter = "format=xml&oauth_consumer_key=" + appid + "&oauth_nonce=" + myrandomnum + "&oauth_signature_method=HMAC-SHA1&oauth_timestamp=" + unixtime + "&oauth_token=" + oauth_token  + "&oauth_version=1.0&openid="+openid;
            string code_token_parameter = "GET&" + Uri.EscapeDataString(thisquestadd) + "&" + Uri.EscapeDataString(token_parameter);
            string miyuetemp = appkey + "&" + oauth_token_secret;
            string signvl = ToBase64hmac(code_token_parameter, miyuetemp);
            string url = string.Format("{0}?{1}{2}{3}", thisquestadd, token_parameter, "&oauth_signature=", Uri.EscapeDataString(signvl));
            string QQreturnstr = RequestUrl(url);
            return QQreturnstr;
        }
    
    
    
    
    
        #region 服务方法
    
        /// <summary>
        /// hmacSha1算法加密并返回ToBase64String
        /// </summary>
        /// <param name="strText">签名参数字符串</param>
        /// <param name="strKey">密钥</param>
        /// <returns>返回一个签名参数值</returns>
        public static string ToBase64hmac(string strText, string strKey)
        {
            HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));
            byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));
            return System.Convert.ToBase64String(byteText);
        }
    
        /// <summary>
        /// 请求指定url地址并返回结果
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string RequestUrl(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.MaximumAutomaticRedirections = 3;
            request.Timeout = 0x2710;
            Stream responseStream = ((HttpWebResponse)request.GetResponse()).GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            string str = reader.ReadToEnd();
            reader.Close();
            responseStream.Close();
            return str;
        }
    
        /// <summary>
        /// Base64编码,此方法的功能同方法ToBase64hmac
        /// 目前内有使用该方法
        /// </summary>
        /// <returns></returns>
        public static string HMACSHA1(string consumer_secret, string oauth_token_secret, string signaturebasestring)
        {
            HMACSHA1 hmacsha1 = new HMACSHA1();
            hmacsha1.Key = Encoding.ASCII.GetBytes(consumer_secret + "&" + oauth_token_secret);
            byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(signaturebasestring);
            byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
            string signature = Convert.ToBase64String(hashBytes);
            return signature;
        }
    
        /// <summary>
        /// 时间戳返回unix时间戳
        /// </summary>
        /// <returns></returns>
        public static string GenerateTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }
    
        /// <summary>
        /// 随机字符串 
        /// </summary>
        /// <returns></returns>
        public static string oauthnonce()
        {
            int number;
            string checkCode = String.Empty;
            Random random = new Random();
            for (int i = 0; i < 9; i++)
            {
                number = random.Next(0, 9);
    
                checkCode += number.ToString();
            }
            return checkCode;
    
        }
    
        /// <summary>
        /// 将认证获得的参数简单转化为哈希表
        /// </summary>
        /// <param name="varstr">获得参数的字符串</param>
        /// <returns></returns>
        public static Hashtable Str2Hash(string varstr)
        {
            Hashtable myhash = new Hashtable();
            if (varstr.Trim() != string.Empty)
            {
                string[] temparr = varstr.Split('&');
                foreach (string onevarstr in temparr)
                {
                    string[] onevararr=onevarstr.Split('=');
                    myhash.Add(onevararr[0], onevararr[1]);
                }
                return myhash;
            }
            else
            {
                return null;
            }
        }
    
        #endregion
    
    }
    

    将上面的代码放到APPcode 下面,按步骤写你的前台页面就行了。

    我也做过PHP开发,我个人认为asp.net做这个要比PHP简单明了,不知道为什么腾讯不给出asp.net方面的demo。难道是对微软的歧视?!呵呵。

    文章来自:http://blog.csdn.net/hongsejiaozhu/article/details/6705117

    (博主牛)

    此文章来源于网络,版权不归本人所有。
  • 相关阅读:
    (转)Linux系统中sysctl命令详解 sysctl -p、sysctl -a、sysctl -w
    EM2 MP1 Vowel and Consonant Teacher:Ashley
    Phonics 自然拼读法 y,x,ch,sh,(voiced)th/ð/ ,(unvoiced) th/θ/ Teacher:Lamb
    java列表转成 int[] 的格式
    分类模型评估之ROC-AUC曲线和PRC曲线
    hive 抽样方法
    AUC理解
    Spark性能调优——基础篇
    scala 稀疏向量
    scala 建模
  • 原文地址:https://www.cnblogs.com/lidj/p/3044262.html
Copyright © 2020-2023  润新知