小程序实现无感登录+权限分配

djngo开发:小程序实现无感登录+权限分配

由来

最近开发一个预约系统,需要区分普通用户和工作人员。由于账号密码/短信验证过于繁琐,因而选择记录openid实现无感登录。(基本小程序都这样操作)

同时事先在数据库中录入客户手机号,即可在用户登录时根据有无手机号来区分普通用户和工作人员。这样在项目交付时,工作人员和普通用户一样可以直接登录无感登录小程序

1. 开发思路

复制代码
微信的openid是一种唯一标识用户身份的字符串

用户登录小程序,通过手机号快速验证组件获取动态令牌code,后端向微信服务器发送get请求并带上code获取每个用户唯一的openid,然后记录到mysql中,并签发token。该openid就是登录小程序的唯一凭证。

2.简单实现

  • 获取openid,如果通过openid查不用户,就自动新建用户,并返回token。
py 复制代码
#####LoginView###########

code = request.data.get("code")
appid = appid # 微信小程序的appid
appsecret = "xxxxxxxx" # 微信小程序的密钥,登录微信公众平台即可获取
# 获取openid和session_token
querystring = {"appid":appid,"js_code":code,"secret":appsecret,"grant_type":"authorization_code"}
jscode2session = requests.get('https://api.weixin.qq.com/sns/jscode2session',params=querystring)
if not jscode2session.json().get("errcode"):
            data = jscode2session.json()
            ########拿到openid#########
            openid=data.get("openid")
            #######去数据库比对,如果通过openid查到用户并且未被禁用,就新建##########
            try:
                user = models.UserInfo.objects.get(openid)
                if user.is_deleted: # 检查用户是否被禁用
                    return ErrorResponse(msg='用户已被禁用,无法登录',data=data,code=302)
            except models.UserInfo.DoesNotExist: 
               models.UserInfo.objects.create()

3.更进一步:通过手机号来区别普通用户和工作人员

openid虽然做到的唯一性验证,但是当用户数量庞大时,该如何区分用户角色:

  • 一:手动在后台根据已有用户分配权限

  • 二:登录时根据某一标识区分角色

    方法一显然不靠谱,因为用户至少会超过1000人,方法二需要额外标识,显然手机号最合适。

3.1 前端获取手机号的动态令牌

小程序提供了手机号快速验证组件,方便我们获取手机号

bindgetphonenumber 事件回调中的动态令牌code传到开发者后台

html 复制代码
  <view class="title">欢迎来到广盈预约</view>
  <view class="card">
    <view class="button">快捷登录</view>
    <button
      style="opacity: 0"
      class="bottom-button"
      open-type="getPhoneNumber|agreePrivacyAuthorization"
      bindgetphonenumber="getrealtimephonenumber"
      bindagreeprivacyauthorization="handleAgreePrivacyAuthorization"
    >
      同意隐私协议并授权手机号注册
    </button>
  </view>
</view>
js 复制代码
Page({
  getPhoneNumber (e) { console.log(e.detail.code)  // 动态令牌 }
})

注意 :如果你想获取用户手机号就必须添加用户授权《隐私保护协议》bindagreeprivacyauthorization,否则小程序无法上线

3.2 后端带着动态令牌去微信服务器获取手机号

简单来说就是用户登录时数据库中没有手机号对应的用户,后端就会自动建立一个账号,并分配权限为普通用户,然后直接登录。

这样的话,只需要第一次登录时获取手机号,以后登录就可以直接进入系统。

py 复制代码
class RegisterView(APIView):  
    authentication_classes = []
    permission_classes = []
    def getmobile(self,appid,code):
        """获取用户的手机号"""
        try:
            appsecret = "cxxxxxxxxx"
            querystring = {"appid":appid,"secret":appsecret,"grant_type":"client_credential"}
            response = requests.get('https://api.weixin.qq.com/cgi-bin/token',params=querystring)
            access_token = response.json().get("access_token")
            querystring = {"access_token":access_token}
            headers = {"content-type": "application/json"}
            payload = {"code":code}
            mobile =requests.post(f"https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={access_token}",json=payload,headers=headers)
            return mobile.json().get('phone_info').get('phoneNumber')
        except Exception as e:
            return None


    def post(self, request):   
        unionid =request.data.get("unionid")
        nickname =request.data.get("nickname")
        openid = request.data.get("openid")
        code = request.data.get("code")
        appid = request.data.get("appid")

        mobile = self.getmobile(appid=appid,code=code)
        if not mobile:
            return ErrorResponse(msg="手机号获取失败")

        defaults = {
            "openid":openid,
            "unionid":unionid,
            "mobile":mobile,
            "nickname":nickname,
        }

        """这条语句将查找一个符合mobile=mobile条件的记录,如果找到就更新 defaults中的字段 ,否则就创建
        注意: 查询的条件必须是唯一的,否则会造成多条数据返回而报错,这个逻辑同 get() 函数。
        注意: 使用的字段,没有唯一的约束,并发的调用这个方法可能会导致多条相同的值插入。
        """
        models.UserInfo.objects.update_or_create(mobile=mobile,defaults=defaults) 
        models.User_GZH.objects.get_or_create(unionid=unionid, defaults={'unionid':unionid})
        return DetailResponse()
相关推荐
從南走到北2 分钟前
JAVA国际版一对一视频交友视频聊天系统源码支持H5 + APP
java·微信·微信小程序·小程序·音视频·交友
计算机毕业设计小帅21 分钟前
【2026计算机毕业设计】基于Django的社区婴幼儿预防接种系统
数据库·django·课程设计
從南走到北37 分钟前
同城派送小程序
微信·微信小程序·小程序
腾讯云云开发3 小时前
3小时上线!云开发“零运维”外卖小程序指南
微信小程序·ai编程·小程序·云开发
腾讯云云开发3 小时前
云开发1天极速开店!1人搞定全流程
微信小程序·ai编程·小程序·云开发
腾讯云云开发3 小时前
预约+会员+营销全功能覆盖,1 小时上架美业小程序
低代码·微信小程序·小程序·云开发
腾讯云云开发3 小时前
云开发模板建站,1小时速建官网,企业品牌即刻上线
微信小程序·ai编程·小程序·云开发
腾讯云云开发4 小时前
手把手教你用CloudBase完成电商小程序全栈开发
微信小程序·ai编程·小程序·云开发
景彬5 小时前
小红书小组件开发 最早踩坑版
前端·微信小程序
狂团商城小师妹10 小时前
JAVA无人共享台球杆台球柜系统球杆柜租赁系统源码支持微信小程序
java·开发语言·微信小程序·小程序