快捷搜索: 王者荣耀 脱发

微信小程序获取openid的两种方法

两种方法获取小程序用户openid,一种使用云开发,一种使用自己的后台。

第一种:使用云开发

这种比较简单,只需要开通云开发,创建云函数,调用云函数就可获得。

调用云函数 Promise Cloud.callFunction(Object object) 返回一个Promise对象,所以不用考虑异步问题。

callFunction说明

具体代码如下:

我这里云函数名为helloCloud

// helloCloud-index.js 云函数入口函数
exports.main = async (event, context) => {
          
   
 let{
          
    APPID,OPENID}=cloud.getWXContext()
  return {
          
   
    APPID,
    OPENID
  }

//------------------------------------------------------
//云函数调用
wx.cloud.callFunction({
          
   
  name:helloCloud,
  data:{
          
   
    message:helloCloud,
  }
}).then(res=>{
          
   
  console.log(res)//res就将appid和openid返回了
    //做一些后续操作,不用考虑代码的异步执行问题。
})

第二种:不使用云开发

这种方式就需要开发者有自己的后台了。

wx.login()接口说明

然后,向自己的服务器发送请求,并将code一起发送过去。

wx.login({
          
   
  success (res) {
          
   
    if (res.code) {
          
   
      //发起网络请求
      wx.request({
          
   
        url: 自己的服务器请求接口,
        data: {
          
   
          code: res.code
        }
      })
    } else {
          
   
      console.log(登录失败! + res.errMsg)
    }
  }
})

接下来,在自己的服务端调用auth.code2Session接口,我这里是用Java后台。

auth.code2Session接口说明

部分参考

这样就获得openid了。

但是在实际应用场景中,往往需要在界面展示之前获得openid来做一些操作或者什么。

用以上代码会发现,openid后台虽然获取到了,但是小程序端页面刚展示时好像并没有获取到openid,但是之后查看数据能看到openid。

这是因为wx.request()是异步请求。也就是在请求的过程中,小程序的其他工作没有因为请求而停止。

所以,我们需要将请求封装成一个返回Promise对象的函数。

廖雪峰老师讲的Promise使用

https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

这样就能在请求完做一些后续操作。

代码如下:

//封装wx.request() 
function request(requestMapping, data, requestWay, contentType) {
          
   
  wx.showLoading({
          
   
    title: 请稍后,
  })
  return new Promise(function(resolve, reject) {
          
   
    console.log(请求中。。。。。)
    wx.request({
          
   
      url: 自己的服务器地址 + requestMapping,
      data: data,
      header: {
          
   
        content-type: contentType // 默认值
      },
      timeout: 3000,
      method: requestWay,
      success(res) {
          
   
        //console.log(res)
        if (res.data.success == false || res.data.statusCode == 404) {
          
   
          reject(res)
        } else {
          
   
          resolve(res)
        }
      },
      fail: (e) => {
          
     
        wx.showToast({
          
   
          title: 连接失败,
          icon: none
        })},
      complete: () => {
          
   
        wx.hideLoading()
      }
    })
  })
}

//获取openid
function getOpenId(app, that){
          
   
  return new Promise(function (resolve, reject) {
          
   
        wx.login({
          
   
          success: function (yes) {
          
   
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
            var requestMapping = /testopenid
            var data = {
          
   
              code: yes.code
            }
            var requestWay = GET
            var contentType = application/json
            var p =request(requestMapping, data, requestWay, contentType)
            p.then(res => {
          
   
              //console.log(res) 做一些后续操作
              app.globalData.openId = res.data;
                    resolve(res)
            }).catch(e => {
          
   
              reject(e)  
            })
          },
          fail(e) {
          
   
            console.log(e)
          }
        })  
  })
}

这样就解决了因为异步获取不到数据的问题。

技术有限,欢迎交流。

经验分享 程序员 微信小程序 职场和发展