获取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,这样又会有新的问题
- util.js 每个页面都会引用,除了 app.js 外都是用 getApp(),不好判断是否是 app.js 引用的
- 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 的思路,转而使用本地储存
林秀栋的技术博客