寫給ASP程序員共勉:老兵不死稿静,只會(huì)慢慢凋零而已。
背景
嘗試一下新鮮事物“微信小程序”浙踢,其中有一個(gè)業(yè)務(wù)場景,通過微信登陸小程序只嚣,這樣需要獲取小程序的用戶ID(也就是openid)沮稚。微信小程序從安全角度考慮,不提供直接在微信服務(wù)器獲取openid的方法册舞,那么需要借助自己的業(yè)務(wù)服務(wù)器去進(jìn)行獲取蕴掏。于是需要寫一個(gè)服務(wù)端的程序,接受用戶從微信小程序提交過來的請(qǐng)求调鲸,然后再向微信服務(wù)器發(fā)起請(qǐng)求盛杰,得到這個(gè)用戶的openid信息。
同樣藐石,處于安全考慮即供,微信不建議把這個(gè)openid返回給微信小程序。當(dāng)然這是后話于微,在此只探討獲取到oepnid這個(gè)環(huán)節(jié)逗嫡。
服務(wù)端用比較比較古樸的技術(shù)ASP(或者叫經(jīng)典ASP吧。)
官方文檔
微信小程序的官方文檔在這里:(https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject)
截取其中關(guān)鍵的時(shí)序圖吧株依。
我的學(xué)習(xí)
我學(xué)習(xí)理解下驱证,應(yīng)該有這么幾個(gè)環(huán)節(jié):
1、在小程序中用wx.login()
獲取到登陸憑證code恋腕。
2抹锄、通過小程序的wx.request()
將這個(gè)code發(fā)送至咱們自己的服務(wù)程序(本文的ASP程序)。
3荠藤、服務(wù)器ASP程序?qū)ode連同appid和appsecret一起發(fā)送至微信的服務(wù)器伙单。
4、接收微信返回的信息哈肖,包括openid和session_key车份,這兩個(gè)都不傳送到小程序客戶端。
5牡彻、既然不傳回去,就用一個(gè)我們自己定義的session來記錄登陸情況出爹,然后返回去庄吼。
6、返回到小程序的我們自己的定義session用storage存儲(chǔ)在客戶端(手機(jī))上严就。
7总寻、再次登陸時(shí)候,只讀取storage和我們自己的服務(wù)器發(fā)起通訊即可梢为。
本文我們只探討1-4步渐行。
開始動(dòng)手
1轰坊、微信小程序獲取登陸憑證code。
這個(gè)比較簡單祟印,在app.js里增加下面代碼肴沫;
wx.login({
success: res => {
// 發(fā)送 res.code 到后臺(tái)換取 openId, sessionKey, unionId
var code = res.code;
if (code) {
console.log('獲取用戶登錄憑證:' + code);
} else {
console.log('獲取用戶登錄態(tài)失敗:' + res.errMsg);
};
}
})
通過 console.log 把code打印出來了蕴忆。
2颤芬、微信小程序wx.request()將code提交到服務(wù)器
這一步暫時(shí)沒寫,也比較簡單套鹅,略過站蝠。下次我更新的時(shí)候再補(bǔ)齊。
3卓鹿、服務(wù)器ASP程序?qū)ode連同appid和appsecret一起發(fā)送至微信的服務(wù)器
微信服務(wù)器接口地址如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
ASP代碼如下:
<%
'''''''''''''''''''''''''''''''''''''''''
' api_login.asp
' 與微信服務(wù)器發(fā)生通訊
'''''''''''''''''''''''''''''''''''''''''
'常量配置
'微信API地址
WX_LOGIN_API = "https://api.weixin.qq.com/sns/jscode2session"
'AppID(小程序ID)
WX_APIID = "___你的APPID___"
'AppSecret(小程序密鑰)
WX_APPSECRET = "___你的AppSecret___"
'grant_type
WX_GRANT_TYPE = "authorization_code"
'JSCODE菱魔,接收小程序通過wx.request()傳過來的code
JSCODE = Request("code")
If JSCODE = "" Then
Response.Write "非法請(qǐng)求。"
Response.End
End If
'組裝完整的LOGIN_API
WX_LOGIN_API = WX_LOGIN_API & "?appid=" & WX_APIID
WX_LOGIN_API = WX_LOGIN_API & "&secret=" & WX_APPSECRET
WX_LOGIN_API = WX_LOGIN_API & "&js_code=" & JSCODE
WX_LOGIN_API = WX_LOGIN_API & "&grant_type=" & WX_GRANT_TYPE
'獲取返回的信息
strGetBackInfo=getHTTPPage(WX_LOGIN_API)
Response.Write strGetBackInfo
''''下面是ASP遠(yuǎn)程調(diào)用接口的函數(shù)
'''''''''''
' 遠(yuǎn)程獲取接口的函數(shù)群
'
'''''''''''
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
'on error resume next
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312")
End function
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring<=0 then Newstring=Len(wstr)
End Function
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
Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function
運(yùn)行吟孙,在URL中加上code信息澜倦,將獲取的json格式的openid和session_key打印出來,至此獲取了這部分信息拔疚。
但這些信息是字符串格式的肥隆,需要繼續(xù)將其轉(zhuǎn)換成json對(duì)象讀取才能夠結(jié)構(gòu)化。
4稚失、讀取json格式的openid和session_key
于是下述代碼就很重要了栋艳,主要包括讀取json格式的。
'''''''''''''''''
'
' ASP讀取Json的函數(shù)群
'
'''''''''''''''''
Dim sc4Json
Sub InitScriptControl
Set sc4Json = Server.CreateObject("MSScriptControl.ScriptControl")
sc4Json.Language = "JavaScript"
sc4Json.AddCode "var itemTemp=null;function getJSArray(arr, index){itemTemp=arr[index];}"
End Sub
Function getJSONObject(strJSON)
sc4Json.AddCode "var jsonObject = " & strJSON
Set getJSONObject = sc4Json.CodeObject.jsonObject
End Function
Sub getJSArrayItem(objDest,objJSArray,index)
On Error Resume Next
sc4Json.Run "getJSArray",objJSArray, index
Set objDest = sc4Json.CodeObject.itemTemp
If Err.number=0 Then Exit Sub
objDest = sc4Json.CodeObject.itemTemp
End Sub
Dim objTest
Call InitScriptControl
Set objTest = getJSONObject(strGetBackInfo)
%>
session_key:<%=objTest.session_key%><br />
openid:<%=objTest.openid%><br />
至此句各,已經(jīng)將獲取openid并且結(jié)構(gòu)化完畢吸占。
上述ASP操作Json的函數(shù)的用法,有位師兄寫了例子供開拓思路凿宾,我就不做修改矾屯,直接貼上來了。
Dim strTest
strTest = "{name:""alonely"", age:24, email:[""ycplxl1314@163.com"",""ycplxl1314@gmail.com""], family:{parents:[""父親"",""母親""],toString:function(){return ""家庭成員"";}}}"
Dim objTest
Call InitScriptControl
Set objTest = getJSONObject(strTest)
%>
<%=objTest.name%>的郵件地址是<%=sc4Json.Eval("jsonObject.email[0]")%><br />共有郵件地址<%=objTest.email.length%>個(gè)<br />
<%
Dim father
getJSArrayItem father, objTest.family.parents, 0
Response.Write father
%>
至此初厚,實(shí)驗(yàn)完畢件蚕。
小結(jié)
本文解決了兩個(gè)問題,值得我自己Mark:
1产禾、ASP怎么去調(diào)用接口文件排作。
2、ASP接收到Json格式的接口文件后亚情,如何結(jié)構(gòu)化妄痪。