ASP获取微信小程序的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_typeWX_GRANT_TYPE = "authorization_code"'JSCODE,接收小程序通过wx.request()传过来的codeJSCODE = Request("code")If JSCODE = "" Then Response.Write "非法请求。" Response.End End If'组装完整的LOGIN_APIWX_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=" & JSCODEWX_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 InitScriptControlSet 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.jsonObjectEnd 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.itemTempEnd SubDim objTestCall InitScriptControlSet objTest = getJSONObject(strGetBackInfo)%>session_key:<%=objTest.session_key%><br />openid:<%=objTest.openid%><br />
至此,已经将获取openid并且结构化完毕。
上述ASP操作Json的函数的用法,有位师兄写了例子供开拓思路,我就不做修改,直接贴上来了。
Dim strTeststrTest = "{name:""alonely"", age:24, email:[""ycplxl1314@163.com"",""ycplxl1314@gmail.com""], family:{parents:[""父亲"",""母亲""],toString:function(){return ""家庭成员"";}}}"Dim objTestCall InitScriptControlSet objTest = getJSONObject(strTest)%><%=objTest.name%>的邮件地址是<%=sc4Json.Eval("jsonObject.email[0]")%><br />共有邮件地址<%=objTest.email.length%>个<br /><%Dim fathergetJSArrayItem father, objTest.family.parents, 0Response.Write father%>
至此,实验完毕。
小结
本文解决了两个问题,值得我自己Mark: 1、ASP怎么去调用接口文件。 2、ASP接收到Json格式的接口文件后,如何结构化。
- HDU 2034 人见人爱A-B
- Hadoop数据分析平台实战——030Hadoop Shell命令02(熟悉linux跳过)离线数据分析平台实战——030Hadoop Shell命令02
- Hadoop数据分析平台实战——070深入理解MapReduce 02(案例)离线数据分析平台实战——070深入理解MapReduce 02
- Hadoop数据分析平台实战——040HDFS介绍(熟悉基础概念跳过)离线数据分析平台实战——040HDFS&JAVA API(熟悉基础概念跳过)
- Hadoop数据分析平台实战——060深入理解MapReduce 01(案例)离线数据分析平台实战——060深入理解MapReduce 01(案例)
- 利用向量积(叉积)计算三角形的面积和多边形的面积
- HDU 1556 Color the ball
- Hadoop数据分析平台实战——080HBase介绍和安装离线数据分析平台实战——080HBase介绍和安装
- Hadoop数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)离线数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)
- ECJTUACM16 Winter vacation training #4 题解&源码
- Hadoop数据分析平台实战——090HBase shell客户端和Java Api介绍离线数据分析平台实战——090HBase shell客户端和Java Api介绍
- Hadoop数据分析平台实战——140Hive函数以及自定义函数讲解离线数据分析平台实战——140Hive函数以及自定义函数讲解
- 深入理解树状数组
- Codeforces 712C Memory and De-Evolution
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法