JavaScript之快速掌握小程序登录态和检验是否注册的app.js写法
从安 2019-06-21 来源 : 阅读 1086 评论 0

摘要:本篇文章主要讲述JavaScript之快速掌握小程序登录态和检验是否注册的app.js写法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章主要讲述JavaScript之快速掌握小程序登录态和检验是否注册的app.js写法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

JavaScript之快速掌握小程序登录态和检验是否注册的app.js写法

1、可参考的官方页面

获取登录凭证: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; // 业务处理失败

}

 

2、流程

(1)调用wx.checkSession检查用户登录态是否过期,如果没有过期就检查用户注册没注册①,如果过期了就去重新执行登录流程②
(2)②的流程为:调用wx.login来获取登录凭证(code),然后把code发给后台,后台调用 auth.code2Session,使用 code 换取 openid 等信息来获取openId , 把openId返回给小程序, 然后把openId放到小程序缓存里面,然后检查用户注册没注册①
(3)①的流程为:先从缓存查该用户注册没注册过(通过检查缓存变量registered存不存在),有就是老用户,没有就去后台通过openId查有没有这个用户,把结果返回给小程序,如果后台有这个用户,说明已经注册过,就把在缓存里加个registered并赋值true。
(4)然后我们就可以在其他页面通过registered来判断用户注册没注册过,从而跳转进入注册页面或者是主页

 

3、app.js代码

App({

      globalData: {

        serverHost: '//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();

                }

              })

            }

          }

        })

      },

  },

 

})


4、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无效】");

}

 

本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @从安 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程