一 概述

  • 用户登录成功后上传code,用户服务器保存session并返回token
  • 用户登录成功后通过token返回用户积分

二 用户登录-上传code返回token

2.1 服务器端-login接口(见2服务器搭建)

app.post('/login',(req,res)=>{
    console.log("login code:"+req.body.code);
    var url='https://api.weixin.qq.com/sns/jscode2session?appid='+wx.appid+"&secret="+wx.secret+"&js_code="+req.body.code+"&grant_type=authorization_code";
    request(url,(err,response,body)=>{
        console.log('session:'+body);
        if(body){
            var session=JSON.parse(body);
            var token='token_'+new Date().getTime();
            db.session[token]=session; //保存用户记录,设置用户初始积分为100
            if(!db.user[session.openid]){
                db.user[session.openid]={credit:100}
            }
        }
        res.json({token:token})
    });
});

2.2 小程序端(app.js)

App({
  onLaunch() {
    this.login()
  },
  globalData: {
    token: null //保存token
  },
  login: function () {
    wx.login({
      success: res => {
        console.log('login code:' + res.code);
        wx.request({
          url: 'http://127.0.0.1:3000/login',
          method: 'post',
          data: {
            code: res.code
          },
          success: res => {
            console.log('token:' + res.data.token);
            this.globalData.token = res.data.token
            //将token保存到数据缓存(下次打开小程序无需要重新获取token)
            wx.setStorage({
              key: 'token',
              data: res.data.token
            })
          }
        })
      }
    })
  },

2.3 结果

小程序调试器(Console)
[sitemap 索引情况提示] 根据 sitemap 的规则[0],当前页面 [pages/index/index] 将被索引
app.js? [sm]:42 login code:051Xt9ll2sGlN74Wvkll2jFqOq4Xt9lg
app.js? [sm]:50 token:token_1632363016379
开发者服务器(终端)
checklogin:[object Object]
login code:051Xt9ll2sGlN74Wvkll2jFqOq4Xt9lg
session:{"session_key":"+NlPNU6s+cjqhXhqpcfk9w==","openid":"ovxEk0Y5Xf4IuOQs0kojx7L6vhHk"}

三 用户登录-通过token返回用户积分

3.1 新建login page

调整app.json中pages的顺序,让pages/login/login位居第一项

3.2 开发者服务器(index.js)新增获取积分接口

//获取积分
app.get('/credit',(req,res)=>{
    var session=db.session[req.query.token];
    if(session&&db.user[session.openid]){
        res.json({credit:db.user[session.openid].credit})
    }else{
        res.json({err:'用户不存在,或未登录。'});
    }
})

3.3 小程序(login页面)

pages/login/login.wxml
<button bindtap="credit">获取用户的积分</button>
pages/login/login.js
const app = getApp();
Page({
  //获取用户积分
  credit: function () {
    wx.request({
      url: 'http://127.0.0.1:3000/credit',
      data: {
        token: app.globalData.token
      },
      success: res => {
        console.log(res.data);
      }
    })
  },
  sendUserInfo: function () {
    var token = app.globalData.token;
    wx.getUserInfo({
      success: res => {
        console.log("getUserInfo:" + JSON.stringify(res));
        wx.request({
          url: 'http://127.0.0.1:3000/userinfo?token=' + token,
          method: 'POST',
          data: {
            rawData: res.rawData,
            signature: res.signature,
            encryptedData: res.encryptedData,
            iv: res.iv
          }
        })
      }
    })
  }
})

3.4 结果(点击获取用户积分按钮-小程序调试器Console)

{credit: 100}

四 参考源码

Logo

鸿蒙生态一站式服务平台。

更多推荐