一般云开发的话获取用户 openid 很简单,新建一个云函数,默认模板就会返回 openid。最近在学习实践 NodeJs Express 后端,逐步脱离云开发。过程中就产生了这样一个需求,其实也很简单,在仰止记录一下。
原理
微信小程序获取 openid,需要先使用 wx.login 接口,获取一个 code 变量res.code
,然后通过一个 request GET 请求,携带参数 appid
secret
code
。另外还有一个 grant_type=authorization_code
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
方法
最简单的办法是小程序直接发起request请求,不过有暴露 secret 和 appid 风险,方法如下:
wx.login({
success(res) {
console.log(res)
wx.request({
url: "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=" + res.code + "&grant_type=authorization_code",
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
console.log(res.data)
}
})
},
fail(err) {
console.log(err)
}
})
第二种方法是 Nodejs 后端发起 request 请求,然后返回 openid ,比较安全,代码如下:
app.get("/api/login", (req, res) => {
const url = "https://api.weixin.qq.com/sns/jscode2session?appid=wx77f858b31146d3fa&secret=98043a291b66765ae928db50aec19d68&js_code=" + req.query.code + "&grant_type=authorization_code"
axios.get(url)
.then(result => {
console.log(result.data);
res.send(result.data)
})
.catch(err => {
console.log(err.data);
});
})
需要 npm 安装 axios ,别忘了引入,然后在小程序携带 code 参数,发起 request 请求即可,写法类似上边的,不做赘述。
Warning! code 五分钟内有效,且只可使用一次
auth.code2Session接口文档