ASP获取微信小程序的用户ID(OpenID)——服务器端

写给ASP程序员共勉:老兵不死,只会慢慢凋零而已。

背景

尝试一下新鲜事物“微信小程序”,其中有一个业务场景,通过微信登陆小程序,这样需要获取小程序的用户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&js_code=JSCODE&grant_type=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格式的接口文件后,如何结构化。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容