101 lines
4.1 KiB
Python
Raw Normal View History

2024-10-19 02:59:48 +05:00
#!/usr/bin/env python3
2024-10-20 01:10:48 +05:00
import os
from dotenv import load_dotenv
2024-10-19 01:45:56 +05:00
from flask import Flask, request, jsonify
import subprocess
import json
from datetime import datetime, timedelta
2024-10-20 01:10:48 +05:00
load_dotenv() # This will load environment variables from a .env file if it exists
2024-10-19 01:45:56 +05:00
app = Flask(__name__)
2024-10-20 01:10:48 +05:00
def fetch_account_name(account_no):
try:
result = subprocess.run(['./fetchname.sh', account_no], capture_output=True, text=True, check=True)
response = json.loads(result.stdout)
if response.get('success'):
return response.get('accountName')
except (subprocess.CalledProcessError, json.JSONDecodeError) as e:
app.logger.error(f"Error fetching account name: {str(e)}")
return None
2024-10-19 01:45:56 +05:00
@app.route('/verify-payment', methods=['POST'])
def verify_payment():
# Get data from request
data = request.json
2024-10-20 01:10:48 +05:00
benef_name = data.get('benefName', '').strip().lower()
2024-10-19 01:45:56 +05:00
abs_amount = data.get('absAmount')
time_str = data.get('time')
2024-10-20 01:10:48 +05:00
account_no = data.get('accountNo')
# Fetch account name if account number is provided
if account_no:
fetched_name = fetch_account_name(account_no)
if fetched_name:
benef_name = fetched_name.strip().lower()
else:
return jsonify({"success": False, "message": "Failed to fetch account name"}), 400
2024-10-19 01:45:56 +05:00
# Validate input
if not all([benef_name, abs_amount, time_str]):
return jsonify({"success": False, "message": "Missing required parameters"}), 400
try:
# Parse the input time
request_time = datetime.strptime(time_str, "%Y-%m-%d %H:%M")
except ValueError:
return jsonify({"success": False, "message": "Invalid time format"}), 400
# Execute tx.sh and get the output
try:
result = subprocess.run(['./tx.sh'], capture_output=True, text=True, check=True)
tx_response = json.loads(result.stdout)
# Debug: Print the entire tx_response
app.logger.debug(f"tx_response: {json.dumps(tx_response, indent=2)}")
if not tx_response.get('success'):
return jsonify({"success": False, "message": f"Error from tx.sh: {tx_response.get('reasonText', 'Unknown error')}"}), 500
tx_data_list = tx_response.get('data', [])
if not tx_data_list:
return jsonify({"success": False, "message": "No transaction data found"}), 404
except subprocess.CalledProcessError as e:
return jsonify({"success": False, "message": f"Error executing tx.sh: {str(e)}", "stderr": e.stderr}), 500
except json.JSONDecodeError as e:
return jsonify({"success": False, "message": f"Error parsing tx.sh output: {str(e)}", "output": result.stdout}), 500
# Check transactions
for tx_data in tx_data_list:
# Check if the required keys exist in tx_data
required_keys = ['trxDate', 'benefName', 'absAmount']
missing_keys = [key for key in required_keys if key not in tx_data]
if missing_keys:
continue # Skip this transaction if it's missing required keys
try:
tx_time = datetime.strptime(tx_data['trxDate'], "%Y-%m-%d %H:%M:%S")
time_diff = abs(tx_time - request_time)
2024-10-19 01:45:56 +05:00
# Normalize transaction beneficiary name for comparison
tx_benef_name = tx_data['benefName'].strip().lower()
if (tx_benef_name == benef_name and
2024-10-19 01:45:56 +05:00
str(tx_data['absAmount']) == str(abs_amount) and
time_diff <= timedelta(minutes=30)):
2024-10-19 01:45:56 +05:00
return jsonify({"success": True, "message": "Payment verified"})
except ValueError as e:
app.logger.error(f"Error processing transaction: {str(e)}")
continue # Skip this transaction if there's an error processing it
# If we've checked all transactions and found no match
return jsonify({"success": False, "message": "Transaction not found, contact support"})
if __name__ == '__main__':
2024-10-19 02:34:50 +05:00
debug_mode = os.getenv('APP_DEBUG', 'False').lower() in ('true', '1', 't')
2024-10-19 02:59:48 +05:00
port = int(os.getenv('PORT', 5000))
app.run(host='0.0.0.0', port=port, debug=debug_mode)