///WxApi.js
static getOpenid() {
var self = this;
return new Promise((resolve, reject)=>{
self.login().then(function(code){
var appid = CONF.WX.APPID;
var secret = CONF.WX.SECRET;
var url = ‘https://mydomain/getopenid?code=’ + code;
//发起网络请求
wx.request({
url: url,
success: function (res) {
if (res.data.success) {
resolve(res.data.data);
} else {
reject(res.data.err);
}
},
fail: function (err) {
reject(err);
}
})
},function(error){
reject(error);
});
});
}
///Storage.js
static getOpenId() {
return wx.getStorageSync(CONST_CONF.OPENID);
}
static setOpenid(openid) {
wx.setStorageSync(CONST_CONF.OPENID, openid);
}
///app page
///尝试在App启动的时候获取一次openid存储到localStorage
var WxApi = require(’./service/wxapi’);
var Storage = require(’./service/storage’);
App({
onLaunch: function () {
console.log(‘App Launch’);
//////这里好像工作不正确//////////
this.setOpenid();
},
onShow: function () {
console.log(‘App Show’)
},
onHide: function () {
console.log(‘App Hide’)
},
globalData: {
hasLogin: false
},
setOpenid: function () {
WxApi.getOpenid().then(function (data) {
Storage.setOpenid(data.openid);
});
},
})
///login page
///先检查localStorage是否已经缓存过openid,如果有就直接保存到data里面
///如果没有再去获取一次
Page({
/**
* 页面的初始数据
*/
data: {
openid: ‘’
},
/**
* 生命周期函数–监听页面加载
*/
onLoad: function (options) {
var self = this;
//////这里好像工作不正确//////////
var openid = Storage.getOpenId();
if(openid){
self.setData({ openid: openid });
}else{
self.getOpenid();
}
},
/**
* 获取 openid
*/
getOpenid: function(){
var self = this;
WxApi.getOpenid().then(function (data) {
self.setData({ openid: data.openid });
});
}
}
实现思路:
首先,获取openid是放到服务端去获取的,小程序端提交code到服务端,见WxApi.js -> getOpenid方法
-
app启动的时候尝试获取一次,保存到localStorage
-
登录的时候从localStorage获取,如果能拿到就跳过,不能拿到就尝试获取一次,保存到当前页面的data里面。
问题:
场景一、开发环境,第一次进去,然后登录,拿不到openid。 退出重新登录,可以拿到openid。
场景二、生产环境,重复上面的操作多次,依然无法拿到openid。