首页登陆欢迎您!
首页登陆 > 运维知识 > 微信端开发--登录小程序步骤_javascript技巧_脚本之家

微信端开发--登录小程序步骤_javascript技巧_脚本之家

时间:2019-12-12

这个小程序的主要目的是为了用户用微信的用户信息登录后将用户信息授权存入自己的数据库中,这样以后每次微信登录得到的code 所得到的 openid 可以在项目的数据库中查到该用户的相关信息。

前言

在测试的过程中,需要用户登录得到的code,所以会用到微信开发小工具~!

为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口。乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态。本文就来手把手的教会大家在业务里如何接入和维护微信登录态,下面话不多说了,来一起看看详细的介绍吧。

该工具的使用必须被项目授权

接入流程

所生成的code是有时间限制的

这里官方文档上的流程图已经足够清晰,我们直接就该图展开详述和补充。

微信登录端口的api如下

首先大家看到这张图,肯定会注意到小程序进行通信交互的不止是小程序前端和我们自己的服务端,微信第三方服务端也参与其中,那么微信服务端在其中扮演着怎样的角色呢?我们一起来串一遍登录鉴权的流程就明白了。

接口地址:

1. 调用wx.login生成code

参数 必填 说明 appid 是 小程序唯一标识 secret 是 小程序的 app secret js_code 是 登录时获取的 code grant_type 是 填写为 authorization_code

wx.login()这个API的作用就是为当前用户生成一个临时的登录凭证,这个临时登录凭证的有效期只有五分钟。我们拿到这个登录凭证后就可以进行下一步操作:获取 openid 和 session_key

参数 说明 openid 用户唯一标识 session_key 会话密钥 expires_in 会话有效期, 以秒为单位, 例如2592000代表会话有效期为30天

wx.login({ success: function { if  { // example: 081LXytJ1Xq1Y40sg3uJ1FWntJ1LXyth } }});
//正常返回的JSON数据包{ "openid": "OPENID", "session_key": "SESSIONKEY" "expires_in": 2592000}

//错误时返回JSON数据包{ "errcode": 40029, "errmsg": "invalid code"}

2. 获取openid和session_key

所以我们可以将代码写成如下

我们先来介绍下openid,用过公众号的童鞋应该对这个标识都不陌生了,在公众平台里,用来标识每个用户在订阅号、服务号、小程序这三种不同应用的唯一标识,也就是说每个用户在每个应用的openid都是不一致的,所以在小程序里,我们可以用openid来标识用户的唯一性。

公司将发送的报文格式自己都写好了的,我只需要写出请求路径和请求参数就ok

那么session_key是用来干嘛的呢?有了用户标识,我们就需要让该用户进行登录,那么 session_key 就保证了当前用户进行会话操作的有效性,这个session_key是微信服务端给我们派发的。也就是说,我们可以用这个标识来间接地维护我们小程序用户的登录态,那么这个session_key是怎么拿到的呢?我们需要在自己的服务端请求微信提供的第三方接口 ,这个接口需要带上四个参数字段:

//@Param code 用户登录微信生成的code//@Return OAuthResult 返回包含openid和session_key和expires_in的类public OAuthResult getOAuthResultByCode { String path = "/sns/jscode2session"; Map parameters = new HashMap<>(); parameters.put("appid", WechatConstant.WECHAT_APP_ID); parameters.put("secret", WechatConstant.WECHAT_APP_SECRET); parameters.put; parameters.put("grant_type", "authorization_code"); OAuthResult oAuthResult = messageSender.getMessageForObject(path, parameters, OAuthResult.class, false); if (oAuthResult.getOpenid{ throw new BusinessException(BusinessException.Code.OAUTH_PROCESS_ERROR, "OAuth异常,原因:" + oAuthResult.getErrmsg; } return oAuthResult; }

参数

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

appid 小程序的appid secret 小程序的secret js_code 前面调用wx.login派发的code grant_type 'authorization_code'

从这几个参数,我们可以看出,要请求这个接口必须先调用wx.login()来获取到用户当前会话的code。那么为什么我们要在服务端来请求这个接口呢?其实是出于安全性的考量,如果我们在前端通过request调用此接口,就不可避免的需要将我们小程序的appid和小程序的secret暴露在外部,同时也将微信服务端下发的session_key暴露给“有心之人”,这就给我们的业务安全带来极大的风险。除了需要在服务端进行session_key的获取,我们还需要注意两点:

session_key和微信派发的code是一一对应的,同一code只能换取一次session_key。每次调用wx.login() ,都会下发一个新的code和对应的session_key,为了保证用户体验和登录态的有效性,开发者需要清楚用户需要重新登录时才去调用wx.login() session_key是有失效性的,即便是不调用wx.login,session_key也会过期,过期时间跟用户使用小程序的频率成正相关,但具体的时间长短开发者和用户都是获取不到的

function getSessionKey (code, appid, appSecret) { var opt = { method: 'GET', url: 'https://api.weixin.qq.com/sns/jscode2session', params: { appid: appid, secret: appSecret, js_code: code, grant_type: 'authorization_code' } }; return http.then { var data = response.data; if (!data.openid || !data.session_key || data.errcode) { return { result: -2, errmsg: data.errmsg || '返回数据字段不完整' } } else { return data } });}

3. 生成3rd_session

前面说过通过 session_key 来“间接”地维护登录态,所谓间接,也就是我们需要 自己维护用户的登录态信息 ,这里也是考虑到安全性因素,如果直接使用微信服务端派发的session_key来作为业务方的登录态使用,会被“有心之人”用来获取用户的敏感信息,比如wx.getUserInfo()这个接口呢,就需要session_key来配合解密微信用户的敏感信息。

那么我们如果生成自己的登录态标识呢,这里可以使用几种常见的不可逆的哈希算法,比如md5、sha1等,将生成后的登录态标识返回给前端,并在前端维护这份登录态标识。而在服务端呢,我们会把生成的skey存在用户对应的数据表中,前端通过传递skey来存取用户的信息。

可以看到这里我们使用了sha1算法来生成了一个skey:

const crypto = require;return getSessionKey .then(resData => { // 选择加密算法生成自己的登录态标识 const { session_key } = resData; const skey = encryptSha1; function encryptSha1 { return crypto.createHash.update.digest}

4. checkSession

上一篇:总结几道关于Node.js的面试问题_node.js_脚本之家 下一篇:没有了