uniapp,实现微信小程序登录,python登录接口的实现! 您所在的位置:网站首页 python编写QQ登陆 uniapp,实现微信小程序登录,python登录接口的实现!

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

2023-08-31 09:03| 来源: 网络整理| 查看: 265

前言

在开发小程序过程中,可能会遇到需要兼容多个平台的情况,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,request import requests from WXBizDataCrypt import WXBizDataCrypt app = 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 base64 import json from Crypto.Cipher import AES class 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:])]

这样,我们前端,和后端都搞定了。 在这里插入图片描述     如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到806549072,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有