背景 嘗試一下新鮮事物“微信小程序”,其中有一個業務場景,通過微信登陸小程序,這樣需要獲取小程序的用戶ID(也就是openid)。微信小程序從安全角度考慮,不提供直接在微信服務器獲取openid的方法,那么需要借助 ...
嘗試一下新鮮事物“微信小程序”,其中有一個業務場景,通過微信登陸小程序,這樣需要獲取小程序的用戶ID(也就是openid)。微信小程序從安全角度考慮,不提供直接在微信服務器獲取openid的方法,那么需要借助自己的業務服務器去進行獲取。于是需要寫一個服務端的程序,接受用戶從微信小程序提交過來的請求,然后再向微信服務器發起請求,得到這個用戶的openid信息。
同樣,處于安全考慮,微信不建議把這個openid返回給微信小程序。當然這是后話,在此只探討獲取到oepnid這個環節。
服務端用比較比較古樸的技術ASP(或者叫經典ASP吧。)
微信小程序的官方文檔在這里:(https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject)
截取其中關鍵的時序圖吧。
微信小程序登陸時序圖
我學習理解下,應該有這么幾個環節:
1、在小程序中用wx.login()獲取到登陸憑證code。
2、通過小程序的wx.request()將這個code發送至咱們自己的服務程序(本文的ASP程序)。
3、服務器ASP程序將code連同appid和appsecret一起發送至微信的服務器。
4、接收微信返回的信息,包括openid和session_key,這兩個都不傳送到小程序客戶端。
5、既然不傳回去,就用一個我們自己定義的session來記錄登陸情況,然后返回去。
6、返回到小程序的我們自己的定義session用storage存儲在客戶端(手機)上。
7、再次登陸時候,只讀取storage和我們自己的服務器發起通訊即可。
本文我們只探討1-4步。
1、微信小程序獲取登陸憑證code。
這個比較簡單,在app.js里增加下面代碼;
wx.login({
success: res => {
// 發送 res.code 到后臺換取 openId, sessionKey, unionId
var code = res.code;
if (code) {
console.log('獲取用戶登錄憑證:' + code);
} else {
console.log('獲取用戶登錄態失敗:' + res.errMsg);
};
}
})
通過 console.log 把code打印出來了。
2、微信小程序wx.request()將code提交到服務器
這一步暫時沒寫,也比較簡單,略過。下次我更新的時候再補齊。
3、服務器ASP程序將code連同appid和appsecret一起發送至微信的服務器
微信服務器接口地址如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&jscode=JSCODE&granttype=authorization_code
ASP代碼如下:
<%
'''''''''''''''''''''''''''''''''''''''''
' api_login.asp
' 與微信服務器發生通訊
'''''''''''''''''''''''''''''''''''''''''
'常量配置
'微信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 "非法請求。"
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遠程調用接口的函數
'''''''''''
' 遠程獲取接口的函數群
'
'''''''''''
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
運行,在URL中加上code信息,將獲取的json格式的openid和session_key打印出來,至此獲取了這部分信息。
但這些信息是字符串格式的,需要繼續將其轉換成json對象讀取才能夠結構化。
4、讀取json格式的openid和session_key
于是下述代碼就很重要了,主要包括讀取json格式的。
'''''''''''''''''
'
' ASP讀取Json的函數群
'
'''''''''''''''''
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 />
至此,已經將獲取openid并且結構化完畢。
上述ASP操作Json的函數的用法,有位師兄寫了例子供開拓思路,我就不做修改,直接貼上來了。
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%>個<br />
<%
Dim father
getJSArrayItem father, objTest.family.parents, 0
Response.Write father
%>
至此,實驗完畢。
本文解決了兩個問題,值得我自己Mark:
1、ASP怎么去調用接口文件。
2、ASP接收到Json格式的接口文件后,如何結構化。