1. 微信小程序登录流程概述
微信小程序的登录机制涉及小程序端、业务服务器和微信服务器的三方交互。为了安全获取用户唯一标识,小程序需要通过业务服务器中转获取用户信息,而不是直接从微信服务器获取。这一过程主要包括以下几个关键步骤:获取登录凭证code、将code发送至业务服务器、业务服务器向微信服务器请求用户信息、处理返回数据。
2. 获取登录凭证code
在小程序端,开发者可以通过调用wx.login()
接口获取临时登录凭证code。这个code有效期较短(约5分钟),用于后续向微信服务器换取用户信息。在小程序的app.js
文件中,可以添加以下代码实现:
wx.login({
success(res) {
if (res.code) {
console.log('获取到的code:', res.code)
}
}
})
这段代码会将获取到的code通过控制台输出,便于开发者调试。
3. 向业务服务器发送code
获取到code后,小程序需要通过wx.request()
接口将code发送到开发者自己的业务服务器。这一步需要注意的是:
需要配置合法域名
建议使用HTTPS协议确保传输安全
可以在请求头中添加必要的验证信息
虽然这部分代码在本文中暂未展示,但实现起来相对简单,主要是构建一个HTTP请求将code作为参数传递给业务服务器。
4. 业务服务器处理流程
业务服务器(本文使用ASP实现)收到code后,需要完成以下工作:
4.1 构造请求参数
业务服务器需要准备三个关键参数向微信服务器发起请求:
小程序appid
小程序secret
前端传来的code
这些参数需要按照微信接口要求进行组装。
4.2 调用微信接口
微信提供的接口地址为:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
ASP代码可以通过XMLHTTP对象发起这个请求:
asp
<%
Dim code, url, xmlhttp, result
code = Request.QueryString("code")
url = "https://api.weixin.qq.com/sns/jscode2session?appid=你的APPID&secret=你的SECRET&js_code=" & code & "&grant_type=authorization_code"
Set xmlhttp = Server.CreateObject("MSXML2.XMLHTTP")
xmlhttp.open "GET", url, false
xmlhttp.send
result = xmlhttp.responseText
Response.Write result
%>
<b>4.3 处理返回数据</b>
微信服务器会返回JSON格式的数据,包含两个重要信息:
openid:用户唯一标识
session_key:会话密钥
由于安全考虑,这些信息不应该传回小程序客户端。ASP需要处理这个JSON响应,将其转换为可操作的对象。
<b>5. JSON数据处理</b>
在ASP中处理JSON数据需要借助一些辅助函数。以下是关键代码片段:
asp
<%
' 解析JSON字符串的函数
Function ParseJSON(json)
' 实现JSON解析逻辑
' ...
End Function
' 使用示例
<%'''''''''''''''''''''''''''''''''''''''''' 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
Dim jsonObj
Set jsonObj = ParseJSON(result)
Dim openid, session_key
openid = jsonObj("openid")
session_key = jsonObj("session_key")
%>
`
这个解析过程可以将微信返回的JSON字符串转换为ASP可以操作的对象,从而提取出openid和session_key等关键信息。
6. 安全注意事项
''''''''''''''''''' 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%>
openid:<%=objTest.openid%>
在整个流程中,有几个重要的安全考虑:
1. 小程序secret是极其敏感的信息,必须妥善保管,绝不能出现在客户端代码中
2. session_key也不应该返回给小程序客户端
3. 建议业务服务器使用HTTPS协议
4. 可以考虑对请求进行签名验证,防止伪造请求
7. 总结
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]")%>
共有邮件地址<%=objTest.email.length%>个
<%Dim fathergetJSArrayItem father, objTest.family.parents, 0Response.Write father%>
本文详细介绍了微信小程序登录机制中业务服务器的实现过程,重点包括:
微信登录的整体流程
ASP调用微信接口的方法
JSON数据的解析处理
这些技术不仅适用于用户登录场景,也可以推广到其他需要与微信服务器交互的业务场景中。通过业务服务器中转的方式,既保障了数据安全,又能灵活地实现各种业务逻辑。
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态