DmitrMakeev commited on
Commit
dc2d29b
·
verified ·
1 Parent(s): 0fa9753

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -42
app.py CHANGED
@@ -1023,33 +1023,19 @@ def get_order_monitop():
1023
 
1024
 
1025
 
1026
- # Функция для валидации подписи ВК приложения
1027
  def is_valid(*, query: dict, secret: str) -> bool:
1028
- """Проверяем подпись ВК приложения с учётом алгоритма подписи ВКонтакте."""
1029
- logging.debug(f"Проверка подписи для запроса: {query}")
1030
-
1031
- # Шаг 1: Сортировка параметров по имени ключа и исключение параметра 'sign'
1032
- sorted_params = sorted(
1033
- ((key, value) for key, value in query.items() if key.startswith('vk_') and key != 'sign'),
1034
- key=lambda x: x[0]
1035
- )
1036
-
1037
- # Шаг 2: Формирование строки с параметрами
1038
- data_to_sign = '&'.join([f"{key}={urllib.parse.quote(str(value))}" for key, value in sorted_params])
1039
- logging.debug(f"Строка для подписи: {data_to_sign}")
1040
-
1041
- # Шаг 3: Вычисление хеша с использованием HMAC и SHA256
1042
- hash_code = hmac.new(secret.encode(), data_to_sign.encode(), hashlib.sha256).digest()
1043
 
1044
- # Шаг 4: Закодировать хеш в base64
1045
- base64_hash = base64.b64encode(hash_code).decode('utf-8')
1046
-
1047
- # Логируем вычисленную и полученную подпись
1048
- logging.debug(f"Вычисленная подпись (Base64): {base64_hash}")
1049
- logging.debug(f"Полученная подпись: {query.get('sign')}")
1050
 
1051
- # Сравнение подписи из запроса с вычисленной
1052
- return query.get('sign') == base64_hash
1053
 
1054
  # Чтение ордера по ключу и ВК ИД для приложения
1055
  @app.route('/get_order', methods=['POST'])
@@ -1057,25 +1043,25 @@ def get_order():
1057
  try:
1058
  logging.debug("Начало обработки запроса get_order")
1059
 
1060
- # Читаем параметры из POST-запроса
1061
  vkid = request.form.get('vk_id', '')
1062
  order = request.form.get('order', '')
1063
- apps_id = request.form.get('apps_id', '') # ИД ВК приложения, для которого получаем секретный ключ
1064
- sign = request.form.get('sign', '') # Подпись, полученная при запуске приложения
1065
 
1066
- # Логируем параметры запроса
1067
- logging.debug(f"Получены параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}, sign: {sign}")
1068
 
1069
- # Читаем ключи приложения из конфигурации (или базы данных)
1070
- api_key_apps_vk_dict = json.loads(api_key_apps_vk) # Поменяйте на вашу логику получения секретных ключей
1071
 
1072
- # Получаем секретный ключ по apps_id
1073
  secret_key = api_key_apps_vk_dict.get(apps_id)
1074
  if not secret_key:
1075
  logging.error(f"Не найден секретный ключ для приложения с ID {apps_id}")
1076
  return jsonify({"error": "Secret key not found for app ID"}), 400
1077
 
1078
- # Проверяем подпись
1079
  if not is_valid(query=request.form, secret=secret_key):
1080
  logging.error(f"Неверная подпись для запроса: {request.form}")
1081
  return jsonify({"error": "Invalid signature"}), 400
@@ -1085,29 +1071,29 @@ def get_order():
1085
  logging.error("Требуются vk_id и order")
1086
  return jsonify({"error": "VK ID and order are required"}), 400
1087
 
1088
- # Подключаемся к базе данных
1089
- conn = sqlite3.connect('your_database.db') # Поменяйте на путь к вашей базе данных
1090
  cursor = conn.cursor()
1091
 
1092
- # Ищем запись по vk_id
1093
  cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
1094
  result = cursor.fetchone()
1095
 
1096
- # Если запись по vk_id не найдена, возвращаем значение "not" для ордера
1097
  if not result:
1098
  logging.error(f"VK ID {vkid} не найден")
1099
  response = {order: 'not'}
1100
  return jsonify(response), 200
1101
 
1102
- # Извлекаем данные о заказах из базы данных
1103
  shop_st = result[0] if result[0] else '{}'
1104
  shop_st_data = json.loads(shop_st)
1105
- logging.debug(f"Найдено существующее значение. Загруженный JSON: {shop_st_data}")
1106
 
1107
- # Ищем значение по ключу order
1108
  value = shop_st_data.get(order, 'not')
1109
 
1110
- # Возвращаем данные из столбца
1111
  response = {order: value}
1112
  return jsonify(response), 200
1113
 
@@ -1123,7 +1109,6 @@ def get_order():
1123
 
1124
 
1125
 
1126
-
1127
 
1128
 
1129
 
 
1023
 
1024
 
1025
 
1026
+ # Функция для валидации подписи ВКонтакте
1027
  def is_valid(*, query: dict, secret: str) -> bool:
1028
+ """Проверка подписи ВКонтакте"""
1029
+ vk_subset = OrderedDict(sorted((k, v) for k, v in query.items() if k.startswith("vk_") and k != "sign"))
1030
+ data_to_sign = urlencode(vk_subset, doseq=True)
1031
+ hash_code = b64encode(HMAC(secret.encode(), data_to_sign.encode(), sha256).digest()).decode('utf-8')
1032
+ decoded_hash_code = hash_code[:-1].replace('+', '-').replace('/', '_')
 
 
 
 
 
 
 
 
 
 
1033
 
1034
+ logging.debug(f"Строка для подписи: {data_to_sign}")
1035
+ logging.debug(f"Вычисленная подпись (Base64): {decoded_hash_code}")
1036
+ logging.debug(f"Полученная подпись из запроса: {query.get('sign')}")
 
 
 
1037
 
1038
+ return query.get("sign") == decoded_hash_code
 
1039
 
1040
  # Чтение ордера по ключу и ВК ИД для приложения
1041
  @app.route('/get_order', methods=['POST'])
 
1043
  try:
1044
  logging.debug("Начало обработки запроса get_order")
1045
 
1046
+ # Чтение параметров из POST-запроса
1047
  vkid = request.form.get('vk_id', '')
1048
  order = request.form.get('order', '')
1049
+ apps_id = request.form.get('apps_id', '')
1050
+ sign = request.form.get('sign', '')
1051
 
1052
+ # Логирование параметров запроса
1053
+ logging.debug(f"Полученные параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}, sign: {sign}")
1054
 
1055
+ # Получение ключей приложения
1056
+ api_key_apps_vk_dict = json.loads(api_key_apps_vk)
1057
 
1058
+ # Получение секретного ключа
1059
  secret_key = api_key_apps_vk_dict.get(apps_id)
1060
  if not secret_key:
1061
  logging.error(f"Не найден секретный ключ для приложения с ID {apps_id}")
1062
  return jsonify({"error": "Secret key not found for app ID"}), 400
1063
 
1064
+ # Проверка подписи
1065
  if not is_valid(query=request.form, secret=secret_key):
1066
  logging.error(f"Неверная подпись для запроса: {request.form}")
1067
  return jsonify({"error": "Invalid signature"}), 400
 
1071
  logging.error("Требуются vk_id и order")
1072
  return jsonify({"error": "VK ID and order are required"}), 400
1073
 
1074
+ # Подключение к базе данных
1075
+ conn = sqlite3.connect('your_database.db')
1076
  cursor = conn.cursor()
1077
 
1078
+ # Поиск записи по vk_id
1079
  cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
1080
  result = cursor.fetchone()
1081
 
1082
+ # Если vk_id не найден
1083
  if not result:
1084
  logging.error(f"VK ID {vkid} не найден")
1085
  response = {order: 'not'}
1086
  return jsonify(response), 200
1087
 
1088
+ # Извлечение данных о заказах
1089
  shop_st = result[0] if result[0] else '{}'
1090
  shop_st_data = json.loads(shop_st)
1091
+ logging.debug(f"Существующее значение JSON: {shop_st_data}")
1092
 
1093
+ # Поиск значения по ключу order
1094
  value = shop_st_data.get(order, 'not')
1095
 
1096
+ # Возврат результата
1097
  response = {order: value}
1098
  return jsonify(response), 200
1099
 
 
1109
 
1110
 
1111
 
 
1112
 
1113
 
1114