微信小程序通过wx.login获取用户openId、session_key

责编:menVScode 2018-10-11 17:23 阅读(48)

wx.login(Object object)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成,官方介绍:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

小程序的开发者密码(AppSecret)是一个非常重要的字段,使用该密码可以调用小程序的所有后台接口。请不要将该字段放置在微信小程序的前端代码中,因为微信手机客户端容易被反编译并轻松获得Appsecret,造成重大的安全威胁。开发者应将Appsecret保存到后台服务器中,通过服务器使用Appsecert获取Accesstoken。微信公众平台小程序后台的服务器地址设置也将禁止将“api.weixin.qq.com”域名的配置,所有对于“api.weixin.qq.com”域名下的接口请求请全部通过后台服务器发起,请勿直接通过小程序的前端代码发起。 所以解决办法就是把code传给后台,让后台去请求微信的官方接口获得openId和session-key。


通过微信登录,获取用户的三个信息:user_id(用户id),user_image(用户头像url),user_name(用户昵称)。

1、首次登录:

调用wx.login获取code,code发送给后台获取openid并存到用户表中,将返回user_id存到内存中。然后跳转到授权页面,当用户允许授权时,通过agreeGetUser方法获取到微信用户的信息保存到用户表中,并将user_name和user_image存到内存中,最后跳转到首页。

2、非首次登录:

调用wx.login获取code,code发送给后台获取openid,openid在用户表中已存在,则只改变用户登录时间,并返回user_id、user_name和user_image,存到内存后跳转首页。


总结下整个openid、session_key获取的流程:

    1. 注册微信小程序、登录后台在设置中获得appId和secret(密钥),具体步骤可查看:http://menvscode.com/detail/5ba45c68ee326f54debebbf3

    2. 调用wx.login()接口获取登录凭证code

    3. 调用wx.request()接口把code发送到服务器后台

    4. 在服务器后台,已知appId、secret、code

然后调用官方提供的http接口,即可返回获取openId、session_key

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code


app.js:用户打开小程序时,会调用wx.login获取code,将code发送到后台获取openid。后台保存opendi并返回用户信息(首次登录信息为空,非首次登录信息存在)

App({
  onLaunch: function () {
    // 登录
    wx.login({
      success: function(res) {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if(res.code){ // ------ 发送凭证 code ------
          wx.request({
            url: 'http://XX.com/WechatUser/login_do',
            data:{
              code:res.code
            },
            success:function(res){
              //如果是首次登录,会跳到授权页面
              if(!res.data.data.username || res.data.data.username == " "){
                wx.navigateTo({
                  url:'/pages/login/login',
                })
              }
              console.log(res.data.data)
              //首次登录,只会返回id;非首次登录,会返回三个信息
              wx.setStorageSync('userid', res.data.data.userid)
              wx.setStorageSync('username', res.data.data.username)
              wx.setStorageSync('userimage', res.data.data.userimage)
            }
          })
        }else{
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    })
  }
})

注意:涉及到安全问题,最好将openid在后台加密为token后返回前端缓存,不宜在前端保存openid,用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 code2Session,使用 code 换取 openid 和 session_key 等信息。

前端交流群: MVC前端网(menvscode.com)-qq交流群:551903636

邮箱快速注册

忘记密码