Invalid signature платежный шлюз Fondy
Создаю бота (Python, aiogram) с платной подпиской через платежный шлюз Fondy. Использую принцип проверки статуса платежа, но после отправки запроса получаю:
{
'response': {
'error_code': 1014,
'error_message': 'Invalid signature signature: `8dccc7a9e053c3cdc1efddb13f906bc866239ae6`; response_signature_string: `**********|1396424|85cceedc-e54a-43f5-a9fd-e39dc6f15c1a`',
'request_id': 'ZKIukrDkwZDz9',
'response_status': 'failure'
}
}
Хотя order_id (85cceedc-e54a-43f5-a9fd-e39dc6f15c1a) отображается верно, signature все равно не тот. Помогите пожалуйста найти ошибку. Вот код оплаты.
@dp.message_handler(commands ='FONDY')
async def order_fondy(message: types.Message):
people_id = message.chat.id
base = sqlite3.connect('users.db')
cursor = base.cursor()
order_id = str(uuid.uuid4())
print(order_id)
cursor.execute(f"UPDATE users_id SET order_id == ? WHERE user_id == ?",
(order_id, people_id))
base.commit()
def generate_signature( order_id):
params1 = {
'merchant_id': '1396424',
'order_desc': 'demo order',
'currency': 'USD',
'amount': '125',
'order_id': f'{order_id}'
}
password = 'test'
# Формирование списка значений, отсортированных по ключу
values = []
for key in sorted(params1.keys()):
value = params1[key]
# Пропускаем пустые значения
if value:
values.append(str(value))
# Добавление параметра password со значением 'test' в начало списка значений
values.insert(0, password)
# Формирование строки значений, разделенных символом "|"
signature_string = "|".join(values)
print(signature_string)
# Применяем функцию SHA1 к строке и возвращаем результат в формате шестнадцатеричной строки
signature = hashlib.sha1(signature_string.encode('utf-8')).hexdigest()
return signature
signature = generate_signature(order_id)
print(signature) # Вывод подписи
api = Api(merchant_id=1396424,
secret_key='test')
checkout = Checkout(api=api)
data = {
'order_desc': 'demo order',
'currency': 'USD',
'amount': '125',
'order_id': f'{order_id}'
}
payment_url = checkout.url(data).get('checkout_url')
# Отправка пользователю ссылки на оплату
await message.reply(f"Для оплаты перейдите по ссылке: {payment_url}")
@dp.callback_query_handler(text='check')
async def check_payment_status(call: CallbackQuery):
people_id = call.message.chat.id
connect = sqlite3.connect('users.db')
cursor = connect.cursor()
cursor.execute(f"SELECT order_id FROM users_id WHERE user_id = {people_id}")
result_1 = cursor.fetchone()
order_id = str(result_1[0])
print(order_id)
cursor.execute(f"SELECT payment_id FROM users_id WHERE user_id = {people_id}")
result_2 = cursor.fetchone()
signature = str(result_2[0])
print(signature)
url = 'https://pay.fondy.eu/api/status/order_id'
headers = {'Content-Type': 'application/json'}
data = {
"request": {
'currency': 'USD',
'amount': '125',
'order_id': f'{order_id}',
'merchant_id': '1396424',
'signature': f'{signature}',
'order_desc': 'demo order',
"response_url": "https://pay.fondy.eu/responsepage/"
}
}
async with aiohttp.ClientSession() as session:
async with session.post(url, headers=headers, data=json.dumps(data)) as response:
response_data = await response.json()
print(response_data)
if response.status == 200:
# Обработка успешного ответа