developing

This commit is contained in:
wystan_rin 2024-11-11 15:32:36 +08:00
parent 5c8f1acace
commit fd17cc9c04
6 changed files with 61 additions and 34 deletions

View File

@ -1,6 +1,7 @@
import requests import requests
from custom_decorators import singleton from custom_decorators import singleton
from utils.tronscan import convert_to_tronscan_timestamp
trc20token_info = { trc20token_info = {
"usdt": {"tokenId": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", "usdt": {"tokenId": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
@ -51,9 +52,9 @@ class Tronscan:
} }
if start_timestamp is not None: if start_timestamp is not None:
params["start_timestamp"] = start_timestamp params["start_timestamp"] = convert_to_tronscan_timestamp(start_timestamp)
if end_timestamp is not None: if end_timestamp is not None:
params["end_timestamp"] = end_timestamp params["end_timestamp"] = convert_to_tronscan_timestamp(end_timestamp)
if from_address is not None: if from_address is not None:
params["fromAddress"] = from_address params["fromAddress"] = from_address
if to_address is not None: if to_address is not None:
@ -90,7 +91,7 @@ class Tronscan:
) )
return response.json() return response.json()
def token_trc20_transfers(self, start=0, limit=10, contract_address=None, def token_trc20_transfers(self, start=None, limit=None, contract_address=None,
start_timestamp=None, end_timestamp=None, confirm=True, start_timestamp=None, end_timestamp=None, confirm=True,
related_address=None, from_address=None, to_address=None): related_address=None, from_address=None, to_address=None):
""" """
@ -107,17 +108,18 @@ class Tronscan:
:return: Get the transfer list of TRC20 and TRC721 tokens. :return: Get the transfer list of TRC20 and TRC721 tokens.
""" """
params = { params = {
"start": start,
"limit": limit,
"filterTokenValue": 1 "filterTokenValue": 1
} }
if start is not None:
params["start"] = start
if limit is not None:
params["limit"] = limit
if contract_address is not None: if contract_address is not None:
params["contract_address"] = contract_address params["contract_address"] = contract_address
if start_timestamp is not None: if start_timestamp is not None:
params["start_timestamp"] = start_timestamp params["start_timestamp"] = convert_to_tronscan_timestamp(start_timestamp)
if end_timestamp is not None: if end_timestamp is not None:
params["end_timestamp"] = end_timestamp params["end_timestamp"] = convert_to_tronscan_timestamp(end_timestamp)
if confirm is not None: if confirm is not None:
params["confirm"] = str(confirm).lower() params["confirm"] = str(confirm).lower()
if related_address is not None: if related_address is not None:
@ -302,8 +304,6 @@ class Tronscan:
""" """
params = { params = {
"address": address, "address": address,
"start_timestamp": start_timestamp,
"end_timestamp": end_timestamp,
"start": start, "start": start,
"limit": limit, "limit": limit,
"direction": direction, "direction": direction,
@ -311,6 +311,10 @@ class Tronscan:
"reverse": reverse, "reverse": reverse,
"fee": fee, "fee": fee,
} }
if start_timestamp is not None:
params["start_timestamp"] = convert_to_tronscan_timestamp(start_timestamp)
if end_timestamp is not None:
params["end_timestamp"] = convert_to_tronscan_timestamp(end_timestamp)
response = requests.get("https://apilist.tronscanapi.com/api/transfer/trx", response = requests.get("https://apilist.tronscanapi.com/api/transfer/trx",
headers={'TRON-PRO-API-KEY': self.api_key}, headers={'TRON-PRO-API-KEY': self.api_key},
params=params) params=params)
@ -335,14 +339,16 @@ class Tronscan:
params = { params = {
"address": address, "address": address,
"trc10Id": trc10Id, "trc10Id": trc10Id,
"start_timestamp": start_timestamp,
"end_timestamp": end_timestamp,
"start": start, "start": start,
"limit": limit, "limit": limit,
"direction": direction, "direction": direction,
"db_version": db_version, "db_version": db_version,
"reverse": reverse, "reverse": reverse,
} }
if start_timestamp is not None:
params["start_timestamp"] = convert_to_tronscan_timestamp(start_timestamp)
if end_timestamp is not None:
params["end_timestamp"] = convert_to_tronscan_timestamp(end_timestamp)
response = requests.get("https://apilist.tronscanapi.com/api/transfer/token10", response = requests.get("https://apilist.tronscanapi.com/api/transfer/token10",
headers={'TRON-PRO-API-KEY': self.api_key}, headers={'TRON-PRO-API-KEY': self.api_key},
params=params) params=params)
@ -367,14 +373,16 @@ class Tronscan:
params = { params = {
"address": address, "address": address,
"trc20Id": trc20Id, "trc20Id": trc20Id,
"start_timestamp": start_timestamp,
"end_timestamp": end_timestamp,
"start": start, "start": start,
"limit": limit, "limit": limit,
"direction": direction, "direction": direction,
"db_version": db_version, "db_version": db_version,
"reverse": reverse, "reverse": reverse,
} }
if start_timestamp is not None:
params["start_timestamp"] = convert_to_tronscan_timestamp(start_timestamp)
if end_timestamp is not None:
params["end_timestamp"] = convert_to_tronscan_timestamp(end_timestamp)
response = requests.get("https://apilist.tronscanapi.com/api/transfer/trc20", response = requests.get("https://apilist.tronscanapi.com/api/transfer/trc20",
headers={'TRON-PRO-API-KEY': self.api_key}, headers={'TRON-PRO-API-KEY': self.api_key},
params=params) params=params)

View File

@ -98,10 +98,7 @@ def log_config(config):
logger.remove() logger.remove()
logger.add(sys.stdout, level=config.log_level) logger.add(sys.stdout, level=config.log_level)
logger.add(sys.stderr, level="ERROR") logger.add(sys.stderr, level="ERROR")
logger.add(os.path.join(ROOT_DIR, "logs", "recommender_{time}.log"), level="DEBUG", encoding='utf8', rotation="100 MB", retention=3) logger.add(os.path.join(ROOT_DIR, "logs", "{time}.log"), level="DEBUG", encoding='utf8', rotation="100 MB", retention=3)
nacos_url = f"http://{os.getenv('NACOS_SOCKET', '192.168.15.40:38865')}/nacos/v1/cs/configs"
def get_config() -> Config: def get_config() -> Config:
@ -109,7 +106,7 @@ def get_config() -> Config:
configparser = ConfigParser() configparser = ConfigParser()
configparser.read(fr'{ROOT_DIR}/config_file/param.conf') configparser.read(fr'{ROOT_DIR}/config_file/param.conf')
parser = argparse.ArgumentParser(description='recommendation system') parser = argparse.ArgumentParser(description='payment system')
parser.add_argument("--seed", type=int, default=2024) parser.add_argument("--seed", type=int, default=2024)
args = parser.parse_args() args = parser.parse_args()
config = Config(configparser, args) config = Config(configparser, args)

View File

@ -1,3 +1,5 @@
from ruamel_yaml.util import create_timestamp
from custom_decorators import singleton from custom_decorators import singleton
@ -7,11 +9,12 @@ class OrderRepository:
self.db = None self.db = None
def create(self, order_id, from_address, to_address): def create(self, order_id, from_address, to_address):
create_time = create_timestamp()
pass pass
def update_status(self, order_id, status): def update_status(self, order_id, status):
# 更新状态和时间 # 更新状态和时间
pass pass
def get_creation_time(self, order_id): def get_order_info(self, order_id):
pass pass

View File

@ -2,6 +2,7 @@ import uuid
from custom_decorators import singleton from custom_decorators import singleton
from repositories.order import OrderRepository from repositories.order import OrderRepository
from services.payment import PaymentService
from utils.datetime import current, current_timestamp, is_time_difference_greater_than from utils.datetime import current, current_timestamp, is_time_difference_greater_than
@ -9,6 +10,7 @@ from utils.datetime import current, current_timestamp, is_time_difference_greate
class OrderService: class OrderService:
def __init__(self): def __init__(self):
self.order_repo = OrderRepository() self.order_repo = OrderRepository()
self.payment_service = PaymentService()
def create_order(self, from_address, to_address, *args, **kwargs): def create_order(self, from_address, to_address, *args, **kwargs):
date_str = current().strftime('%Y%m%d%H%M%S') date_str = current().strftime('%Y%m%d%H%M%S')
@ -19,10 +21,23 @@ class OrderService:
def finish_order(self, order_id): def finish_order(self, order_id):
# 判断支付时间是否超过订单存活时间 # 判断支付时间是否超过订单存活时间
order_creation_time = self.order_repo.get_creation_time(order_id) quant, from_address, to_address, creation_timestamp = self.order_repo.get_order_info(order_id)
if is_time_difference_greater_than(current_timestamp(), order_creation_time, minutes=15): current = current_timestamp()
status = 2 status = 0
if is_time_difference_greater_than(creation_timestamp, current, minutes=15):
# 订单超时
status = 4
else: else:
status = 1 correct_quant, confirmed = self.payment_service.check_payment(quant, from_address, to_address, creation_timestamp, current)
self.order_repo.update_status(order_id, status) if correct_quant and confirmed:
# 支付成功
status = 1
elif correct_quant < 0:
# 没有转账
status = 2
elif confirmed:
# 金额不对
status = 3
if status:
self.order_repo.update_status(order_id, status)
return status return status

View File

@ -4,18 +4,20 @@ from utils.datetime import current_timestamp
@singleton @singleton
class Payment: class PaymentService:
def __init__(self, api_key): def __init__(self, api_key):
self.tronscan = Tronscan(api_key) self.tronscan = Tronscan(api_key)
def check_payment(self, quant, from_address, to_address, order_create_timestamp): def check_payment(self, quant, from_address, to_address, order_create_timestamp, end_timestamp=None):
result = self.tronscan.token_trc20_transfers(from_address=from_address, if end_timestamp is None:
to_address=to_address, end_timestamp = current_timestamp()
start_timestamp=order_create_timestamp, result = self.tronscan.token_trc20_transfers(limit=100,
end_timestamp=int(current_timestamp() * 1000)) from_address=from_address, to_address=to_address,
start_timestamp=order_create_timestamp, end_timestamp=end_timestamp)
if result['rangeTotal'] == 0:
return -1, 0
token_transfers = result['token_transfers'] token_transfers = result['token_transfers']
token_transfer = token_transfers[-1] token_transfer = token_transfers[-1]
confirmed = token_transfer['confirmed'] confirmed = token_transfer['confirmed']
correct_quant = quant == (token_transfer['quant'] / 6) correct_quant = int(quant == (token_transfer['quant'] / 6))
confirmed = confirmed and correct_quant return correct_quant, confirmed
return confirmed

2
utils/tronscan.py Normal file
View File

@ -0,0 +1,2 @@
def convert_to_tronscan_timestamp(timestamp):
return int(timestamp * 1000)