uniapp,实现微信小程序登录,python登录接口的实现
Posted 大家一起学编程(python)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,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:])]
这样,我们前端,和后端都搞定了。
以上是关于uniapp,实现微信小程序登录,python登录接口的实现的主要内容,如果未能解决你的问题,请参考以下文章
uniapp,实现微信小程序登录,python登录接口的实现