微信小程序获取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) } }) }) }
这样就解决了因为异步获取不到数据的问题。
技术有限,欢迎交流。
上一篇:
uniapp开发微信小程序-2.页面制作
下一篇:
微信小程序获取openid的两种方式