Exemple #1
0
    def create(self, request, *args, **kwargs):
        # print(request.data)
        # try:
        api = WXAPPAPI(appid=MINI_APP_ID, app_secret=MINI_APP_SECRET)
        code = request.data['code']  # 获取到code
        session_info = api.exchange_code_for_session_key(code=code)
        session_key = session_info.get('session_key')
        crypt = WXBizDataCrypt(MINI_APP_ID, session_key)
        encrypted_data = request.data['username']  # 获取到encrypted_data
        iv = request.data['password']  # 获取到iv
        user_info = crypt.decrypt(encrypted_data, iv)  # 获取到用户的登陆信息
        # 获取用户的信息
        openid = user_info['openId']  # 获取openid
        avatarUrl = user_info['avatarUrl']  # 获取头像
        country = user_info['country']  # 获取国家
        province = user_info['province']  # 获取城市
        city = user_info['city']  # 获取区域
        gender = user_info['gender']  # 获取性别
        language = user_info['language']  # 获取语言
        nickName = user_info['nickName']  # 获取昵称
        # 保存用户头像到本地
        avatarPath = os.path.join(BASE_DIR, 'upload/UserProFilebg/avatar/')
        avatarGet = requests.get(avatarUrl)
        avatar_name = avatarPath + openid + '.png'
        image = Image.open(BytesIO(avatarGet.content))
        image.save(avatar_name)
        # 判断用户是否存在
        if UserProFile.objects.filter(openid=openid):
            this_user = UserProFile.objects.filter(openid=openid)
            this_user.nickName = nickName  # 更新用户的微信昵称
            this_user.avatarUrl = avatarUrl  # 更新用户微信头像
            this_user.gender = str(gender)  # 更新用户的性别
            this_user.avatar = 'avatar/' + openid + '.png'
            this_user.update()
            return Response(status=status.HTTP_400_BAD_REQUEST)
        else:
            # 保存用户信息
            if len(nickName) > 6:
                nickName = nickName[0:6]
            user_info_save = UserProFile()
            user_info_save.openid = openid  # 保存用户openid
            user_info_save.avatarUrl = avatarUrl  # 保存用户微信头像
            user_info_save.country = country  # 保存用户所在的国家
            user_info_save.province = province  # 保存用户所在的城市
            user_info_save.city = city  # 保存用户所在的区域
            user_info_save.avatar = 'UserProFilebg/avatar/' + openid + '.png'
            user_info_save.gender = str(gender)  # 保存用户的性别
            user_info_save.language = language  # 保存用户当前使用的语言
            user_info_save.nickName = nickName  # 保存用户的微信昵称
            user_info_save.name = nickName  # 用户原始的用户名
            user_info_save.username = openid  # 保存用户的昵称
            user_info_save.password = make_password(openid)  # 保存用户的密码
            user_info_save.zhong_jifen = 0
            user_info_save.save()
        # except:
        #     return Response(status=status.HTTP_401_UNAUTHORIZED)

        return Response(status=status.HTTP_201_CREATED)
Exemple #2
0
    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        try:
            username = self.request.data

            api = WXAPPAPI(appid=MINI_APP_ID, app_secret=MINI_APP_SECRET)
            code = username['code']  # 获取到code
            session_info = api.exchange_code_for_session_key(code=code)
            session_key = session_info.get('session_key')
            crypt = WXBizDataCrypt(MINI_APP_ID, session_key)
            encrypted_data = username['username']  # 获取到encrypted_data
            iv = username['password']  # 获取到iv
            user_info = crypt.decrypt(encrypted_data, iv)  # 获取到用户的登陆信息

            # 获取用户的信息
            openid = user_info['openId']  # 获取openid
            avatarUrl = user_info['avatarUrl']  # 获取到头像
            nickName = user_info['nickName']  # 获取昵称
            # 找到用户更新用户的微信昵称和头像
            this_user = UserProFile.objects.filter(openid=openid)

            if this_user:
                this_user = this_user[0]
                this_user.avatarUrl = avatarUrl
                this_user.nickName = nickName
                # this_user.avatar = 'avatar/' + openid + '.png'
                this_user.save()

            username['username'] = openid
            username['password'] = openid
            del username['code']
        except:
            pass

        return {
            'request': self.request,
            'view': self,
        }
Exemple #3
0
    def post(self, request, *args, **kwargs):
        #################################################################
        # 这段为 编辑 验证字段的逻辑 主要是讲 request的'username' 'password' 都设置为用户唯一id openId
        # 这里 缺一段 类之间 self的传递 搞不清楚
        try:
            username = request.data.copy()
            print(1)
            api = WXAPPAPI(appid=MINI_APP_ID, app_secret=MINI_APP_SECRET)
            print(2)
            code = username['code']  # 获取到code
            session_info = api.exchange_code_for_session_key(code=code)
            session_key = session_info.get('session_key')
            crypt = WXBizDataCrypt(MINI_APP_ID, session_key)
            print(3)
            encrypted_data = username['username']  # 获取到encrypted_data
            iv = username['password']  # 获取到iv
            user_info = crypt.decrypt(encrypted_data, iv)  # 获取到用户的登陆信息
            print(4)
            # 获取用户的信息
            openid = user_info['openId']  # 获取openid
            avatarUrl = user_info['avatarUrl']  # 获取到头像
            nickName = user_info['nickName']  # 获取昵称
            # 找到用户更新用户的微信昵称和头像
            this_user = UserProFile.objects.filter(openid=openid)
            print(5)
            if this_user:
                this_user = this_user[0]
                this_user.avatarUrl = avatarUrl
                this_user.nickName = nickName
                # this_user.avatar = 'avatar/' + openid + '.png'
                this_user.save()
            print(6)
            username['username'] = openid
            username['password'] = openid
            del username['code']
        except:
            print('失败')
            pass
        ##################################################################
        serializer = self.get_serializer(data=username)


        if serializer.is_valid():
            user = serializer.object.get('user') or request.user
            token = serializer.object.get('token')
            response_data = jwt_response_payload_handler(token, user, request)
            print(response_data)
            response = Response(response_data)

            # token = Token.objects.create(user=...)
            # print(token.key)

            if api_settings.JWT_AUTH_COOKIE:
                expiration = (datetime.utcnow() +
                              api_settings.JWT_EXPIRATION_DELTA)
                response.set_cookie(api_settings.JWT_AUTH_COOKIE,
                                    token,
                                    expires=expiration,
                                    httponly=True)
            return response
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)