小程序登录及AppSecret(小程序密钥)
发表时间:2021-1-4
发布人:葵宇科技
浏览次数:74
在授权开发以后,需要提交小程序密钥,有小程序密钥第三方才有能力获取用户的一些信息,提供一些能力!
平台分别提供多种方式实现微信登录:
调用wx.login接口,静默获取openid
适用场景:无需使用用户头像、昵称、Unionid信息
复制代码
使用 open-data (小程序)或者开放数据域(小游戏)的方式展示用户信息(无需用户授权)
适用场景:需要在前端“展示”用户头像、昵称信息,但不需要获取Unionid
复制代码
使用button(小程序)或UserInfoButton(小游戏)组件,用户点击后弹窗请求用户授权
适用场景:需要获取用户头像、昵称、Unionid等基本信息
复制代码
开发建议
第一步:获取openID
当用户访问小程序时,先通过wx.login,获取用户openID 。这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。
复制代码
第二步: 使用open-data方式或开放数据域方式展示头像昵称
如需要在前端展示用户头像、昵称信息, 使用open-data 方式或者开放数据域的方式展示用户信息
复制代码
第三步:根据实际使用场景,使用组件,引导用户登录
在关键操作中,如必须获取用户头像、昵称、UnionID信息,可根据第一步获取的openID判断是新用户还是旧用户:
如果是旧用户,可以直接登录,也可定期使用wx.getUserInfo更新用户的信息;
如果是新用户,使用button(小程序)或UserInfoButton(小游戏)组件,在用户点击后弹窗请求获取用户基本信息。
复制代码
会话密钥 session_key
有效性
开发者如果遇到因为
session_key
不正确而校验签名失败或解密失败,请关注下面几个与session_key
有关的注意事项
1. wx.login 调用时,用户的 session_key 可能会被更新而致使旧 session_key 失效(刷新机制存在最短周期,如果同一个用户短时间内多次调用 wx.login,并非每次调用都导致 session_key 刷新)。开发者应该在明确需要重新登录时才调用 wx.login,及时通过 code2Session 接口更新服务器存储的 session_key。
2. 微信不会把 session_key 的有效期告知开发者。我们会根据用户使用小程序的行为对 session_key 进行续期。用户越频繁使用小程序,session_key 有效期越长。
开发者在 session_key 失效时,可以通过重新执行登录流程获取有效的
3. 开发者在 session_key 失效时,可以通过重新执行登录流程获取有效的 session_key。使用接口 wx.checkSession可以校验 session_key 是否有效,从而避免小程序反复执行登录流程。
4. 当开发者在实现自定义登录态时,可以考虑以 session_key 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。
复制代码
如果使用自己服务器定义的登录态失效时间,则不需要wx.checkSession
下面是自己项目中的小程序登录代码
涉及到用户扫码进入小程序,同时判断扫码进入是否注册过
//获取个人信息
getUserFootpathInfo: function (that) {
that = this;
wx.login({
success: function (data) {
console.log(data, '个人信息1')
http.getReq('getwechatinfo?code=' + data.code + "&serct=" + app.globalData.serct, function (ress) {
console.log(ress)
app.globalData.openid = ress.data.openid
that.setData({
openid:ress.data.openid
})
http.getReq("getuserinfo?openid=" + ress.data.openid + "&unionid=" + app.globalData.unionid + "&serct=" + getApp().globalData.serct, function (res) {
console.log(res.data, '个人信息2')
// imageId 扫码进入小程序 用户 进入游戏的唯一标识
that.setData({
imageId: res.data.imageId
})
if (that.data.device) {
getApp().globalData.type = 2; // 2代表扫码
// 同时通过注册得Id判断是否注册,
if (that.data.imageId) {
// 授权成功
that.setData({
bikeFlag: true
})
} else {
// 没有授权 "跳转到注册页面"
if(that.data.btn_disabled){
wx.redirectTo({
url: '../webview/webregist?openid=' + that.data.openid
})
}else{
wx.showToast({
title: "请勾选相关条款",
icon: 'none'
})
}
}
}
app.globalData.imageId = res.data.imageId;
app.globalData.getUserInfo = res.data;
app.globalData.existsflag = res.data.existsflag;
// 调取单车数据
that.postRunSportData();
if (res.data.existsflag == 1 || that.data.skipType == "0001") {
that.setData({
httpUserInfo: res.data
})
if (that.data.httpUserInfo.username == null || that.data.httpUserInfo.username == "") {
that.setData({
nickName: "步道用户"
})
} else {
that.setData({
nickName: that.data.httpUserInfo.username
})
}
} else {
app.globalData.openid = "guest";
//未注册 弹窗注册
that.setData({
showRegisterModal: !that.data.showRegisterModal
})
}
that.checkLocation(that)
})
})
},
fail: function (err) {
console.log('wx.login 接口调用失败,将无法正常使用开放接口等服务', err)
}
})
},