(二十五)微信小程序的登陆 实际逻辑
在微信小程序中我们需要有一个openid来做临时的‘认证’
小程序端
<input placeholder="请输入手机号" bindinput="inputPhone" value="{{phone}}"></input> <button open-type="getUserInfo" bindgetuserinfo="doSubmit" >登录</button>
我们不用但是可以写上
data: { phone: null }, inputPhone: function (e) { this.setData({ phone: e.detail.value }) }, doSubmit: function (e) { // 先获取 openid wx.login({ wx.login 可以获取一个临时的凭证 success: (result) => { // 获取一个临时凭证result.code(只能用一次/5分钟) wx.request({ url: 'http://127.0.0.1:8002/login/', data: { phone: this.data.phone, wx_code: result.code }, method: 'POST', dataType: 'json', responseType: 'text', success: (res) => { console.log('登录成功'); } }) } }) },
后端接口
# 用户表 class UserInfo(models.Model): """ 用户表 """ phone = models.CharField(verbose_name='手机号',max_length=32) token = models.CharField(verbose_name='Token',max_length=32) openid = models.CharField(verbose_name='微信唯一标识',max_length=32)
# url from django.conf.urls import url from django.contrib import admin from app01.views import login urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', login.LoginView.as_view()), ]
# views.py
1. 根据传过来的phone去数据库中查找,有就更新,没有就创建
2. 创建的时候要phone(已经传过来了),token我们自己先uuid测试,openid是个关键 需要去一个网址获取【下面的网址】
from app01 import models from rest_framework.views import APIView from rest_framework.response import Response import requests import uuid # Create your views here. class LoginView(APIView): def post(self,request,*args,**kwargs): phone = request.data.get('phone') wx_code = request.data.get('wx_code') # openid的获取:需要拿着wx_code去微信申请 # https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html info = { 'appid': "你自己的微信小程序id", # 微信小程序 'secret': "你自己的微信小程序的key", # 微信小程序 'js_code': wx_code, 'grant_type': "authorization_code", } result = requests.get(url='https://api.weixin.qq.com/sns/jscode2session', params=info) openid = result.json()['openid'] exists = models.UserInfo.objects.filter(phone=phone).exists() token = str(uuid.uuid4()) if not exists: models.UserInfo.objects.create( phone=phone, token=token, openid=openid ) else: models.UserInfo.objects.filter(phone=phone).update(token=token, openid=openid) return Response({'token':token})
前端
success: (res) => { console.log('登录成功'); // 登陆成功之后 可以有一大堆操作,放在全局或者本地 }
这里我们就不在赘述
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现