收藏
回答

获取openid问题,那位同僚有遇到过的,帮忙解答一下

问题模块
API和组件


///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。


最后一次编辑于  2017-07-21  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

2 个回答

  • 曾华经
    曾华经
    2017-07-31

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

    2017-07-31
    赞同
    回复 1
    • 五个半柠檬ci
      五个半柠檬ci
      2018-06-15

      麻烦问下,这个问题解决了吗?有什么解决方案吗?

      2018-06-15
      回复
  • 曾华经
    曾华经
    2017-07-31

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

    2017-07-31
    赞同
    回复