uniapp关闭小程序就退出登录

2023-06-01 10:14:01 买帖  | 投诉/举报

篇首语:本文由小编为大家整理,主要介绍了uniapp关闭小程序就退出登录相关的知识,希望对你有一定的参考价值。

参考技术A 要实现这个需求,你可以在小程序页面的 onUnload 生命周期方法中调用退出登录的接口。其实现具体步骤如下:

1. 在 app.vue 中监听小程序的 onHide 生命周期事件,并设置一个标志变量 isHideApp。

```
onHide()
this.isHideApp = true;
,
```

2. 在需要退出登录的页面的 onUnload 生命周期事件中判断 isHideApp 是否为 true,如果是,则调用退出登录接口。

```
onUnload()
if (this.isHideApp)
// 调用退出登录接口

,
```

3. 在退出登录接口中,清除登录状态和用户信息等缓存信息。

```
logout()
// 清除缓存信息
uni.removeStorageSync('token')
uni.removeStorageSync('userInfo')

// 跳转到登录页
uni.reLaunch(
url: '/pages/login/login'
)
,
```

通过这种方式,当用户关闭小程序时,可以自动退出登录,从而保证用户信息的安全性。

uniapp,实现微信小程序登录,python登录接口的实现

 前言

在开发小程序过程中,可能会遇到需要兼容多个平台的情况,uniapp大家就可以去研究一下。当然,如果只是开发单一平台,也可用对应平台的开发工具就足够了。

这里我们使用uniapp开发一次,同时兼容微信小程序,qq小程序,h5,app。

主要说一下微信的登录,因为微信的调整,getUserInfo接口不再支持返回用户详细信息。只返回openid,因此,需要先保存openid,之后用户授权才能保存其他数据。

前端

在app.vue,插入如下代码。

onLaunch: function()             uni.showLoading(                title: '正在登录中'            );            let that = this            uni.getProvider(                service: 'oauth',                success: function(res)                     console.log(res)                    if (~res.provider.indexOf('weixin'))                         uni.login(                            provider: 'weixin',                            success: (res2) =>                                 uni.getUserInfo(                                    success: (info) =>  //这里请求接口                                        uni.request(                                            url: that.$host + "login",                                            data:                                                 "js_code": res2.code,                                                "encryptedData": info                                                    .encryptedData,                                                "iv": info.iv,                                                "provider": 'weixin',                                            ,                                            method: "GET",                                            success(res)                                                 that.globalData.openid =                                                    res.data.openid                                                                                    );                                        uni.hideLoading();                                    ,                                    fail: () =>                                         uni.showToast(                                            title: "微信登录授权失败",                                            icon: "none"                                        );                                                                    )                            ,                            fail: () =>                                 uni.showToast(                                    title: "微信登录授权失败",                                    icon: "none"                                );                                                    )                    else                         console.log("跳过")                                                );        ,

后端

后端需要对微信的数据进行解密处理,并储存,返回openid,作为后续用户数据唯一标识。

login.py

from flask import Flask, jsonify,requestimport requestsfrom WXBizDataCrypt import WXBizDataCryptapp = Flask(__name__)app.config.from_pyfile("config.config")db.init_app(app)@app.route("/login",methods=["GET"])def login():    js_code=request.args.get("js_code")    provider=request.args.get("provider")    if provider=="weixin":        encryptedData = request.args.get("encryptedData")        iv = request.args.get("iv")        appid = ''#需要填写自己的        secret = ''#需要填写自己的        response=requests.get("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"%(appid,secret,js_code))        sk=response.json()        pc = WXBizDataCrypt(appid, sk["session_key"])        info=pc.decrypt(encryptedData, iv)-----------分界线:下面为储存用户信息过程,根据需要了解(储存流程,如果是第一次没有查询到用户信息,则储存openid等,如果有用户信息了,就判断昵称和头像等不等于现在最新的数据,如果都等于就不处理,如果其中一个不相等,然后判断是否有更新过或者是否语言为空,如果是,则更新。最后返回json数据openid)---------------        pn = wz_user.query.filter(wz_user.open_id == sk["openid"]).first()        if pn == None:            pr = wz_user(sk["openid"], info["nickName"], info["province"], info["avatarUrl"],                         info["city"], info["country"], info["gender"], info["language"],0)            db.session.add(pr)            db.session.commit()        elif pn.nick_name!=info["nickName"] or pn.avatar_url!=info["avatarUrl"]:            if pn.is_update==0 or pn.language=="":                wz_user.query.filter(wz_user.open_id==sk["openid"] ).update(wz_user.nick_name:info["nickName"],wz_user.avatar_url:info["avatarUrl"],                                                                             wz_user.province:info["province"],                                                                             wz_user.city:info["city"],wz_user.country:info["country"],                                                                             wz_user.gender:info["gender"],wz_user.language:info["language"],wz_user.is_update:1)                db.session.flush()                db.session.commit()        return jsonify("massage":"登录成功","openid":sk["openid"])

微信解密方法:

WXBizDataCrypt.py

需要安装pycrypto模块,pip install pycrypto

import base64import jsonfrom Crypto.Cipher import AESclass WXBizDataCrypt:    def __init__(self, appId, sessionKey):        self.appId = appId        self.sessionKey = sessionKey    def decrypt(self, encryptedData, iv):        # base64 decode        sessionKey = base64.b64decode(self.sessionKey)        encryptedData = base64.b64decode(encryptedData)        iv = base64.b64decode(iv)        cipher = AES.new(sessionKey, AES.MODE_CBC, iv)        decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)))        if decrypted['watermark']['appid'] != self.appId:            raise Exception('Invalid Buffer')        return decrypted    def _unpad(self, s):        return s[:-ord(s[len(s)-1:])]

这样,我们前端,和后端都搞定了。

以上是关于uniapp关闭小程序就退出登录的主要内容,如果未能解决你的问题,请参考以下文章