林秀栋的技术博客

微信小程序获取用户唯一id

获取openid

openId、sessionKey等需要向微信后台请求接口才能拿到,url如下

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

需要4个参数,appid和secret都可以在微信后台网页端拿到(其中secret只有管理员可以拿到),js_code需要调用wx.login获取,grant_type固定为authorization_code

app.js中

onLaunch: {
    //...
    // 微信自带的登录接口
    wx.login({
      success: res => {
        // 调用请求发送 res.code 到后台换取 openId, sessionKey, unionId
        // ...
      }
    })
}

上面的方法会提示 https://api.weixin.qq.com 不在 request 合法域名列表中

本以为在微信后台配置一下该地址就可以了,但配置时提示不可配置改地址

原来 secret 不可以放在前台,否则很容易被他人获取造成安全问题

所以需要前端拿到 js_code 后,发送请求给自己的后台,由后台去调用微信后台接口,获取 openid 再返回给前端

使用openid

为了记录是谁使用了这些功能,需要在每次请求后端时加上openid

项目中把请求封装在了util.js, 本想拿到 openid 后直接设置到 globalData 中,然后 util.js 中 let app = getApp() 加 app.globalData.openid

一波操作取到 openid,放入请求参数

无奈事不如人愿,app 是 undefined,原来 app.js 中不能用 getApp(),应该直接用 this,这样又会有新的问题

  1. util.js 每个页面都会引用,除了 app.js 外都是用 getApp(),不好判断是否是 app.js 引用的
  2. util.js 在js顶端调用,这时 app.js 中还没注册 app({}), util.js 的 this 也取不到 globalData

一个办法是在其他页面引用 util.js, app.js 中不引用 util.js,直接写网络请求。但这样一来 app.js 中需要用到 util.js 的其他方法,拆分 util.js 或在新js中再写一遍都不方便,而且app.js中不使用封装的网络请求的话,一些统一方法配置改动时修改麻烦,容易留坑

所以最终废除存在 globalData 的思路,转而使用本地储存