同时事先在数据库中录入客户手机号,即可在用户登录时根据有无手机号来区分普通用户和工作人员。这样在项目交付时,工作人员和普通用户一样可以直接登录无感登录小程序
微信的openid是一种唯一标识用户身份的字符串。用户登录小程序,通过手机号快速验证组件获取动态令牌code,后端向微信服务器发送get请求并带上code获取每个用户唯一的openid,然后记录到mysql中,并签发token。该openid就是登录小程序的唯一凭证。
#####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()三.更进一步:通过手机号来区别普通用户和工作人员
<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> Page({ getPhoneNumber (e) { console.log(e.detail.code) // 动态令牌 } })注意:如果你想获取用户手机号就必须添加用户授权《隐私保护协议》bindagreeprivacyauthorization,否则小程序无法上线。
class RegisterView(APIView): authentication_classes = [] permission_classes = [] def getmobile(self,appid,code): # 堆代码 duidaima.com """获取用户的手机号""" 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()