背景 嘗試一下新鮮事物“微信小程序”,其中有一個(gè)業(yè)務(wù)場(chǎng)景,通過(guò)微信登陸小程序,這樣需要獲取小程序的用戶(hù)ID(也就是openid)。微信小程序從安全角度考慮,不提供直接在微信服務(wù)器獲取openid的方法,那么需要借助 ...
嘗試一下新鮮事物“微信小程序”,其中有一個(gè)業(yè)務(wù)場(chǎng)景,通過(guò)微信登陸小程序,這樣需要獲取小程序的用戶(hù)ID(也就是openid)。微信小程序從安全角度考慮,不提供直接在微信服務(wù)器獲取openid的方法,那么需要借助自己的業(yè)務(wù)服務(wù)器去進(jìn)行獲取。于是需要寫(xiě)一個(gè)服務(wù)端的程序,接受用戶(hù)從微信小程序提交過(guò)來(lái)的請(qǐng)求,然后再向微信服務(wù)器發(fā)起請(qǐng)求,得到這個(gè)用戶(hù)的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í)序圖吧。
微信小程序登陸時(shí)序圖
我學(xué)習(xí)理解下,應(yīng)該有這么幾個(gè)環(huán)節(jié):
1、在小程序中用wx.login()獲取到登陸憑證code。
2、通過(guò)小程序的wx.request()將這個(gè)code發(fā)送至咱們自己的服務(wù)程序(本文的ASP程序)。
3、服務(wù)器ASP程序?qū)ode連同appid和appsecret一起發(fā)送至微信的服務(wù)器。
4、接收微信返回的信息,包括openid和session_key,這兩個(gè)都不傳送到小程序客戶(hù)端。
5、既然不傳回去,就用一個(gè)我們自己定義的session來(lái)記錄登陸情況,然后返回去。
6、返回到小程序的我們自己的定義session用storage存儲(chǔ)在客戶(hù)端(手機(jī))上。
7、再次登陸時(shí)候,只讀取storage和我們自己的服務(wù)器發(fā)起通訊即可。
本文我們只探討1-4步。
1、微信小程序獲取登陸憑證code。
這個(gè)比較簡(jiǎn)單,在app.js里增加下面代碼;
wx.login({
success: res => {
// 發(fā)送 res.code 到后臺(tái)換取 openId, sessionKey, unionId
var code = res.code;
if (code) {
console.log('獲取用戶(hù)登錄憑證:' + code);
} else {
console.log('獲取用戶(hù)登錄態(tài)失敗:' + res.errMsg);
};
}
})
通過(guò) console.log 把code打印出來(lái)了。
2、微信小程序wx.request()將code提交到服務(wù)器
這一步暫時(shí)沒(méi)寫(xiě),也比較簡(jiǎn)單,略過(guò)。下次我更新的時(shí)候再補(bǔ)齊。
3、服務(wù)器ASP程序?qū)ode連同appid和appsecret一起發(fā)送至微信的服務(wù)器
微信服務(wù)器接口地址如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&jscode=JSCODE&granttype=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,接收小程序通過(guò)wx.request()傳過(guò)來(lái)的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打印出來(lái),至此獲取了這部分信息。
但這些信息是字符串格式的,需要繼續(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ù)的用法,有位師兄寫(xiě)了例子供開(kāi)拓思路,我就不做修改,直接貼上來(lái)了。
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)完畢。
本文解決了兩個(gè)問(wèn)題,值得我自己Mark:
1、ASP怎么去調(diào)用接口文件。
2、ASP接收到Json格式的接口文件后,如何結(jié)構(gòu)化。