专栏首页疯狂的小程序ASP获取微信小程序的OpenID服务器端代码
原创

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格式的接口文件后,如何结构化。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序火爆的因素

    几天前,我重新翻阅了2017年5月写的一篇关于小程序的文章,文章虽青涩但还算精确,文中阐述了三个观点:

    疯狂的小程序
  • 初探小程序之运营及未来方向

    网络流传微信会做操作系统,但这里指的操作系统并不是传统意义上的操作系统,他不一定要承载办公等所有需求,但发力点一定在数据上。只有好的数据、大量的数据才能在下一代...

    疯狂的小程序
  • 2017小程序发展大事件和未来3大趋势分析

    小程序风口的产生与移动互联网流量红利逐渐消逝关系密切。移动端用户的争夺,已从增量市场转向存量市场,从抢占用户转向抢占用户时间。然而,却有一块尚未完全开化的巨大流...

    疯狂的小程序
  • 小程序新能力-个人开发者尝鲜微信小程序

    个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工...

    JackieZheng
  • 小程序从零开始开发到上线的过程

    1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: https://mp.weixin.qq.com/ 根据指引填写信息和提交相...

    王小婷
  • 一篇搞定,小程序从零开发到上线

    1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: https://mp.weixin.qq.com/ 。

    谭庆波
  • 【晓快讯】小程序搜索规则又改了 / 用微信开发票可抽 2 次奖

    12 月 8 日,有读者向知晓程序(微信号 zxcx0101)爆料称,微信小程序再次对小程序搜索功能和「附近的小程序」功能进行更新。

    知晓君
  • 微信小程序更新:增加拍照摄像等多媒体功能

    微信公众号发文称,小程序新增录音、拍照摄像、视频播放等功能,大幅增加多媒体能力。同时小程序还进一步完善访客来源信息,让开发者有迹可循。 微信官方称小程序新增加的...

    企鹅号小编
  • 水果店小程序开发 生鲜水果店如何借力微信小程序多样化营销?

    门店经营最需要考虑的就是获得客户,在线下实体门店经营中,因为租金和人工成本的不断上涨,导致获客成本也随之不断上涨,仅靠线下门店获取客户,门店难以生存。

    微信小程序开发加盟服务商
  • C++简单实现八皇后问题

    forrestlin

扫码关注云+社区

领取腾讯云代金券