DmitrMakeev commited on
Commit
4dc59b6
·
verified ·
1 Parent(s): d053635

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +173 -0
app.py CHANGED
@@ -21,6 +21,14 @@ import uuid
21
  import psutil
22
 
23
 
 
 
 
 
 
 
 
 
24
  from base import replace_null_with_empty_string
25
 
26
 
@@ -940,6 +948,171 @@ def add_user_senler_full():
940
 
941
 
942
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
943
 
944
 
945
  # Поднятие страницы с таблицей
 
21
  import psutil
22
 
23
 
24
+
25
+ import decimal
26
+ import hashlib
27
+ from urllib import parse
28
+ from urllib.parse import urlparse
29
+
30
+
31
+
32
  from base import replace_null_with_empty_string
33
 
34
 
 
948
 
949
 
950
 
951
+
952
+
953
+
954
+
955
+
956
+
957
+ # ROBO
958
+ def calculate_signature(*args) -> str:
959
+ """Create signature MD5."""
960
+ return hashlib.md5(':'.join(str(arg) for arg in args).encode()).hexdigest()
961
+
962
+ def parse_response(request: str) -> dict:
963
+ """
964
+ :param request: Link.
965
+ :return: Dictionary.
966
+ """
967
+ params = {}
968
+ for item in urlparse(request).query.split('&'):
969
+ key, value = item.split('=')
970
+ params[key] = value
971
+ return params
972
+
973
+ def check_signature_result(
974
+ order_number: int, # invoice number
975
+ received_sum: decimal, # cost of goods, RU
976
+ received_signature: hex, # SignatureValue
977
+ password: str # Merchant password
978
+ ) -> bool:
979
+ signature = calculate_signature(received_sum, order_number, password)
980
+ return signature.lower() == received_signature.lower()
981
+
982
+ def generate_payment_link(
983
+ merchant_login: str, # Merchant login
984
+ merchant_password_1: str, # Merchant password
985
+ cost: decimal, # Cost of goods, RU
986
+ number: int, # Invoice number
987
+ description: str, # Description of the purchase
988
+ user_ip: str, # User IP address
989
+ is_test: str, # Test mode flag
990
+ robokassa_payment_url = 'https://auth.robokassa.ru/Merchant/Index.aspx',
991
+ ) -> str:
992
+ """URL for redirection of the customer to the service."""
993
+ signature = calculate_signature(
994
+ merchant_login,
995
+ cost,
996
+ number,
997
+ user_ip,
998
+ merchant_password_1
999
+ )
1000
+
1001
+ data = {
1002
+ 'MerchantLogin': merchant_login,
1003
+ 'OutSum': cost,
1004
+ 'InvId': number,
1005
+ 'Description': description,
1006
+ 'SignatureValue': signature,
1007
+ 'IsTest': is_test,
1008
+ 'UserIp': user_ip
1009
+ }
1010
+ return f'{robokassa_payment_url}?{parse.urlencode(data)}'
1011
+
1012
+ def update_rkassa(email, rkassa_data):
1013
+ for db in DATABASES:
1014
+ conn = sqlite3.connect(db)
1015
+ cursor = conn.cursor()
1016
+
1017
+ # Получаем текущие данные из столбца rkassa
1018
+ cursor.execute('SELECT rkassa FROM contacts WHERE email = ?', (email,))
1019
+ current_rkassa = cursor.fetchone()
1020
+
1021
+ if current_rkassa and current_rkassa[0]:
1022
+ # Если данные уже есть, добавляем новые через запятую
1023
+ new_rkassa = f"{current_rkassa[0]},{rkassa_data}"
1024
+ else:
1025
+ # Если данных нет, просто записываем новые
1026
+ new_rkassa = rkassa_data
1027
+
1028
+ # Обновляем столбец rkassa
1029
+ cursor.execute('UPDATE contacts SET rkassa = ? WHERE email = ?', (new_rkassa, email))
1030
+ conn.commit()
1031
+ conn.close()
1032
+
1033
+ @app.route('/set_invid', methods=['GET'])
1034
+ def set_invid():
1035
+ global invid
1036
+ invid = int(request.args.get('invid'))
1037
+ return jsonify({'status': 'success', 'invid': invid})
1038
+
1039
+ @app.route('/process_payment', methods=['POST'])
1040
+ def process_payment():
1041
+ global invid
1042
+
1043
+ # Получаем данные из формы
1044
+ out_sum = request.form.get('out_sum', '10.00')
1045
+ user_name = request.form.get('name', '')
1046
+ user_email = request.form.get('email', '')
1047
+ user_phone = request.form.get('phone', '')
1048
+ user_ip = request.form.get('user_ip', '')
1049
+ user_is_test = request.form.get('user_is_test', '0')
1050
+
1051
+ product_name = request.form.get('product_name', 'product')
1052
+ product_id = request.form.get('product_id', 'default_product_id')
1053
+ expiration_date = request.form.get('expiration_date', '2024-01-16T12:00')
1054
+ dostup_date = request.form.get('dostup_date', '')
1055
+
1056
+ # Проверяем, что invid установлен
1057
+ if invid is None:
1058
+ return jsonify({'status': 'error', 'message': 'invid is not set'})
1059
+
1060
+ # Увеличиваем invid на один
1061
+ invid += 1
1062
+
1063
+ # Формируем данные для запроса к Robokassa
1064
+ payment_link = generate_payment_link(
1065
+ merchant_login,
1066
+ password_1,
1067
+ decimal.Decimal(out_sum),
1068
+ invid,
1069
+ f"Оплата за {product_name}",
1070
+ user_ip,
1071
+ user_is_test
1072
+ )
1073
+
1074
+ # Отправляем запрос на сервер Robokassa
1075
+ response = requests.get(payment_link)
1076
+
1077
+ # Записываем данные в базу данных
1078
+ rkassa_data = json.dumps({str(invid): {"data_dostup": dostup_date, "product": product_id}})
1079
+ update_rkassa(user_email, rkassa_data)
1080
+
1081
+ # Записываем текущее время в столбец data_on
1082
+ utc_now = datetime.utcnow()
1083
+ msk_tz = pytz.timezone('Europe/Moscow')
1084
+ msk_now = utc_now.replace(tzinfo=pytz.utc).astimezone(msk_tz)
1085
+ data_on = msk_now.strftime('%Y-%m-%d %H:%M:%S')
1086
+
1087
+ for db in DATABASES:
1088
+ conn = sqlite3.connect(db)
1089
+ cursor = conn.cursor()
1090
+ cursor.execute('UPDATE contacts SET data_on = ?, name = ?, phone = ? WHERE email = ?', (data_on, user_name, user_phone, user_email))
1091
+ conn.commit()
1092
+ conn.close()
1093
+
1094
+ # Возвращаем ссылку на страницу оплаты
1095
+ return jsonify({'payment_url': payment_link})
1096
+
1097
+
1098
+
1099
+
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+
1110
+
1111
+
1112
+
1113
+
1114
+
1115
+
1116
 
1117
 
1118
  # Поднятие страницы с таблицей