评论

openid的获取顺序

获取openid的顺序的代码,代码量本人已经无法再压缩了。 效果:1、一定获取openid成功,2、最少占用资源;3、最少代码量。

在任何一个page里,需要用到openid,获取顺序为:

1、globalData;2、缓存Storage;3、云函数login

小程序编译配置:

1、不勾选es6转es5;2、不勾选增强编译;

代码如下:

app.js:

globalData: {},

//获取openid顺序:globalData--云函数login

getOpenidOnlyCloud: async function () {
  return this.globalData.openid = this.globalData.openid || (await wx.cloud.callFunction({ name: 'login' })).result.OPENID
},
 
//获取openid顺序:globalData--storage--云函数login
getOpenid: async function () {
  (this.globalData.openid = this.globalData.openid || wx.getStorageSync('openid')) || wx.setStorageSync('openid', this.globalData.openid = (await wx.cloud.callFunction({ name: 'login' })).result.OPENID)
  return this.globalData.openid
},

任何page:

onLoad: async function () {
  this.openid = await app.getOpenid()
  console.log(this.openid)
},

云函数login:

const cloud = require('wx-server-sdk')
cloud.init()
exports.main = (event) => { return { ...event,...cloud.getWXContext()} }
//可同时支持返回openid和处理cloudID,获取电话号码和群ID等信息。

达到的效果:

1、一定获取openid成功;

2、任何异步情况可支持;

3、任何用户永久只调用一次login;

4、任何用户每次重载小程序只读取一次缓存;

另:

1、为什么不在app.js的onLaunch里获取一下openid就行了?

因为虽然app.onLaunch一定比page.onLoad更早执行,但并不保证app.onLaunch的所有代码都比page.onLoad更早执行。在page里读取globalData.openid的时候,有可能app.onLaunch里从后台获取globalData.openid的代码还没有执行完并返回真值。

2、我为什么要选择globalData--storage--云函数的顺序?

因为openid只要获取一次就行,保存在storage还是合理的,每次都调用云函数login那也是钱啊。

最后一次编辑于  2019-12-12  
点赞 6
收藏
评论

4 个评论

  • 郑旭东
    郑旭东
    2019-11-23

    老张的语法非常精简。

    顺便我要提醒一下坛子里的其他开发者,我不建议把裸露的openid放在globalData或者storage里面,因为安全问题。云函数环境里的openid是腾讯鉴权好的,100%正确,而放在客户端的openid有被篡改的风险。所以,客户端openid可以用,仅限于用在客户端的逻辑里,严禁把客户端的openid再传递回云端使用。

    如果使用云开发作为后端的,后端逻辑里请实时获取openid,很方便。如果是自有后台,我记得开发文档里也有相关的登录开发指引,按那个指引来对openid进行session化。

    非专业后端开发,以上理解可能有偏差,请指正。

    2019-11-23
    赞同 1
    回复 4
    • 老张
      老张
      2019-11-23
      说得不错,如何使用,大家自己把握。我个人看得比较轻,一个摩托车级的小程序而已,没必要用上航母级别的安全锁。真要被人看上了来破解,那我也是偷着乐,那时再上安全方案好了。
      2019-11-23
      2
      回复
    • Selfay
      Selfay
      02-21
      所以现在的情况就是globalData或者storage不安全,云函数比较安全,但是每次调用都要钱。最安全的情况就是自己搞个高速宽带服务器,通过session_key实时获取,但是这种方案又花钱对吧。/笑
      02-21
      回复
    • 郑旭东
      郑旭东
      02-21回复Selfay
      付费不是很正常吗?阿里云要钱,腾讯云也要钱呀,拥抱云时代
      02-21
      回复
    • w .
      w .
      04-23回复Selfay
      {openid} 变量
      在查询时,当前用户 openid 是常用的变量,在新的安全规则体系下,要求显式传入 openid,因此为了方便开发者、让开发者无需每次先通过云函数获取用户 openid,我们规定查询条件中可使用一个字符串常量 {openid},在后台中发现该字符串时会自动替换为小程序用户的 openid,如假设有安全规则:
      04-23
      回复
  • Kk.
    Kk.
    05-26

    为什么我copy了还是undefined

    05-26
    赞同
    回复
  • jizhao
    jizhao
    05-14

    老哥,app.js里的代码直接复制粘贴么,要怎么改么,语法不对啊

    05-14
    赞同
    回复 2
    • 老张
      老张
      05-14
      直接拷贝。什么错误信息?
      05-14
      回复
    • jizhao
      jizhao
      05-14回复老张
      私信您了
      05-14
      回复
  • fore
    fore
    2019-11-26

    别人的我不知道,反正我们做的每个小程序都会用到openid,并且每个项目中用openid的时候,都需要确保openid已经被正确获取。目前我们基本上都是使用promise来获取,代码非常不简洁。

    官方是否可以出一个同步的api,在onLaunch时候让我调用一下???

    2019-11-26
    赞同
    回复 4
    • 老张
      老张
      2019-11-26
      并不是onLaunch里就一定最先获得opened,否则就太简单了,一行代码就搞定了。
      2019-11-26
      1
      回复
    • fore
      fore
      2019-11-26回复老张
      期望的就是这个效果,本来就是可以一行代码调用接口的事情。
      2019-11-26
      回复
    • fore
      fore
      2019-11-26回复老张
      只是微信不出这样的接口,谁都没辙。非得开发人员写出一坨坨的代码。
      2019-11-26
      回复
    • 老张
      老张
      2019-11-26回复fore
      想也别想了。首先微信不建议在前端用openid,永远不会有这样的API。其次,代码也没多少,而且可以通用,复制就搞定。
      2019-11-26
      回复
登录 后发表内容