获取openid问题,那位同僚有遇到过的,帮忙解答一下
发布于 5 年前 作者 duanjuan 18359 次浏览 来自 问答

///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方法

  1. app启动的时候尝试获取一次,保存到localStorage

  2. 登录的时候从localStorage获取,如果能拿到就跳过,不能拿到就尝试获取一次,保存到当前页面的data里面。

问题: 

场景一、开发环境,第一次进去,然后登录,拿不到openid。 退出重新登录,可以拿到openid。 

场景二、生产环境,重复上面的操作多次,依然无法拿到openid。

2 回复

补充:生产环境删掉小程序重新进就可以获取到openid,但是这样用户体验很差啊~~~

最近也碰到第一次获取openid失败,第二次才成功的情况。谁来解释下?

回到顶部