0、可参考的官方页面

获取登录凭证:https://developers.weixin.qq.com/miniprogram/dev/api/wx.login.html

检查登录态是否过期: https://developers.weixin.qq.com/miniprogram/dev/api/wx.checkSession.html

备注:你要明白什么是登录态:这里的登录态是微信小程序自己的登录态,我们可以再自己写个登录页面作为自己的登录态,不过为了用户体验良好我直接以微信登录态做为自己的登录态。所以我的整个小程序是直接自动登录的

注意:微信小程序缓存很容易被清除,所以你必须时刻提防小程序缓存被清除的状态下怎么处理。

备注:我从后台返回来给小程序的对象格式为:

    public ResultCode resultCode; // 业务响应码
public String resultMsg = ""; // 返回信息描述
public String errCode; // 错误代码
public String errCodeDes = ""; // 错误描述
public Object data; // 返回业务数据 public enum ResultCode {
SUCCESS, // 业务处理成功
FAIL; // 业务处理失败
}

1、流程

(1)调用wx.checkSession检查用户登录态是否过期,如果没有过期就检查用户注册没注册①,如果过期了就去重新执行登录流程②

(2)②的流程为:调用wx.login来获取登录凭证(code),然后把code发给后台,后台调用 auth.code2Session,使用 code 换取 openid 等信息来获取openId , 把openId返回给小程序, 然后把openId放到小程序缓存里面,然后检查用户注册没注册①

(3)①的流程为:先从缓存查该用户注册没注册过(通过检查缓存变量registered存不存在),有就是老用户,没有就去后台通过openId查有没有这个用户,把结果返回给小程序,如果后台有这个用户,说明已经注册过,就把在缓存里加个registered并赋值true。

(4)然后我们就可以在其他页面通过registered来判断用户注册没注册过,从而跳转进入注册页面或者是主页

2、app.js代码


App({
globalData: {
serverHost: 'http://localhost:8080', //服务器域名
},
onLaunch: function() {
var that = this;
//检查登录态是否过期
wx.checkSession({
success() {
// session_key 未过期,并且在本生命周期一直有效
console.log("【用户小程序登录态未过期】");
that.isRegister();
},
fail() {
// session_key 已经失效,需要重新执行登录流程
that.wxLogin();
}
})
}, //查看当前用户是否已经注册过
isRegister: function() {
var that = this;
var host = this.globalData.serverHost;
// (先从缓存查该用户,有就是老用户,没有就后台查有没有这个用户,后台查到有这个用户就放缓存,没有就是新用户)
wx.getStorage({
key: 'registered',
success(res) {
console.log("【通过缓存查询到该用户是已经注册过的】");
console.log("【当前用户的openid为:】" + wx.getStorageSync('openid'));
},
fail(res) {
var openid;
openid = wx.getStorageSync('openid');
wx.request({
url: host + '写自己的后台请求检查用户存不存在的URL',
method: 'POST',
data: {
openId: openid,
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
success: (res) => {
if (后台返回注册过") {
if (res.data.data) {
console.log("【通过后台查询到该用户已经注册过】");
wx.setStorage({
key: "registered",
data: true
});
} else {
console.log("【通过后台查询到该用户还没注册过】");
}
}
}
})
},
}) }, //该函数用来登录的
wxLogin: function() {
var that = this;
//设置后台host
var host = this.globalData.serverHost;
console.log("【用户重新执行小程序登录流程】");
wx.login({
success(res) {
// 发起网络请求,发送 res.code 到后台换取 openId
if (res.code) {
var code = res.code;
wx.request({
url: host + '写自己后台用code换取OpenId的请求URL',
method: 'POST',
data: {
code: code,
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
success: (res) => {
console.log("【获取用户openid成功】");
console.log("【从后台获取到用户openid为】" + res.data.data.openid)
let openId = res.data.data.openid;
wx.setStorage({
key: "openid",
data: res.data.data.openid
});
console.log("【用户openid放入缓存成功】");
that.isRegister();
}
})
}
}
})
},
}, })

3、java后台怎么通过code获取openId

import net.sf.json.JSONObject;

/**
* @author niqinhua
* @date 2019/3/8 9:19
*/
public class WXUtil {
public static JSONObject getOpenidAndSessionKey(String code) {
String url = "https://api.weixin.qq.com/sns/jscode2session";
String param = "appid=写自己的appId&secret=写自己的密钥&js_code=" +
code + "&grant_type=authorization_code";
String wxReturnResult = sendGet(url, param);
JSONObject wxReturnResultObject = JSONObject.fromObject(wxReturnResult);
return wxReturnResultObject; } /**
* 从规范上,建议把这个方法抽出来放到HttpUtil类里面
* 向指定URL发送GET方法的请求
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("【HTTP发送GET请求出现异常】:访问URL:"+url+",错误:"+e.getMessage());
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
System.out.println("【HTTP请求关闭输入流异常】:访问URL:"+url+",错误:"+e2.getMessage());
}
}
return result;
} }

上面只是工具类直接拿就行,真正业务逻辑要自己写,我只给出重点部分

JSONObject wxReturnJson = WXUtil.getOpenidAndSessionKey(code);
if (wxReturnJson.get("errCode")!=null) {
//log.error("【获取用户的openid】【失败】【传递参数code无效】");
} else {
//log.info("【获取用户的openid】【成功】【传递参数code无效】");
}

完整且易读的最新版小程序登录态和检验注册过没的app.js写法的更多相关文章

  1. 微信小程序填坑之旅(1)-app.js中用云开发获取openid,在其他页上用app.globaldata.openid获取为空

    参考:小程序如何在其他页面监听globalData中值的变化?https://www.jianshu.com/p/8d1c4626f9a3 原因就是:app.js没执行完时,其他页已经onload了, ...

  2. Flask与微信小程序登录(后端)

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...

  3. 微信小程序登录状态

    我们知道,WEB服务器通过浏览器携带的cookie获取session来判断是否是同一用户(或浏览器):Restful服务通过客户端传过来唯一ID,来识别调用用户. >为什么需要维护登录态? 有自 ...

  4. 基于Shiro,JWT实现微信小程序登录完整例子

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...

  5. 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 Bug修复

    开篇语 昨晚发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 然后上午起来吃完午饭之后,我就准备继续开工的,但是突然的,想要看B站.然后在一股 ...

  6. 微信小程序登录(包括获取不到unionid的情况)

    我们一般都是先获取到微信的 unionid,然后再通过 unionid 去登录自己的网站,就可以关联到用户在自己网站上的 user_id,但是在小程序登录中,有时候可以获取到 unionid,有时候获 ...

  7. ASP.NET WebAPI 双向token实现对接小程序登录逻辑

    最近在学习用asp.net webapi搭建小程序的后台服务,因为基于小程序端和后台二者的通信,不像OAuth(开放授权),存在第三方应用.所以这个token是双向的,一个是对用户的,一个是对接口的. ...

  8. 全栈项目|小书架|微信小程序-登录及token鉴权

    小程序登录 之前也写过微信小程序登录的相关文章: 微信小程序~新版授权用户登录例子 微信小程序-携带Token无感知登录的网络请求方案 微信小程序开通云开发并利用云函数获取Openid 也可以通过官方 ...

  9. 微信小程序 - 登录(后端实现) | 授权(后端实现)

    登录与授权 官方文档 一.登录 登录流程时序 说明: 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器. 调用 code2Session 接口,换取 用户唯一标识 Ope ...

随机推荐

  1. mybatis多对多关联查询

    多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...

  2. Python进阶-V 迭代器(Iterator)、生成器(Generator)函数

    一.迭代器 1.可循环的有哪些,即可用for语句或者while语句的数据类型有哪些? 字符串(str).列表(list).元组(tuple).字典(dic).集合(set).枚举类(enumerate ...

  3. Linux学习笔记-第7天 - 编程还是要多写多练

    编程思路很重要,多写是要熟悉命令用法,多练不只是要熟悉语句常用在什么环境,更要在其基础上,尝试更多的写法.

  4. [LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Example: Trie trie = new Trie(); trie. ...

  5. [LeetCode] 99. Recover Binary Search Tree 复原二叉搜索树

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  6. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  7. STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来

    症状 最近开始学习STM32Cube,发现新建工程后无法正常调试,过了HAL_Init();之后就无法继续调试了. 无法进行让程序暂停以及停止等操作.并在输出窗口不断刷出 ERROR: Can not ...

  8. java知识体系(自我学习中)

    java自我学习知识体系

  9. windows上redis的安装和配置

    windows上redis的安装和配置 进入到Redis的根目录D:\Programming\Redis\Redis6379\Redis-x64-3.2.100底下操作: 配置文件启动 redis-s ...

  10. WebSocket的简单认识&SpringBoot整合websocket

    1. 什么是WebSocket?菜鸟对websocket的解释如下 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务 ...