瀏覽代碼

wechat auth login
使用unionID作为标记

chenjunkai 5 年之前
父節點
當前提交
6a3ec7686f
共有 3 個文件被更改,包括 28 次插入15 次删除
  1. 4 0
      Controller/EquipmentManager.py
  2. 23 14
      Controller/UserController.py
  3. 1 1
      Model/models.py

+ 4 - 0
Controller/EquipmentManager.py

@@ -829,6 +829,10 @@ def update_uid_set(request):
         return response.json(tko.code)
 
 
+# 测试环境
+# test.shadow.dvema.com
+# 生产环境
+# shadow.dvema.com
 # 设备影子更新
 def update_device_shadow(request):
     request.encoding = 'utf-8'

+ 23 - 14
Controller/UserController.py

@@ -1445,7 +1445,14 @@ class wxAuthSignView(TemplateView):
                 access_token = res_json['access_token']
                 openid = res_json['openid']
                 if access_token and openid:
-                    user_extend_qs = UserOauth2Model.objects.filter(authOpenID=openid, authType=1)
+                    info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}'.format(
+                        access_token=access_token, openid=openid)
+                    res_req = requests.get(url=info_url)
+                    res_req.encoding = res_req.apparent_encoding
+                    res_json = res_req.json()
+                    print(res_json)
+                    unionID = res_json['unionid']
+                    user_extend_qs = UserOauth2Model.objects.filter(unionID=unionID, authType=1)
                     if user_extend_qs.exists():
                         # 如果用户绑定过则直接登录
                         userID = user_extend_qs[0].userID_id
@@ -1454,15 +1461,9 @@ class wxAuthSignView(TemplateView):
                         return self.do_login(user_qs, response)
                     else:
                         # 如果用户为绑定过则创建用户并进行登录返回token
-                        info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}'.format(
-                            access_token=access_token, openid=openid)
-                        res_req = requests.get(url=info_url)
-                        res_req.encoding = res_req.apparent_encoding
-                        res_json = res_req.json()
-                        print(res_json)
                         userID = CommonService.getUserID(getUser=False)
                         nickname = res_json['nickname'] + '_' + CommonService.RandomStr(4)
-                        return self.do_register(userID, nickname, response, appBundleID, openid)
+                        return self.do_register(userID, nickname, response, appBundleID, unionID)
                 else:
                     return response.json(414, 'access_token,openid')
             else:
@@ -1501,7 +1502,7 @@ class wxAuthSignView(TemplateView):
         user_qs.update(last_login=now_time, online=True)
         return response.json(0, res)
 
-    def do_register(self, userID, nickname, response, appBundleId, openid):
+    def do_register(self, userID, nickname, response, appBundleId, unionID):
         data_valid = DataValid()
         if data_valid.name_validate(userID) is not True:
             return response.json(105)
@@ -1521,7 +1522,7 @@ class wxAuthSignView(TemplateView):
                 updTime=nowTime,
                 userID_id=users.userID,
                 authType=1,
-                authOpenID=openid
+                unionID=unionID
             )
         except Exception as e:
             errorInfo = traceback.format_exc()
@@ -1585,13 +1586,21 @@ class wxPerfectView(TemplateView):
                         return response.json(717)
                     access_token = res_json['access_token']
                     openid = res_json['openid']
+                    
                     if access_token and openid:
-                        user_has_bind = UserOauth2Model.objects.filter(authOpenID=openid)
+                        info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}'.format(
+                            access_token=access_token, openid=openid)
+                        res_req = requests.get(url=info_url)
+                        res_req.encoding = res_req.apparent_encoding
+                        res_json = res_req.json()
+                        print(res_json)
+                        unionID = res_json['unionid']
+                        user_has_bind = UserOauth2Model.objects.filter(unionID=unionID)
                         if not user_has_bind.exists():
                             user_oauth2_qs = UserOauth2Model.objects. \
                                 filter(userID_id=userID, authType=1)
                             if user_oauth2_qs.exists():
-                                user_oauth2_qs.update(authOpenID=openid)
+                                user_oauth2_qs.update(unionID=unionID)
                                 return response.json(0)
                             else:
                                 try:
@@ -1601,7 +1610,7 @@ class wxPerfectView(TemplateView):
                                         updTime=nowTime,
                                         userID_id=userID,
                                         authType=1,
-                                        authOpenID=openid)
+                                        unionID=unionID)
                                 except Exception as e:
                                     return response.json(424, repr(e))
                                 else:
@@ -1968,7 +1977,7 @@ class UnbundingWXView(TemplateView):
         if tko.code == 0:
             userID = tko.userID
             user_oauth2_qs = UserOauth2Model.objects.filter(
-                ~Q(authOpenID='') & Q(userID_id=userID) & Q(authType=auth_type))
+                ~Q(unionID='') & Q(userID_id=userID) & Q(authType=auth_type))
             if user_oauth2_qs.exists():
                 user_qs = Device_User.objects.filter(phone='', userEmail='', userID=userID)
                 if user_qs.exists():

+ 1 - 1
Model/models.py

@@ -731,7 +731,7 @@ class UserOauth2Model(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
     authType = models.SmallIntegerField(default=0, verbose_name=0)  # 授权类型 0 非授权,1 微信授权
-    authOpenID = models.CharField(default='', max_length=64, verbose_name='唯一标记')  # 绑定唯一标记
+    unionID = models.CharField(default='', max_length=64, verbose_name='唯一标记')  # 绑定唯一标记 unionID
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)