微信小程序登录态和检验注册过没的app.js写法


Posted in Javascript onMay 22, 2019

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写法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
Jun 23 Javascript
Javascript控制div属性动态变化实例分析
Oct 08 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
JS简单编号生成器实现方法(附demo源码下载)
Apr 05 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
Vue结合原生js实现自定义组件自动生成示例
Jan 21 Javascript
Vue单文件组件的如何使用方式介绍
Jul 28 Javascript
vue elementui el-form rules动态验证的实例代码详解
May 23 Javascript
javascript关于“时间”的一次探索
Jul 24 Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 Javascript
element-ui上传一张图片后隐藏上传按钮功能
May 22 #Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 #Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 #Javascript
JavaScript中的 new 命令
May 22 #Javascript
element-ui组件中input等的change事件中传递自定义参数
May 22 #Javascript
原生JS实现列表内容自动向上滚动效果
May 22 #Javascript
小程序如何使用分包加载的实现方法
May 22 #Javascript
You might like
轻松修复Discuz!数据库
2008/05/03 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
vue实现随机验证码功能(完整代码)
2019/12/10 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
使用Python对MySQL数据操作
2017/04/06 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
python属于解释语言吗
2020/06/11 Python
Python同时迭代多个序列的方法
2020/07/28 Python
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
致短跑运动员广播稿
2014/01/09 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
党员民主评议自我评价
2014/10/20 职场文书
党员个人党性分析材料
2014/12/18 职场文书
2014年个人年终总结
2015/03/09 职场文书
机关工会工作总结2015
2015/05/26 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书