payment/payment_backend/services/order.py

86 lines
3.6 KiB
Python

import uuid
from custom_decorators import singleton
from models import Order
from repositories.order import OrderRepository
from services.payment import PaymentService
from utils.datetime import current, current_timestamp, is_time_difference_greater_than, timestamp2datetime
@singleton
class OrderService:
def __init__(self, config):
self.config = config
self.order_status = self.config.order.order_status
self.payment_service = PaymentService(config.APIKey.tronscan)
self.order_repo = OrderRepository(config)
def query_order(self, name=None, phone=None, email=None, wallet_address=None,
offset=0, limit=10):
orders = self.order_repo.query(Order(name=name, phone=phone, email=email, from_address=wallet_address),
offset, limit)
cleaned_orders = []
for order in orders:
cleaned_order = []
for i, v in enumerate(order):
if i == 4: # 交易数量
if v is None:
v = 0
else:
v = int(v)
elif i == 7 or i == 8: # 时间戳
if v is None:
v = ''
else:
v = timestamp2datetime(v).strftime("%m/%d/%Y %I:%M:%S %p")
elif i == 9: # 订单状态
if v is None or v > len(self.order_status):
v = 0
v = self.order_status[v]
else:
if v is None:
v = ''
cleaned_order.append(v)
cleaned_orders.append(cleaned_order)
return cleaned_orders
def create_order(self, name, phone, email, quant, payment_method, wallet_address):
date_str = current().strftime('%Y%m%d%H%M%S')
unique_id = str(uuid.uuid4()).split('-')[0]
order_id = f"{date_str}-{unique_id}"
try:
to_address = self.config['PaymentAddresses'][payment_method]
except KeyError:
raise ValueError("Payment method not supported")
order = Order(order_id=order_id, name=name, phone=phone, email=email,
quant=quant, payment_method=payment_method,
from_address=wallet_address, to_address=to_address)
create_timestamp = self.order_repo.create(order)
return order_id, create_timestamp
def finish_order(self, order_id):
# 判断支付时间是否超过订单存活时间
status = 2
now = current_timestamp()
quant, from_address, to_address, create_timestamp = self.order_repo.get_order_info(order_id)
if is_time_difference_greater_than(create_timestamp, now, milliseconds=self.config.order.lifetime):
# 订单超时
status = 0
else:
correct_quant, confirmed = self.payment_service.check_payment(int(quant),
from_address, to_address,
# 减去十秒, 避免网络延迟导致的订单创建时间太晚
create_timestamp - 10000, now)
if correct_quant and confirmed:
# 支付成功
status = 1
elif confirmed:
# 金额不对
status = 3
elif correct_quant:
# 支付尚未成功
status = 4
if status != 2:
self.order_repo.update_status(order_id, status)
return status