小程序中须要加入一个“收藏”功能。用户能够点击“个人收藏”看到本身收藏的文章。
在这个需求中,咱们须要获得一个关联用户的惟一标示,那就是openid,在小程序中怎么获取用户的openid呢?前端
首先咱们调用wx.login(object)接口获取登陆凭证(code)进而换取用户登陆态信息,包括用户的惟一标识(openid) 及本次登陆的 会话密钥(session_key)。用户数据的加解密通信须要依赖会话密钥完成。node
onReady: function (options) {
const that = this;
wx.login({
// 获取code
success: function (res) {
var code = res.code; // 返回code
}
})
},
复制代码
微信提供接口:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
将APPID和SECRET换成本身小程序的。再将上面login接口返回的code传入JSCODE来调用接口;json
这是一个 HTTPS 接口,开发者服务器使用登陆凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不该该在网络上传输。小程序
onReady: function (options) {
const that = this;
wx.login({
// 获取code
success: function (res) {
var code = res.code; // 返回code
var APPID = ''; // 换成本身的APPID
var SECRET = '' // 换成本身的SECRET
var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + APPID + '&secret=' + SECRET + '&js_code=' + code + '&grant_type=authorization_code';
wx.request({
url,
data: {},
headers: {
"content-type": "application/json",
},
success: function(res){
that.setData({
openid: res.openid
});
}
})
}
})
},
复制代码
在这段代码就完成了读取用户openid的操做,可是你会发现这段代码只能在微信开发者工具中调用成功【固然是在你勾选了不校验HTTPS合法域名】的状况下,勾选这个的好处就是咱们在开发的时候可使用本地服务,而不用HTTPS域名。后端
由于小程序的前端接口调用必须使用HTTPS,并且那么这段代码使用手机体验会出现什么问题呢?
接口报错:微信小程序
request:fail url not in domain list
复制代码
报错提示说请求的url不在域名列表里,应该是尚未配置服务器域名;
没有配置那咱们就进入小程序进行配置嘛。
登录小程序 - 开发 - 开发中心 - 服务器域名【添加https://api.weixin.qq.com】这个域名api
可是你会发现提示错误信息。
安全
了解详情,能够看到这一大段说明;bash
这个说明为了安全性着想。咱们读取用户的openid是不能放入前端来写的。咱们必须把appid和Secret放在后端进行,而后经过接口的形式返回给前端。服务器
笔者用的是node写后端哈。使用request模块来发起url请求
// 获取openid
router.get('/getopenid', function(req,res, next){
var appId = ''; // 换成本身的APPID
var secret = ''; // 换成本身的secret
var params = URL.parse(req.url, true).query;
var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + params.code + '&grant_type=authorization_code';
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body)
}
res.send(body);
})
})
复制代码
修改前面读取openid的方法
onReady: function (options) {
const that = this;
wx.login({
//获取code
success: function (res) {
var code = res.code; //返回code
wx.request({
url: `${BASE_URL}/apis/getopenid`,
method: 'get',
data: {
code: code,
},
success: function (res) {
that.setData({
openid: res.data.openid
})
}
})
}
})
},
复制代码
这样就完美的实现了读取用户的openid。
记住不要把本身的appid和secret放在前端代码中。
若是有什么好的建议或者意见请关注公众号