因为做小程序需求的时候需要获取用户的openid,小程序需求不大,比较简单,所以不想要自己开发后台,直接用的云开发。
如果是自己写了后端的话,就不用看下面咯,应该是你自己配的服务器域名出现了问题,可能不是https请求,或者不和小程序配置的服务器域名一致,可以看看下面这篇:
微信小程序体验版数据加载不了,打开调试模式下才行(在微信开发者工具上也能加载数据)
【问题描述】
因为刚接触小程序云开发,还不是很熟,获取openid采用的是在app.js里面调用官方接口去获取,代码如下:
//app.js
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey
var code = res.code;
var appid = this.globalData.appid; //小程序的appid
var secret = this.globalData.secret; //小程序的secret
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&grant_type=authorization_code&js_code=' + code,
header: {
'content-type': 'application/json'
},
success: res => {
wx.setStorageSync("openid", res.data.openid)
this.globalData.openid = res.data.openid
console.log("【全局openid】",this.globalData.openid)
}
})
}
})
这种直接调用方式,如果开发者工具勾上了检查“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”,在本地微信开发者工具和体验版调试模式,数据可以正常加载,能获取到openid,不会出现问题。
而如果你把“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”勾选去掉,然后编译,查看微信开发者工具中会发现数据不能正常加载过来,而且直接报错:
这也是体验版小程序会获取不到openid的原因。
为什么会出现体验版数据加载不了,而微信开发者工具和体验版调试模式数据可以正常加载的情况?
答:调试模式下微信不会去检查api接口域名的合法性,而微信开发者工具在勾选“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”后也不会对域名的合法性做检查。
可能有些博客提供的解决办法是在微信公众平台设置中添加官方域名为合法域名,但是尝试之后会发现根本无法添加官方域名接口,因为在前端直接调起请求,很容易造成数据泄露,官方摒弃了这种做法,那么如何解决呢?
【解决办法】:使用云函数
既然是使用云开发,直接使用云函数获取到openid,再保存到全局变量或者本地就可以了,这样也不会出现上面的问题。
1、新建node.js函数
新建node.js函数,取名为login,不用修改里面的代码,你会发现里面已经写好了。
login云函数里面的 index.js
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
写完记得上传到云函数里面,或者同步列表
2、在需要调用的地方引用login云函数
wx.cloud.callFunction({
name: 'login',
success: res => {
this.globalData.openid = res.result.openid
this.globalData.userInfo = res.result.userInfo
console.log("【全局openid】", this.globalData.openid)
},
fail: err => {
console.error(err)
error()
}
})
重新编译界面,在控制台应该可以看到输出的openid,并且不勾选“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”也不会错报,上传体验版后数据也正常了。