Update app.py
Browse files
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 |
-
|
1030 |
-
|
1031 |
-
|
1032 |
-
|
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 |
-
|
1045 |
-
|
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 |
-
#
|
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"
|
1068 |
|
1069 |
-
#
|
1070 |
-
api_key_apps_vk_dict = json.loads(api_key_apps_vk)
|
1071 |
|
1072 |
-
#
|
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 |
-
#
|
1093 |
cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
|
1094 |
result = cursor.fetchone()
|
1095 |
|
1096 |
-
# Если
|
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"
|
1106 |
|
1107 |
-
#
|
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 |
|