DmitrMakeev commited on
Commit
3f1a05a
·
verified ·
1 Parent(s): b55137d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -29
app.py CHANGED
@@ -1017,61 +1017,56 @@ def get_order_monitop():
1017
 
1018
  # Функция для валидации подписи ВК приложения
1019
  def is_valid(*, query: dict, secret: str) -> bool:
1020
- """Check VK Apps signature"""
1021
- logging.debug(f"Checking signature for query: {query}")
1022
 
1023
  # Сортировка параметров и вычисление хеша
1024
- hash_code = b64encode(HMAC(secret.encode(), urlencode(query, doseq=True).encode(), sha256).digest())
1025
-
1026
- # Декодируем base64 и заменяем символы
1027
- decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
1028
 
1029
  # Логируем вычисленную и присланную подпись
1030
- logging.debug(f"Calculated signature: {decoded_hash_code}")
1031
- logging.debug(f"Received signature: {query.get('sign')}")
1032
 
1033
  # Сравниваем подпись из запроса с вычисленной
1034
- return query.get("sign") == decoded_hash_code
1035
 
1036
  # Чтение ордера по ключу и ВК ИД для приложения
1037
  @app.route('/get_order', methods=['POST'])
1038
  def get_order():
1039
  try:
1040
- logging.debug("Starting get_order")
1041
 
1042
  # Читаем параметры из POST-запроса
1043
  vkid = request.form.get('vk_id', '')
1044
  order = request.form.get('order', '')
1045
- apps_id = request.form.get('apps_id', '') # Сюда придет ИД ВК приложения, значение будет ключом для поиска Защищённого ключа в переменной 'api_key_apps_vk'
1046
- sign = request.form.get('sign', '') # Значение sign полученное при запуске приложения
1047
 
1048
- # Выводим параметры запроса для отладки
1049
- logging.debug(f"Received request with vk_id: {vkid}, order: {order}, apps_id: {apps_id}, sign: {sign}")
1050
 
1051
- # Преобразуем строку JSON в словарь
1052
- api_key_apps_vk_dict = json.loads(api_key_apps_vk)
1053
 
1054
  # Получаем секретный ключ по apps_id
1055
  secret_key = api_key_apps_vk_dict.get(apps_id)
1056
- logging.debug(f"Secret key for app {apps_id}: {secret_key}") # Выводим сразу ключ
1057
-
1058
- # Проверка наличия секретного ключа
1059
- if secret_key is None:
1060
- logging.error(f"Secret key not found for app ID {apps_id}")
1061
  return jsonify({"error": "Secret key not found for app ID"}), 400
1062
 
1063
- # Нужно добавить проверку подписи
1064
  if not is_valid(query=request.form, secret=secret_key):
1065
- logging.error(f"Invalid signature for request: {request.form}")
1066
  return jsonify({"error": "Invalid signature"}), 400
1067
 
1068
  # Проверка наличия vk_id и order
1069
  if not vkid or not order:
1070
- logging.error("VK ID and order are required")
1071
  return jsonify({"error": "VK ID and order are required"}), 400
1072
 
1073
- # Подключение к базе данных
1074
- conn = sqlite3.connect('your_database.db') # Замените на ваш путь к базе данных
1075
  cursor = conn.cursor()
1076
 
1077
  # Ищем запись по vk_id
@@ -1080,14 +1075,14 @@ def get_order():
1080
 
1081
  # Если запись по vk_id не найдена, возвращаем значение "not" для ордера
1082
  if not result:
1083
- logging.error(f"VK ID {vkid} not found")
1084
  response = {order: 'not'}
1085
  return jsonify(response), 200
1086
 
1087
  # Извлекаем данные о заказах из базы данных
1088
  shop_st = result[0] if result[0] else '{}'
1089
  shop_st_data = json.loads(shop_st)
1090
- logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
1091
 
1092
  # Ищем значение по ключу order
1093
  value = shop_st_data.get(order, 'not')
@@ -1097,7 +1092,7 @@ def get_order():
1097
  return jsonify(response), 200
1098
 
1099
  except Exception as e:
1100
- logging.error(f"An error occurred: {str(e)}")
1101
  return jsonify({"error": str(e)}), 500
1102
 
1103
 
 
1017
 
1018
  # Функция для валидации подписи ВК приложения
1019
  def is_valid(*, query: dict, secret: str) -> bool:
1020
+ """Проверяем подпись ВК приложения"""
1021
+ logging.debug(f"Проверка подписи для запроса: {query}")
1022
 
1023
  # Сортировка параметров и вычисление хеша
1024
+ data_to_sign = '&'.join([f"{key}={value}" for key, value in sorted(query.items()) if key != 'sign'])
1025
+ hash_code = hmac.new(secret.encode(), data_to_sign.encode(), sha256).hexdigest()
 
 
1026
 
1027
  # Логируем вычисленную и присланную подпись
1028
+ logging.debug(f"Вычисленная подпись: {hash_code}")
1029
+ logging.debug(f"Полученная подпись: {query.get('sign')}")
1030
 
1031
  # Сравниваем подпись из запроса с вычисленной
1032
+ return query.get("sign") == hash_code
1033
 
1034
  # Чтение ордера по ключу и ВК ИД для приложения
1035
  @app.route('/get_order', methods=['POST'])
1036
  def get_order():
1037
  try:
1038
+ logging.debug("Начало обработки запроса get_order")
1039
 
1040
  # Читаем параметры из POST-запроса
1041
  vkid = request.form.get('vk_id', '')
1042
  order = request.form.get('order', '')
1043
+ apps_id = request.form.get('apps_id', '') # ИД ВК приложения, для которого получаем секретный ключ
1044
+ sign = request.form.get('sign', '') # Подпись, полученная при запуске приложения
1045
 
1046
+ # Логируем параметры запроса
1047
+ logging.debug(f"Получены параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}, sign: {sign}")
1048
 
1049
+ # Читаем ключи приложения из конфигурации (или базы данных)
1050
+ api_key_apps_vk_dict = json.loads(api_key_apps_vk) # Поменяйте на вашу логику получения секретных ключей
1051
 
1052
  # Получаем секретный ключ по apps_id
1053
  secret_key = api_key_apps_vk_dict.get(apps_id)
1054
+ if not secret_key:
1055
+ logging.error(f"Не найден секретный ключ для приложения с ID {apps_id}")
 
 
 
1056
  return jsonify({"error": "Secret key not found for app ID"}), 400
1057
 
1058
+ # Проверяем подпись
1059
  if not is_valid(query=request.form, secret=secret_key):
1060
+ logging.error(f"Неверная подпись для запроса: {request.form}")
1061
  return jsonify({"error": "Invalid signature"}), 400
1062
 
1063
  # Проверка наличия vk_id и order
1064
  if not vkid or not order:
1065
+ logging.error("Требуются vk_id и order")
1066
  return jsonify({"error": "VK ID and order are required"}), 400
1067
 
1068
+ # Подключаемся к базе данных
1069
+ conn = sqlite3.connect('your_database.db') # Поменяйте на путь к вашей базе данных
1070
  cursor = conn.cursor()
1071
 
1072
  # Ищем запись по vk_id
 
1075
 
1076
  # Если запись по vk_id не найдена, возвращаем значение "not" для ордера
1077
  if not result:
1078
+ logging.error(f"VK ID {vkid} не найден")
1079
  response = {order: 'not'}
1080
  return jsonify(response), 200
1081
 
1082
  # Извлекаем данные о заказах из базы данных
1083
  shop_st = result[0] if result[0] else '{}'
1084
  shop_st_data = json.loads(shop_st)
1085
+ logging.debug(f"Найдено существующее значение. Загруженный JSON: {shop_st_data}")
1086
 
1087
  # Ищем значение по ключу order
1088
  value = shop_st_data.get(order, 'not')
 
1092
  return jsonify(response), 200
1093
 
1094
  except Exception as e:
1095
+ logging.error(f"Произошла ошибка: {str(e)}")
1096
  return jsonify({"error": str(e)}), 500
1097
 
1098