Update app.py
Browse files
app.py
CHANGED
@@ -1017,47 +1017,84 @@ def get_order_monitop():
|
|
1017 |
|
1018 |
# Функция для валидации подписи ВК приложения
|
1019 |
def is_valid(*, query: dict, secret: str) -> bool:
|
1020 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
1021 |
logging.debug(f"Checking signature for query: {query}")
|
|
|
|
|
1022 |
vk_subset = OrderedDict(sorted(x for x in query.items() if x[0][:3] == "vk_"))
|
1023 |
logging.debug(f"Filtered VK params: {vk_subset}")
|
|
|
|
|
1024 |
hash_code = b64encode(HMAC(secret.encode(), urlencode(vk_subset, doseq=True).encode(), sha256).digest())
|
|
|
|
|
1025 |
decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
|
1026 |
logging.debug(f"Calculated signature: {decoded_hash_code}")
|
|
|
|
|
1027 |
return query.get("sign") == decoded_hash_code
|
1028 |
|
1029 |
-
|
1030 |
-
#
|
1031 |
@app.route('/get_order', methods=['POST'])
|
1032 |
def get_order():
|
|
|
|
|
|
|
|
|
|
|
1033 |
try:
|
1034 |
logging.debug("Starting get_order")
|
1035 |
|
1036 |
-
#
|
1037 |
vkid = request.form.get('vk_id', '')
|
1038 |
order = request.form.get('order', '')
|
1039 |
-
apps_id = request.form.get('apps_id', '')
|
1040 |
-
sign = request.form.get('sign', '')
|
1041 |
|
1042 |
-
#
|
1043 |
-
# Если подленная продолжаем действие, если нет сразу возвращаем в ответе not
|
1044 |
if not vkid or not order:
|
1045 |
logging.error("VK ID and order are required")
|
1046 |
return json.dumps({"error": "VK ID and order are required"}), 400
|
1047 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1048 |
conn = sqlite3.connect(DATABASE_NEW)
|
1049 |
cursor = conn.cursor()
|
1050 |
|
1051 |
-
# Ищем запись по vk_id
|
1052 |
cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
|
1053 |
result = cursor.fetchone()
|
1054 |
|
1055 |
-
# Если запись
|
1056 |
if not result:
|
1057 |
logging.error(f"VK ID {vkid} not found")
|
1058 |
response = {order: 'not'}
|
1059 |
return jsonify(response), 200
|
1060 |
|
|
|
1061 |
shop_st = result[0] if result[0] else '{}'
|
1062 |
shop_st_data = json.loads(shop_st)
|
1063 |
logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
|
@@ -1065,7 +1102,7 @@ def get_order():
|
|
1065 |
# Ищем значение по ключу order
|
1066 |
value = shop_st_data.get(order, 'not')
|
1067 |
|
1068 |
-
# Возвращаем
|
1069 |
response = {order: value}
|
1070 |
return jsonify(response), 200
|
1071 |
|
|
|
1017 |
|
1018 |
# Функция для валидации подписи ВК приложения
|
1019 |
def is_valid(*, query: dict, secret: str) -> bool:
|
1020 |
+
"""
|
1021 |
+
Проверяет подпись VK приложения.
|
1022 |
+
|
1023 |
+
:param query: словарь параметров запроса, включая параметр "sign".
|
1024 |
+
:param secret: секретный ключ для подписи.
|
1025 |
+
:return: True, если подпись валидна, иначе False.
|
1026 |
+
"""
|
1027 |
logging.debug(f"Checking signature for query: {query}")
|
1028 |
+
|
1029 |
+
# Отбираем только параметры, начинающиеся с "vk_" и сортируем их по ключу
|
1030 |
vk_subset = OrderedDict(sorted(x for x in query.items() if x[0][:3] == "vk_"))
|
1031 |
logging.debug(f"Filtered VK params: {vk_subset}")
|
1032 |
+
|
1033 |
+
# Формируем строку запроса и вычисляем HMAC с использованием sha256
|
1034 |
hash_code = b64encode(HMAC(secret.encode(), urlencode(vk_subset, doseq=True).encode(), sha256).digest())
|
1035 |
+
|
1036 |
+
# Декодируем результат и заменяем символы для соответствия формату VK
|
1037 |
decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
|
1038 |
logging.debug(f"Calculated signature: {decoded_hash_code}")
|
1039 |
+
|
1040 |
+
# Сравниваем вычисленную подпись с переданной в запросе
|
1041 |
return query.get("sign") == decoded_hash_code
|
1042 |
|
1043 |
+
|
1044 |
+
# Маршрут для получения информации о заказе по VK ID
|
1045 |
@app.route('/get_order', methods=['POST'])
|
1046 |
def get_order():
|
1047 |
+
"""
|
1048 |
+
Обрабатывает POST-запрос для получения информации о заказе на основе VK ID.
|
1049 |
+
|
1050 |
+
:return: JSON ответ с информацией о заказе или ошибке.
|
1051 |
+
"""
|
1052 |
try:
|
1053 |
logging.debug("Starting get_order")
|
1054 |
|
1055 |
+
# Чтение данных из POST-запроса
|
1056 |
vkid = request.form.get('vk_id', '')
|
1057 |
order = request.form.get('order', '')
|
1058 |
+
apps_id = request.form.get('apps_id', '') # Получаем ID VK приложения
|
1059 |
+
sign = request.form.get('sign', '') # Подпись для проверки
|
1060 |
|
1061 |
+
# Проверка наличия обязательных параметров
|
|
|
1062 |
if not vkid or not order:
|
1063 |
logging.error("VK ID and order are required")
|
1064 |
return json.dumps({"error": "VK ID and order are required"}), 400
|
1065 |
|
1066 |
+
# Получаем секретный ключ для приложения по его ID
|
1067 |
+
secret_key = api_key_apps_vk.get(apps_id) # api_key_apps_vk - это словарь с ключами для приложений
|
1068 |
+
if not secret_key:
|
1069 |
+
logging.error(f"App ID {apps_id} not found")
|
1070 |
+
return json.dumps({"error": "App ID not found"}), 400
|
1071 |
+
|
1072 |
+
# Проверка подписи
|
1073 |
+
query_params = {
|
1074 |
+
'vk_id': vkid,
|
1075 |
+
'order': order,
|
1076 |
+
'apps_id': apps_id,
|
1077 |
+
'sign': sign
|
1078 |
+
}
|
1079 |
+
if not is_valid(query=query_params, secret=secret_key):
|
1080 |
+
logging.error("Invalid signature")
|
1081 |
+
return json.dumps({"error": "Invalid signature"}), 400
|
1082 |
+
|
1083 |
+
# Подключаемся к базе данных
|
1084 |
conn = sqlite3.connect(DATABASE_NEW)
|
1085 |
cursor = conn.cursor()
|
1086 |
|
1087 |
+
# Ищем запись по vk_id в базе данных
|
1088 |
cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
|
1089 |
result = cursor.fetchone()
|
1090 |
|
1091 |
+
# Если запись не найдена, возвращаем ошибку
|
1092 |
if not result:
|
1093 |
logging.error(f"VK ID {vkid} not found")
|
1094 |
response = {order: 'not'}
|
1095 |
return jsonify(response), 200
|
1096 |
|
1097 |
+
# Загружаем данные заказа из найденной записи
|
1098 |
shop_st = result[0] if result[0] else '{}'
|
1099 |
shop_st_data = json.loads(shop_st)
|
1100 |
logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
|
|
|
1102 |
# Ищем значение по ключу order
|
1103 |
value = shop_st_data.get(order, 'not')
|
1104 |
|
1105 |
+
# Возвращаем информацию о заказе
|
1106 |
response = {order: value}
|
1107 |
return jsonify(response), 200
|
1108 |
|