版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29729735/article/details/85259809
最近为一个aspcms网站添加微信分享带图片,描述的功能。
由于官方提供的代码里没有提供asp版本的源码,所以需要自己研究。
根据官网提供的代码,参考php版本的源码风格,我的源码文件目录为:
代码如下:
我们先来看access_token.asp的文件
<%response.end%>{"access_token":"your access_token","expire_time":2018/12/26 11:56:51}
注意到了没有前边加了<%response.end%>就是为了非法访问获取这些数据,而后边数据类似json格式,主要缓存access_token和过期时间。
同理jsapi_ticket.asp
<%response.end%>{"ticket":"your ticket","expire_time":2018/12/26 11:56:52}
核心类jssdk.asp,由于asp类貌似不能像php那样向构造函数传入参数,所以写在私有属性里
<!--#include file="sha1.asp" -->
<%
Session.codepage=65001 '将系统默认的gb2312编码转换成utf-8
Class JSSDK
Private appId
Private appSecret
Private access_token_file
Private jsapi_ticket_file
‘这里初始化类
Private Sub Class_Initialize
appId = "your appid" '注册你的appid
appSecret = "your appsecret" '注册你的appSecret
access_token_file = "access_token.asp" '缓存access_token文件
jsapi_ticket_file = "jsapi_ticket.asp" '缓存jsapi_ticket文件
End Sub
'把标准时间转换为UNIX时间戳
public Function ToUnixTime(strTime, intTimeZone)
If IsEmpty(strTime) or Not IsDate(strTime) Then strTime = Now
If IsEmpty(intTimeZone) or Not isNumeric(intTimeZone) Then intTimeZone = 0
ToUnixTime = DateAdd("h",-intTimeZone,strTime)
ToUnixTime = DateDiff("s","1970-01-01 00:00:00", ToUnixTime)
End Function
'返回wx.conf所需数据
Public Function getSignPackage(url)
dim nonceStr,jsapiTicket,nowtime,jsstr,returnStr
nonceStr = createNonceStr(6)
jsapiTicket = getJsApiTicket
nowtime = ToUnixTime(now(),0)
jsstr = "jsapi_ticket="&jsapiTicket&"&noncestr="&nonceStr&"×tamp="&nowtime&"&url="&url '拼接signature字符串
signature = SHA1(jsstr) '加密字符串
returnStr = "{""appId"": """&appId&""",""nonceStr"":"""&nonceStr&""",""timestamp"":"""&nowtime&""",""url"":"""&url&""",""signature"":"""&signature&""",""rawString"":"""&jsstr&"""}" '拼接返回字符串(json)格式
getSignPackage = returnStr
End Function
'随机字符函数'
Private function createNonceStr(length)
dim chars,str,i,seedLength
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
seedLength = Len(chars)
str = ""
Randomize
for i=0 to length
str = str + Mid(chars,Int(seedLength*Rnd)+1,1)
next
createNonceStr = str
End Function
'读取缓存文件'
Public Function get_asp_file(FileUrl,CharSet)
dim str
set stm=server.CreateObject("adodb.stream")
stm.Type=2 '以本模式读取
stm.mode=3
stm.charset=CharSet
stm.open
stm.loadfromfile server.MapPath(FileUrl)
str=stm.readtext
stm.Close
set stm=nothing
get_asp_file=str
End Function
'写文件'
Public Function set_asp_file(FileUrl,Byval Str,CharSet)
set stm=server.CreateObject("adodb.stream")
stm.Type=2 '以本模式读取
stm.mode=3
stm.charset=CharSet
stm.open
stm.WriteText str
stm.SaveToFile server.MapPath(FileUrl),2
stm.flush
stm.Close
set stm=nothing
End Function
'向微信服务器发送请求
Public Function GetBody(weburl)
Dim ObjXMLHTTP
Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP")
ObjXMLHTTP.Open "GET",weburl,False
ObjXMLHTTP.send
While ObjXMLHTTP.readyState <> 4
ObjXMLHTTP.waitForResponse 10000
Wend
GetBody=ObjXMLHTTP.responseBody
Set ObjXMLHTTP=Nothing
End Function
'解析微信服务器返回的数据
Public Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
'解析字符串,主要用来解析json和缓存文件
Public Function GetContent(str,start,last,n)
If Instr(lcase(str),lcase(start))>0 then
select case n
case 0 '左右都截取(都取前面)(去除关键字)
GetContent=Right(str,Len(str)-Instr(lcase(str),lcase(start))-Len(start)+1)
GetContent=Left(GetContent,Instr(lcase(GetContent),lcase(last))-1)
case 1 '左右都截取(都取前面)(保留关键字)
GetContent=Right(str,Len(str)-Instr(lcase(str),lcase(start))+1)
GetContent=Left(GetContent,Instr(lcase(GetContent),lcase(last))+Len(last)-1)
case 2 '只往右截取(取前面的)(去除关键字)
GetContent=Right(str,Len(str)-Instr(lcase(str),lcase(start))-Len(start)+1)
case 3 '只往右截取(取前面的)(包含关键字)
GetContent=Right(str,Len(str)-Instr(lcase(str),lcase(start))+1)
case 4 '只往左截取(取后面的)(包含关键字)
GetContent=Left(str,InstrRev(lcase(str),lcase(start))+Len(start)-1)
case 5 '只往左截取(取后面的)(去除关键字)
GetContent=Left(str,InstrRev(lcase(str),lcase(start))-1)
case 6 '只往左截取(取前面的)(包含关键字)
GetContent=Left(str,Instr(lcase(str),lcase(start))+Len(start)-1)
case 7 '只往右截取(取后面的)(包含关键字)
GetContent=Right(str,Len(str)-InstrRev(lcase(str),lcase(start))+1)
case 8 '只往左截取(取前面的)(去除关键字)
GetContent=Left(str,Instr(lcase(str),lcase(start))-1)
case 9 '只往右截取(取后面的)(包含关键字)
GetContent=Right(str,Len(str)-InstrRev(lcase(str),lcase(start)))
end select
Else
GetContent=""
End if
End function
'获取access_token并缓存到文件
Public Function GetAccess_token()
dim pcontent,Access_token,expire_time,url,CacheStr,CacheAccess_token,Cache_time,now_time
CacheStr = get_asp_file(access_token_file,"gb2312")
CacheStr = Mid(CacheStr,18)'删除前缀'
Cache_time = GetContent(Mid(CacheStr ,17),"""expire_time"":","}",0)
if DateDiff("s", Cache_time, now()) > 0 then '如果现在时间大于过期时间'
url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" & appId &"&secret="& appSecret
pcontent=BytesToBstr(GetBody(url),"utf-8")
Access_token=trim(GetContent(pcontent,"""access_token"":""",""",",0))
expire_time = DateAdd("h",2,now())
'写文件'
CacheStr = chr(60) & chr(37) & "response.end" & chr(37) & chr(62) & "{""access_token"":"""&Access_token&""",""expire_time"":"&expire_time&"}" '用chr转码
set_asp_file access_token_file,CacheStr,"utf-8"
GetAccess_token =Access_token
else
GetAccess_token = GetContent(CacheStr,"""access_token"":""",""",",0)
end if
End Function
'获取JsApiTicket并缓存到文件
Public Function getJsApiTicket()
dim pcontent,Access_token,expire_time,url,CacheStr,CacheAccess_token,Cache_time,now_time,ticket
CacheStr = get_asp_file(jsapi_ticket_file,"gb2312")
CacheStr = Mid(CacheStr,18)'删除前缀'
Cache_time = GetContent(CacheStr,"""expire_time"":","}",0)
if DateDiff("s", Cache_time, now()) > 0 then '如果现在时间大于过期时间
Access_token = GetAccess_token()
url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" &Access_token
pcontent=BytesToBstr(GetBody(url),"utf-8")
ticket=trim(GetContent(pcontent,"""ticket"":""",""",",0))
expire_time = DateAdd("h",2,now()) '增加两小时
'写文件
CacheStr = chr(60) & chr(37) & "response.end" & chr(37) & chr(62) & "{""ticket"":"""&ticket&""",""expire_time"":"&expire_time&"}" '用chr转码
set_asp_file jsapi_ticket_file,CacheStr,"utf-8"
getJsApiTicket =ticket
else
getJsApiTicket = GetContent(CacheStr,"""ticket"":""",""",",0)
'getJsApiTicket = "old"
end if
End Function
End Class
%>
share.asp
<!--#include file="jssdk.asp" -->
<%
dim js,qs
qs = request.querystring("url") '获取
set js = new JSSDK
response.write js.getSignPackage(qs)
%>
前端index.html
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
$(function(){
var url = location.href.split('#')[0].toString();//url不能写死
$.ajax({
type : "get",
url : "/wx/share.asp",
dataType : "json",
async : false,
data:{url:url},
success : function(data) {
wx.config({
appId: data.appId,//appId通过微信服务号后台查看
timestamp: data.timestamp,//生成签名的时间戳
nonceStr: data.nonceStr,//生成签名的随机字符串
signature: data.signature,//签名
jsApiList: [//需要调用的JS接口列表
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
]
});
},
error:function(xhr, status, error){
}
})
var meta = document.getElementsByTagName('meta'); var share_desc = ''; for(i in meta){ if(typeof meta[i].name!="undefined"&&meta[i].name.toLowerCase()=="description"){ share_desc = meta[i].content; } }
var wstitle = document.title //此处填写分享标题
var wsdesc = share_desc; //此处填写分享简介(此处为网站描述)
var wslink = url; //此处获取分享链接
var wsimg = "logo.jpg"; //此处获取分享缩略图
wx.ready(function () {
// 分享到朋友圈
wx.onMenuShareTimeline({
title: wstitle,
link: wslink,
imgUrl: wsimg,
success: function () {
alert('分享成功');
},
cancel: function () {
}
});
// 分享给朋友
wx.onMenuShareAppMessage({
title: wstitle,
desc: wsdesc,
link: wslink,
imgUrl: wsimg,
success: function () {
},
cancel: function () {
}
});
// 分享到QQ
wx.onMenuShareQQ({
title: wstitle,
desc: wsdesc,
link: wslink,
imgUrl: wsimg,
success: function () {
},
cancel: function () {
}
});
// 微信到腾讯微博
wx.onMenuShareWeibo({
title: wstitle,
desc: wsdesc,
link: wslink,
imgUrl: wsimg,
success: function () {
},
cancel: function () {
}
});
// 分享到QQ空间
wx.onMenuShareQZone({
title: wstitle,
desc: wsdesc,
link: wslink,
imgUrl: wsimg,
success: function () {
},
cancel: function () {
}
});
});
})
</script>