ASP獲取微信小程序的用戶ID(OpenID)——服務(wù)器端

寫給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í)序圖吧株依。


微信小程序登陸時(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)化妄痪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市楞件,隨后出現(xiàn)的幾起案子衫生,更是在濱河造成了極大的恐慌裳瘪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罪针,死亡現(xiàn)場離奇詭異彭羹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)站故,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門皆怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人西篓,你說我怎么就攤上這事愈腾。” “怎么了岂津?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵虱黄,是天一觀的道長。 經(jīng)常有香客問我吮成,道長橱乱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任粱甫,我火速辦了婚禮泳叠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茶宵。我一直安慰自己危纫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布乌庶。 她就那樣靜靜地躺著种蝶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞒大。 梳的紋絲不亂的頭發(fā)上螃征,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音透敌,去河邊找鬼盯滚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酗电,可吹牛的內(nèi)容都是我干的淌山。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顾瞻,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了德绿?” 一聲冷哼從身側(cè)響起荷荤,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤退渗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蕴纳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體会油,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年古毛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翻翩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稻薇,死狀恐怖嫂冻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塞椎,我是刑警寧澤桨仿,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站案狠,受9級(jí)特大地震影響服傍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骂铁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一吹零、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拉庵,春花似錦灿椅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伸辟,卻和暖如春麻惶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背信夫。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工窃蹋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人静稻。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓警没,卻偏偏與公主長得像,于是被迫代替她去往敵國和親振湾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杀迹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容