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

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:])]

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111348.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 京东金融大数据竞赛猪脸识别(3)- 图像特征提取之二

    京东金融大数据竞赛猪脸识别(3)- 图像特征提取之二深度网络既然在图像识别方面有很高的准确率,那将某一层网络输出数据作为图像特征也应该是可行的。该程序给出了使用Alexnet第七层作为激活层提取图像特征的示例。代码如下:clear;trainPath=fullfile(pwd,’image’);trainData=imageDatastore(trainPath,…’IncludeSubfolders’,true…

  • SQL行转列、列转行

    SQL行转列、列转行这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况。列转行问题同样也很常见。一、整理测试数据createtablewyc_test( idint(32)notnullauto_increment, namevarchar(80)defaultnull, datedatedefaultn…

  • RouterOS(ROS)设置动态域名(DDNS)「建议收藏」

    RouterOS(ROS)设置动态域名(DDNS)「建议收藏」使用DDNS把动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序通过信息传递把该主机的动态IP地址传送给服务器程序,服务项目程序提供DNS服务并实现动态域名解析。添加一个Scheduler,system->Scheduler::globalddnsiptemp[/ipaddresget[/ipaddressfindinterface=…

  • 订单支付相关问题总结

    订单支付相关问题总结最近公司商城系统要重做,我接手了支付相关的需求,发现里面弯弯绕绕的地方还是有不少的,所以把碰到的问题记录一下。支付问题在第一次对接微信支付时,生成预支付单的接口会让使用微信商家平台的API密钥进行加签,但是就算你使用的API密钥确定没有问题,也可能会返回验签失败,一点办法也没有。解决方法:使用UUID重新生成了32位纯小写的密钥(我怀疑就是密钥格式问题引起的,从来没有见过密钥让用户手…

  • linux的grep命令详解_grep -v命令

    linux的grep命令详解_grep -v命令文章目录一、grep常用命令1、语法2、范例二、grep的一些高级参数1、语法2、范例三、基础正则表达式练习1、与中括号`[]`结合2、与反向选择^结合使用3、与行首`^`和行尾$字符结合4、任意一个字符`.`与重复字符`*`5、`{}`限定连续字符范围一、grep常用命令grep的功能是分析一行信息,若其中有我们所需要的信息,就将其拿出来。需要注意的是它以整行为单位…

  • 关于SetCapture() 和 ReleaseCapture()的用法的个人理解[通俗易懂]

    关于SetCapture() 和 ReleaseCapture()的用法的个人理解[通俗易懂]1.函数功能:在当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内还是边界外。同一时刻只能有一个窗口捕获鼠标。2.失效条件: A.当鼠标在其他窗口按下;B.调用ReleaseCapture释放。3. SetCapture和ReleaseCapture必须成对出现通俗来讲,例如:一只羊被一根弹性的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号