• 完整且易读的最新版小程序登录态和检验注册过没的app.js写法



    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无效】");
    }
    
  • 相关阅读:
    19.02.11——周记
    假期第一周
    JavaWeb——升级赛-学生成绩管理系统(2).java---19.01.03
    JavaWeb——升级赛-学生成绩管理系统(1)jsp---19.01.03
    构建之法阅读笔记02
    输出一个数组里最大子数组的和(文件)
    软件工程第二周总结
    软件工程第一周开课博客
    构建之法阅读笔记01
    返回一个整数数组中最大子数组的和
  • 原文地址:https://www.cnblogs.com/ranandrun/p/wxLogin.html
Copyright © 2020-2023  润新知