收藏
回答

请问大家小程序登录都怎么做的,官方文档看不太懂

那个3rd_session 这个是自己生成的, 回传给客户端,但是客户端请求的时候都是怎么带上这个参数的呢?包装一个函数,每次都带上这个值吗?



php的话, 自己做会话管理,用什么方法合适,数据库吗?还是文件形式,哪种效率高,我是个人开发者,没有团队经验

最后一次编辑于  2018-02-07  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

6 个回答

  • Yang
    Yang
    2018-02-08

    小程序登录流程:

    第一步:

    前端:

            1、调用wx.login获取code,将 code 作为参数并发送网络请求到后台换取 openId, sessionKey, unionId;

    后端:

            1、接收前端传来的code并调用微信api获取 openId, sessionKey, unionId;

            2、生成sessionid作为用户会话标识,也就是3rd_session,将sessionid作为key,openId和sessionKey作为value,并为其设置有效期,存储到redis或其他内存数据库中,持久化;

            3、仅返回sessionid到前端(openId, sessionKey, unionId不应返回);

    第二步:

    前端:

        1、接收后台返回的sessionid,并存入本地缓存(手机内存);

            当需要请求用户相关数据时,在请求头带上sessionid发送网络请求到后端;

    后端:

        1、接收前端传来的sessionid,验证其合法性及有效期,根据验证结果进行逻辑处理;

            验证成功:继续执行业务逻辑;

            验证失败:返回失败状态码到前端;

    前端:

        1、接收后台返回数据;

            成功:执行前端业务逻辑(数据展示等);

            失败:根据返回状态码判断是否重新登录;

            重新登录:调用wx.login获取code....(重新执行一遍登录流程)


    以上就是根据官方文档的要求和处理流程归结的小程序登录流程。


    客户端请求的时候都是怎么带上这个参数的呢?

    答:

    可以将 封装在http请求头中,如:

    header: {

    "Content-Type": "application/json",//post时应使用:"Content-Type": "application/x-www-form-urlencoded"

    'Authorization': 'Bearer ' + authorization,//后端授权凭证(后端接口的token验证,与小程序登录流程无直接关系)

    'Cookie': "sessionid=" + sessionid //后端返回的sessionid,在发送网络请求前,从本地缓存中取出,在这里带上

    }


    后端获取sessionid:

    以.net为例


    //从Cookie中获取sessionid

    string sessionId = "";

    CookieHeaderValue cookie = Request.Headers.GetCookies("sessionid").FirstOrDefault();

    sessionId = cookie["sessionid"].Value;


    取得sessionid之后,以sessionid为key,到redis中取值,根据取值结果(取到或没取到)进行逻辑处理;

    成功取值:说明sessionid有效且未过期,也就说明当前登录有效,即可进行与用户相关的数据操作;

    未取到值:说明sessionid不存在或已过期,也就说明当前登录无效,返回状态码到前端,前端根据状态码处理,根据实际需求判断是否需要重新登录。


    以上是微信小程序登录的全部流程。

    2018-02-08
    赞同 2
    回复 1
    • 半杯可乐°
      半杯可乐°
      2018-07-26

      您好,请问wx.login在哪个地方调用呢?在app.onLaunch中调用吗?

      一般情况都有注册,我们的程序要求手机号来注册,用户也可以自己输入手机号和验证码进行注册,可以使用微信手机号直接开通(此次讨论的情况)。 可以使用手机号来登录,也可以使用微信来登录。

      思路一: 1.注册的话,如果直接使用微信手机号使用getPhoneNumber,这个时候需要

       getPhoneNumber(e){

          wx.login({

              wx.request({

                  //带上code和加密的手机号,去自己的服务器请求,进行注册。

              })

          })

      }

      2.登录的话,是在onLaunch中调用wx.login 按照您说的流程,这个时候是不是还要更新服务器上的sessionkey?因为每次获取的code,sessionkey都会变更。


      思路二:

      直接就使用您登录的流程,把第一次获取到的code(5分钟内)记录下来,如果在后台没有发现该用户没有注册,提示需要注册,用户注册的时候使用code进行解密手机号注册。


      或者有更好的思路吗?

      2018-07-26
      回复
  •        北不受。
    北不受。
    2018-02-10

    谢谢, 非常详细。


    光要sessionId 不要 Authorization 这个字段 ,可以吗

    2018-02-10
    赞同
    回复
  • Yang
    Yang
    2018-02-11

    可以

    2018-02-11
    赞同
    回复
  •        北不受。
    北不受。
    2018-02-11

    谢谢,大概明白了,不过这个sessionId每次都要带上的话,你们都是怎么做的,包装一个函数吗,  小程序怎么写一个  公共用的函数

    2018-02-11
    赞同
    回复
  • Yang
    Yang
    2018-02-12

    可以把wx.request封装成公共函数,比如放在app.js中或者在utils下单独一个js,用module.exports暴露出接口函数,用时导入。

    如:

    在/utils/request.js中封装网络请求处理函数


    /**

    * 模块化导出暴露接口

    */

    module.exports = {

    //http请求

    httpRequest: httpRequest

    }


    //http请求封装

    function httpRequest() {

    //http请求处理,略......

    }


    在某页面使用网络请求函数


    //引入http请求模块

    var request = require('../../utils/request')


    //加载列表

    function doLoadList() {

    var that = this

    //发送http请求

    request.httpRequest({

    //获取列表

    url: "api/xxx/getList",

    method: "GET"

    }).then(res => {

    if (res.statusCode == 200) {

    if (result.Code == 0 && result.Data != null) {

    //设置data数据

    that.setData({

    list: result.Data

    })

    }

    }

    })

    }

    2018-02-12
    赞同
    回复
  • 智慧可贵了
    智慧可贵了
    2018-03-20

    很详细了,谢谢。但是我也在github上面看了一些源码,有部分代码不按微信的方法走,直接调用自己的服务器接口,传用户名、密码。服务器判断成功返回token和用户信息给前端,前端把信息保存在手机缓存。请问这样这样的方式也可以吗??

    2018-03-20
    赞同
    回复