关于微信,qq小程序的登录,数据库-前端-接口解析

news2024/9/22 7:35:16

一、背景  

当我们在对接微信平台,开发微信小程序时,用户标识是必不可少的。用户标识贯通了整个开发过程,所以获取到唯一的用户标识是必须的。

          

二、多平台兼容  

因为考虑到一次开发,可多端运行,需要考虑兼容多平台兼容,这里我们同时考虑微信,QQ,如果有其他小程序根据需要添加。

我们前端采用uniapp框架。后端采用Python编写。

          

三、用户标识  

考虑到我们代码需要支持多平台,因此,需要对每个平台分析,并得到对应的唯一标识(openid)

1、微信  

根据小程序的开发文档,我们可以得知和解析其openid。具体看图:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html    

流程如下:用户通过前端登录接口获得code,然后传给后台,后台再调用接口,解析到用户的openid。

          

2、QQ  

QQ小程序这边也是相同的方式,大差不差流程是相同。

QQ开发文档

https://q.qq.com/wiki/develop/miniprogram/frame/open_ability/open_userinfo.html    

四、需求分析  

首先第一步,是要分析我们的需求是什么,我们要实现什么功能。

1、我们要实现一个登录功能,并且可以同时支持QQ和微信

2、我们要把数据库,前端,后端,都要描述清楚

          

五、开发设计  

(一)、前端设计  

1、code只能通过前端获得,所以前端需要先通过登录接口获取到code,然后把code传给后台。

2、如果后台返回得到的openid,或者其他id之后,前端需要把openid存起来,用作全局用户唯一标识。

3、需要根据微信,QQ做区分,需要先调用渠道获取到当前渠道信息。使用uni.getProvider可以获取到渠道。    

(二)、数据库设计  

1、数据库需要储存用户信息,并方便之后用户标识。所以增加一个user表。

2、另外需要区分微信用户还是qq用户。

Id

Openid

source

平台id

用户openid

来源,微信还是qq

一个基础的用户数据表就完成了,有其他字段需要自行添加,比如后期可能需要用户昵称,手机号,用户头像等。

          

(三)、接口设计  

1、后台需要提前准备一个接口,供前前端传输code,后台处理之后并返回openid,

2、后台需要请求session接口获得openid。只需要一个接口。

3、需要做微信和QQ区分。

          

六、代码实现  

1、前端代码  

这里我们通过getProvider获得渠道类型,然后调用登录接口获得code,然后使用code,Provider传给后台。用来区分微信、qq,返回的openid我们存起来。setStorage是存缓存。也可以使用全局变量globalData。

        onLaunch: function() {
           
            let that = this;
            uni.showLoading({
                title: '正在登录中~'    
            });
            uni.getProvider({
                service: 'oauth',
                success: function(res) {
                    console.log(res.provider[0])
                    uni.login({
                        provider: res.provider[0],
                        success: (res2) => {
                            console.log(res2);
                            uni.request({
                                url: "https://127.0.0.1:80/login",
                                data: {
                                    "js_code": res2.code,
                                    "provider": res.provider[0]
           
                                },
                                method: "GET",
                                success(res) {
                                    uni.setStorage({
                                        key: 'openid',
                                        data: res.data.openid,
                                        success: function() {
                                            console.log('success');
                                        }
                                    });
                                }
                            });
                            uni.hideLoading();
           
                        },
                        fail: () => {
                            uni.showToast({
                                title: "微信登录授权失败",
                                icon: "none"
                            });
                        }
                    })
           
                }
           
            });
        },
        globalData: {    
            openid: ''
        },
           


 

2、模型  

后台我们采用Python+django实现,我们创建对应的数据库模型,用来做数据处理

class WxUser(models.Model):          
    """用户表"""          
    id = models.AutoField(primary_key=True)          
    open_id = models.CharField(max_length=100, unique=True, verbose_name="微信 OpenID")          
    nick_name = models.CharField(max_length=28, verbose_name="昵称", null=True)          
    avatar_url = models.TextField(max_length=300, verbose_name="头像链接", null=True)          
    gender = models.IntegerField(verbose_name="男0,女1", default="0")          
    source = models.IntegerField(verbose_name="微信小程序0,qq小程序1", default="0")          
    created_at = models.DateTimeField(default=timezone.now)          
    updated_at = models.DateTimeField(default=timezone.now)          
    is_del = models.IntegerField(blank=True, default="0", verbose_name="是否删除,0未删除,1已删除"
 

3、接口代码  

接口需要做渠道区分,如果已经存在就返回openid

          

def login(request):          
    js_code = request.GET.get("js_code")          
    provider = request.GET.get("provider")          
    if provider == "weixin":          
            appid = 'wxf8cb9a'          
            secret = 'ff2ff7a449b'          
            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))          
            source = 0          
    elif provider == "qq":          
        appid = '11234084'          
        secret = '1loc0hE'          
        response = requests.get(          
            "https://api.q.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code" % (          
                appid, secret, js_code))          
        source=1          
    openid = response.json()["openid"]          
    user= WxUser.objects.filter(open_id=openid, source=source).first()          
    if user== None:          
        WxUser(open_id=openid).save()          
    return JsonResponse({"openid": openid})        

七、文章总结  

本文提供了一个简单的登录实例,供大家参考。

使用开发工具:hbuilder X,pycharm,微信开发者工具。

本文主要讲述,前端如何获取设备渠道,微信,qq登录方式。后端数据库大概,如何调用接口获取openid。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP 财务管理系统 —— 企业财务智能化的领航者

在当今数字化时代,企业财务管理的智能化已成为推动企业持续增长的关键因素。SAP 财务管理系统通过智能化技术,帮助财务部门提高收入、控制成本并降低财务风险,释放财务数字化转型的价值。财务 ERP 作为 SAP 的核心组成部分,将帮助…

【机器学习】成本函数在逻辑回归中的形式以及逻辑回归的成本函数

引言 在机器学习中,逻辑回归是一种用于二分类问题的线性回归的扩展。逻辑回归的成本函数是用来评估模型预测结果与实际结果之间差异的函数 文章目录 引言一、成本函数在逻辑回归中的形式1.1 成本函数的具体形式1.1.1 对于单个训练样本 二、逻辑回归的成本函数实现2.…

股指期货的期现套利及其作用是什么?

股指期货市场提供了一种独特的投资机会,即通过期现套利策略来捕捉无风险利润。这种策略基于股指期货与对应的现货指数之间的价格差异。当这种差异超出正常范围时,投资者可以利用套利操作来实现稳定收益。 期现套利的核心在于同时买入现货指数的代表性投…

STM32DMA数据传输

我估计大多数人学这么久连听说都没听说过DMA,更不用提知道它是干嘛的。其实DMA的本质就是一个数据的搬运工。平常的时候当我们没有配置的时候,一直都是CPU在搬运数据,但是这个活又累又没有技术含量,所以DMA的重要性还是有的。 目…

centos8.5.2111切换阿里云镜像

备份 mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup下载最新的源 wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo更改第二个配置文件 cd /etc/yum.repo…

自定义CustomRatingBar控件

通过自定义RatingBar的样式实现⭐️⭐️⭐️指示器的方式功能过于受限,而且显示的样式阴影会受到影响。 系统自带显示: 自定义样式: 因此简单自一个符合要求的 CustomRatingBar 支持设置星星数量支持设置星星Rating(float)支持设置空显示…

计算机毕业设计选题推荐-健康饮食系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现

1 需求分析 1.1 用户需求 1.1.1 背景与现状 穷游网是国内知名的旅游社区,在其网站上,用户可以自由分享旅行经验和攻略,也可以浏览其他用户的经验和攻略,以便更好地规划自己的旅行。而酒店信息是旅行攻略中不可或缺的一部分&#…

正点原子imx6ull-mini-Linux驱动之设备树下的 platform 驱动编写(15)

上一章我们详细的讲解了 Linux 下的驱动分离与分层,以及总线、设备和驱动这样的驱动 框架。基于总线、设备和驱动这样的驱动框架,Linux 内核提出来 platform 这个虚拟总线,相应 的也有 platform 设备和 platform 驱动。上一章我们讲解了传统的…

vue2学习 -- 脚手架

文章目录 1. 使用2. render函数3. vue.config.js配置文件4. ref属性5. props配置6. mixin7. 插件8. scoped 1. 使用 脚手架文档 安装脚手架 npm install -g vue/cli 选择工作目录,创建项目 vue create name 2. render函数 关于不同版本的Vue.js vue.js与vue.run…

在 VueJS 项目中实现多个可拖拽的弹出框(多个可拖拽el-dialog弹出框,共用同一函数)

前言 在项目开发中,弹出框(Dialog)是常见的UI组件。默认情况下,弹出框的位置是固定的,但在某些场景下,我们希望用户可以自由拖动弹出框的位置,以提升用户体验。之前单个视频拖拽弹框&#xff0…

Spring Boot 参数校验 Validation 使用

概述 当我们想提供可靠的 API 接口,对参数的校验,以保证最终数据入库的正确性,是必不可少的活。前、后端校验都是保证参数的准确性的手段之一,前端校验并不安全,任何人都可以通过接口来调用我们的服务,就算…

springboot电影购票系统-计算机毕业设计源码85384

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

ComfyUI插件:ComfyUI layer style 节点(三)

前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度…

哪里可以找到数据恢复软件?5 款顶级数据恢复软件分享

在当今的数字时代,我们的数据既是我们最宝贵的资产,也是我们最大的弱点。由于硬件故障、意外删除或软件问题,丢失重要文档、珍贵照片或对职业至关重要的项目的风险始终存在。值得庆幸的是,强大的数据恢复软件可以帮助找回最初看似…

[每周一更]-(第108期):如何保护你的JavaScript代码

文章目录 一、框架如何实现JS的保护1. 模块化和组件化2. 使用环境变量3. 代码混淆和最小化vue.config.js 4. 使用请求库和拦截器axios.js 文件在组件中使用 Axios 拦截器 5. 服务端处理敏感逻辑6. 安全最佳实践使用 CSP 7. 依赖前端框架的内置安全特性8. 数据验证和清理 二、原…

【linux】【操作系统】内核之traps.c源码阅读

C 文件traps.c 是 Linux 内核的一部分,主要处理硬件陷阱和故障。文件中包含多个函数来处理不同类型的异常和错误。下面是详细的解析: 概览 目的:此文件负责处理各种硬件异常和故障。它包括了处理特定类型错误以及初始化异常处理器的函数。文…

uniapp0基础编写安卓原生插件和调用第三方jar包(Ch34的jar包)和如何解决android 如何Application初始化

前言 我假设你会uniapp安卓插件开发了,如果不会请看这篇文章,这篇文章是0基础教学。 这篇文章我们将讲一下如何使用CH34XUARTDriver.jar进行开发成uniapp插件。 它的难点是:uniapp如何Application初始化第三方jar包 先去官网下载CH340/CH341的USB转串口安卓免驱应用库:h…

Spring实现自定义注解

一, 背景 目前部门有一个培训,需要讲一下Spring的使用,看到有同学提出问题,想自定义实现一个打日志的注解,下面就记录一下实现过程。 环境: Spring 6.1.5, 不使用Spring Boot. 二,实现步骤 …

Mysql--权限与安全管理

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、权限表 MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在MySQL数据库中,由MySQL_install_db脚本初始化。存储…