HTML文件中放置QQ登陆按钮
<a href="redirect.asp" target=_self data-role="button" class="ui-btn-right" style="height:24px;line-height:24px;"><img src="Images/bt_blue.png" height="24" alt="QQ登录" border="0"></a>
Redirect.asp文件内容如下:
<!--#include file="qqconnect.asp"-->
<%
Dim qc, url
Session("Code")=""
Session("Openid")=""
Session("Access_Token")=""
SET qc = New QqConnet
Session("State")=qc.MakeRandNum()
url = qc.GetAuthorization_Code()
Response.Redirect(url)
Set qc=Nothing
%>
qqconnect.asp内容如下:
<script language="jscript" runat="server">
function getjson(str){
try{
eval("var jsonStr = (" + str + ")");
}catch(ex){
var jsonStr = null;
}
return jsonStr;
}
</script>
<%
'==================================
'=类 名 称:QqConnet
'=功 能:QQ登录 For ASP
'=作 者:㊣FireFox㊣
'=Q Q: 63572063
'=日 期:2012-01-02
'==================================
'转载时请保留以上内容!!
Class QqConnet
Private QQ_OAUTH_CONSUMER_KEY
Private QQ_OAUTH_CONSUMER_SECRET
Private QQ_CALLBACK_URL
Private QQ_SCOPE
Private oDic,aKeys,access_token,TimeLine,boundary
'销毁对象
Private Sub Class_Terminate()
Set oDic = Nothing
End Sub
Private Sub Class_Initialize
QQ_OAUTH_CONSUMER_KEY = " "'APP ID
QQ_OAUTH_CONSUMER_SECRET = " "'APP KEY
QQ_CALLBACK_URL = " "'REDIRECT_URI
QQ_SCOPE ="get_user_info" '授权项 例如:QQ_SCOPE=get_user_info,list_album,upload_pic,do_like,add_t
'不传则默认请求对接口get_user_info进行授权。
'建议控制授权项的数量,只传入必要的接口名称,因为授权项越多,用户越可能拒绝进行任何授权。
TimeLine= DateDiff("s","01/01/1970 08:00:00",Now()) 'oauth_timestamp
boundary="------------------"&TimeLine
Set oDic = Server.CreateObject("Scripting.Dictionary")
End Sub
Property Get APP_ID()
APP_ID = QQ_OAUTH_CONSUMER_KEY
End Property
'生成Session("State")数据.
Public Function MakeRandNum()
Randomize
Dim width : width = 6 '随机数长度,默认6位
width = 10 ^ (width - 1)
MakeRandNum = Int((width*10 - width) * Rnd() + width)
End Function
Private Function CheckXml()
Dim oxml,Getxmlhttp
On Error Resume Next
oxml=array("Microsoft.XMLHTTP","Msxml2.ServerXMLHTTP.6.0","Msxml2.ServerXMLHTTP.5.0","Msxml2.ServerXMLHTTP.4.0","Msxml2.ServerXMLHTTP.3.0","Msxml2.ServerXMLHTTP","Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP")
For i=0 to ubound(oxml)
Set Getxmlhttp = Server.CreateObject(oxml(i))
If Err Then
Err.Clear
CheckXml = False
Else
CheckXml = oxml(i) :Exit Function
End if
Next
End Function
'Get方法请求url,获取请求内容
Private Function RequestUrl(url)
Set XmlObj = Server.CreateObject(CheckXml)
XmlObj.open "GET",url, false
XmlObj.send
If XmlObj.Readystate=4 Then
RequestUrl = XmlObj.responseText
Else
Response.Write("xmlhttp请求超时!")
Response.End()
End If
Set XmlObj = nothing
End Function
'Post方法请求url,获取请求内容
Private Function RequestUrl_post(url,data)
Set XmlObj = Server.CreateObject(CheckXml())
XmlObj.open "POST", url, false
XmlObj.setrequestheader "POST"," /t/add_t HTTP/1.1"
XmlObj.setrequestheader "Host"," graph.qq.com "
XmlObj.setrequestheader "content-length ",len(data)
XmlObj.setRequestHeader "Content-Type "," application/x-www-form-urlencoded "
XmlObj.setrequestheader "Connection"," Keep-Alive"
XmlObj.setrequestheader "Cache-Control"," no-cache"
XmlObj.send(data)
If XmlObj.Readystate=4 Then
RequestUrl_post = XmlObj.responseText
Else
Response.Write("xmlhttp请求超时!")
Response.End()
End If
Set XmlObj = nothing
End Function
Private Function CheckData(data,str)
If Instr(data,str)>0 Then
CheckData = True
Else
CheckData = False
End If
End Function
'生成登录地址
Public Function GetAuthorization_Code()
Dim url, params
url = "https://graph.qq.com/oauth2.0/authorize"
params = "client_id=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&redirect_uri=" & QQ_CALLBACK_URL
params = params & "&response_type=code"
params = params & "&scope="&QQ_SCOPE
params = params & "&state="&Session("State")
url = url & "?" & params
GetAuthorization_Code = (url)
End Function
'获取 access_token
Public Function GetAccess_Token()
Dim url, params,Temp
Url="https://graph.qq.com/oauth2.0/token"
params = "client_id=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&client_secret=" & QQ_OAUTH_CONSUMER_SECRET
params = params & "&redirect_uri=" & QQ_CALLBACK_URL
params = params & "&grant_type=authorization_code"
params = params & "&code="&Session("Code")
url = Url & "?" & params
Temp=RequestUrl(url)
If CheckData(Temp,"access_token=") = True Then
GetAccess_Token=CutStr(Temp,"access_token=","&")
Else
Response.Write("获取 Access_Token 时发生错误,错误代码:"&CutStr(Temp,"{""error"":",","))
Response.End()
End If
End Function
Sub setSession(str)
Dim ary1
ary1 = Split(Replace(str,"=","&"),"&")
If ubound(ary1) > 1 Then
Session("access_token") = ary1(1)
Session("expires_in") = ary1(3)
Session("refresh_token") = ary1(5)
End If
End Sub
'检测是否合法登录!
Public Function CheckLogin()
Dim Code,mState
Code=Trim(Request.QueryString("code"))
If Code<>"" Then
CheckLogin = True
Session("Code")=Code
Else
CheckLogin = False
End If
End Function
'获取openid
Public Function Getopenid()
Dim url, params,Temp
url = "https://graph.qq.com/oauth2.0/me"
params = "access_token="&Session("Access_Token")
url = Url & "?" & params
Temp=RequestUrl(url)
If Instr(Temp,"openid")>0 Then
set obj = getjson(CutStr(Temp,"(",")"))
if isobject(obj) Then
Getopenid=obj.openid
End If
set obj = Nothing
Else
set obj = getjson(CutStr(Temp,"(",")"))
if isobject(obj) Then
ret = obj.error
msg = obj.error_description
End If
set obj = Nothing
Response.Write("获取 openid 时发生错误,错误代码:"&ret&" , 错误描述:"&msg)
Response.End()
End If
End Function
'发送一条微博
Public Function Post_Webo(content)
Dim url, params
url = "https://graph.qq.com/t/add_t"
params = "oauth_consumer_key=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&access_token=" & Session("Access_Token")
params = params & "&openid=" & Session("Openid")
params = params & "&content="&content
params = params & "&format=json"
Post_Webo = RequestUrl_post(url,params)
End Function
'发送一条说说
Public Function Post_add_topic(content)
Dim url, params
url = "https://graph.qq.com/shuoshuo/add_topic"
params = "oauth_consumer_key=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&access_token=" & Session("Access_Token")
params = params & "&openid=" & Session("Openid")
params = params & "&con="&content
params = params & "&format=json"
Post_add_topic = RequestUrl_post(url,params)
End Function
'分享内容到QQ空间
Public Function Post_Share(title,turl,comment,summary,images)
Dim url, params
url = "https://graph.qq.com/share/add_share"
params = "oauth_consumer_key=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&access_token=" & Session("Access_Token")
params = params & "&openid=" & Session("Openid")
params = params & "&title="&title
params = params & "&url="&turl
params = params & "&title="&title
params = params & "&comment="&comment
params = params & "&summary="&summary
params = params & "&images="&images
params = params & "&format=json"
Post_Share = RequestUrl_post(url,params)
End Function
'获取用户信息,得到一个json格式的字符串
Public Function GetUserInfo()
Dim url, params, result
url = "https://graph.qq.com/user/get_user_info"
params = "oauth_consumer_key=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&access_token=" & Session("Access_Token")
params = params & "&openid=" & Session("Openid")
url = url & "?" & params
Temp = RequestUrl(url)
If CheckData(Temp,"nickname") = False Then
set obj = getjson(Temp)
if isobject(obj) Then
ret = obj.ret
msg = obj.msg
End If
set obj = Nothing
Response.Write("获取用户信息时发生错误,错误代码:"&ret&" , 错误描述:"&msg)
Response.End()
End If
GetUserInfo = Temp
End Function
'获取腾讯微博登录用户的用户资料,得到一个json格式的字符串
Public Function Get_Info()
Dim url, params, result
url = "https://graph.qq.com/user/get_info"
params = "oauth_consumer_key=" & QQ_OAUTH_CONSUMER_KEY
params = params & "&access_token=" & Session("Access_Token")
params = params & "&openid=" & Session("Openid")
params = params & "&format=json"
url = url & "?" & params
Get_Info = RequestUrl(url)
End Function
'获取用户名字,性别,从json字符串里截取相关字符
Public Function GetUserName(json)
Dim nickname,sex,obj
set obj = getjson(json)
if isobject(obj) Then
nickname = obj.nickname
sex = obj.gender
End If
set obj = Nothing
GetUserName = Array(nickname,sex)
End Function
'获取用户头像
Public Function GetUserPhoto(json)
Dim userphoto,obj
set obj = getjson(json)
if isobject(obj) Then
userphoto = obj.figureurl_qq_1
End If
set obj = Nothing
GetUserPhoto = userphoto
End Function
Public Function CutStr(data,s_str,e_str)
If Instr(data,s_str)>0 and Instr(data,e_str)>0 Then
CutStr = Split(data,s_str)(1)
CutStr = Split(CutStr,e_str)(0)
Else
CutStr = ""
End If
End Function
'发送数据
Function doRequest(verb, resLoc, getData, objData, multi)
Dim aUrl,xmlhttp
If(getData <>"") then getData = "?"&getData
aUrl = resLoc & getData
Response.write aUrl & "<br>"
Set xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.Open verb,aUrl,false
If(verb = "POST") Then
If(multi) Then '如果是图片
xmlhttp.setRequestHeader "Content-Type","multipart/form-data; boundary="&boundary
'图片上传处理
Else
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"
End If
End If
xmlhttp.send(objData)
doRequest=xmlhttp.responseText
'Response.Write("测试信息,可注释: " & Replace(Replace(doRequest,"<","<"),">",">") & "<br><br>一个在线格式化JSON数据的工具:http://jsonformatter.curiousconcept.com/<br><br>")
Set xmlhttp=Nothing
End Function
Function Sorts()
Dim i,arr(),aKeys,aItems
ReDim arr(oDic.Count-1)
aKeys = oDic.Keys
aItems = oDic.Items
For i=0 To oDic.Count-1
arr(i)=aKeys(i)&"="&strUrlEnCode(oDic.Item(aKeys(i)))
Next
Sorts=join(arr,"&")
End Function
'URL Encode,并将不需要转换的再替换回来
Function strUrlEnCode(byVal strUrl)
strUrlEnCode = Server.URLEncode(strUrl)
strUrlEnCode = Replace(strUrlEnCode,"%5F","_")
strUrlEnCode = Replace(strUrlEnCode,"%2E",".")
strUrlEnCode = Replace(strUrlEnCode,"%2D","-")
strUrlEnCode = Replace(strUrlEnCode,"+","%20")
End Function
End Class
%>
点击登陆后会在返回文件中附加Code=XXXX&State=XXXX内容,将此内容继续进行处理,可获得QQ图片,名字等信息。
If Len(Code)>0 then '登陆成功
SET qc = New QqConnet
Session("Access_Token")=qc.GetAccess_Token()
Session("Openid")=qc.Getopenid()
UserInfo=qc.GetUserInfo()
UserName=qc.GetUserName(UserInfo)(0)
UserPhoto=qc.GetUserPhoto(UserInfo)
End if