developing

This commit is contained in:
wystan_rin 2024-11-21 01:09:07 +08:00
parent 87f497a8de
commit 32fd7fdf24
18 changed files with 242 additions and 243 deletions

View File

@ -6,6 +6,7 @@ from flask import Flask, request, jsonify, make_response
from flask_cors import CORS from flask_cors import CORS
from config import get_config from config import get_config
from loguru import logger
from services.order import OrderService from services.order import OrderService
from services.user import UserService from services.user import UserService
from utils.datetime import parse_time_string, to_milliseconds from utils.datetime import parse_time_string, to_milliseconds
@ -30,6 +31,9 @@ def add_cors_headers(response):
@app.route('/createOrder', methods=['POST']) @app.route('/createOrder', methods=['POST'])
def create_order(): def create_order():
data = request.get_json() data = request.get_json()
name = data.get('name', None)
phone = data.get('phone', None)
email = data.get('email', None)
payment_method = data.get('paymentMethod', None) payment_method = data.get('paymentMethod', None)
if payment_method not in config['PaymentAddresses']: if payment_method not in config['PaymentAddresses']:
return jsonify({ return jsonify({
@ -43,9 +47,6 @@ def create_order():
wallet_address = data.get('wallet_address', None) wallet_address = data.get('wallet_address', None)
if wallet_address is None: if wallet_address is None:
name = data.get('name', None)
phone = data.get('phone', None)
email = data.get('email', None)
wallet_addresses = user_service.get_wallet_addresses(name, phone, email) wallet_addresses = user_service.get_wallet_addresses(name, phone, email)
if not wallet_addresses: if not wallet_addresses:
@ -60,7 +61,8 @@ def create_order():
# 单个地址 # 单个地址
wallet_address = wallet_addresses[0] wallet_address = wallet_addresses[0]
order_id, create_timestamp = order_service.create_order(quant, wallet_address) order_id, create_timestamp = order_service.create_order(name=name, phone=phone, email=email,
quant=quant, wallet_address=wallet_address)
return jsonify({"orderID": order_id, return jsonify({"orderID": order_id,
"amount": quant, "amount": quant,
@ -68,13 +70,31 @@ def create_order():
"orderExpirationTime": config.order.lifetime}), 200 "orderExpirationTime": config.order.lifetime}), 200
@app.route('/queryOrder', methods=['POST'])
def query_order():
data = request.get_json()
name = data.get('name', None)
phone = data.get('phone', None)
email = data.get('email', None)
wallet_address = data.get('wallet_address', None)
page = data.get('page', 1) # 获取页码,默认为第 1 页
page_size = data.get('page_size', 10)
offset = (page - 1) * page_size
limit = page_size
orders = order_service.queryOrder(name, phone, email, wallet_address, offset, limit)
return jsonify({"orders": orders}), 200
order_status = config.order.order_status order_status = config.order.order_status
@app.route('/finishOrder', methods=['GET']) @app.route('/finishOrder', methods=['GET'])
def finish_order(): def finish_order():
data = request.get_json() order_id = request.args.get('orderID', None)
order_id = data.get('orderID', None) logger.debug(f"complete oreder: {order_id}")
status = order_service.finish_order(order_id) status = order_service.finish_order(order_id)
return jsonify({"order_id": order_id, return jsonify({"order_id": order_id,
"status": status, "status": status,

View File

@ -10,7 +10,7 @@ order:
mysql: mysql:
user: wystan user: wystan
password: Wystan14Brown! password: Wystan14Brown!
host: 100.64.0.1 host: 100.64.0.4
port: 3306 port: 3306
database: payment database: payment
autocommit: false autocommit: false

View File

@ -54,9 +54,6 @@ class Database:
except db_errors.Error as e: except db_errors.Error as e:
logger.info(f"Database error: {e}") logger.info(f"Database error: {e}")
raise raise
finally:
if cursor:
cursor.close()
def commit(self): def commit(self):
"""Commit the current transaction.""" """Commit the current transaction."""

View File

@ -84,3 +84,43 @@ class User:
def __hash__(self): def __hash__(self):
return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method)) return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method))
class Order:
def __init__(self, id_=None, order_id=None, name=None, phone=None, email=None, quant=None, from_address=None,
to_address=None, create_timestamp=None, update_timestamp=None, status=None):
self.id = id_
self.order_id = order_id
self.name = name
self.phone = phone
self.email = email
self.quant = quant
self.from_address = from_address
self.to_address = to_address
self.create_timestamp = create_timestamp
self.update_timestamp = update_timestamp
self.status = status
def insert_sql(self, params_format="list"):
params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",",
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email,
quant=self.quant,
from_address=self.from_address, to_address=self.to_address,
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
status=self.status)
return f"INSERT INTO orders ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params
def select_sql(self, condition="AND", params_format="list"):
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant,
from_address=self.from_address, to_address=self.to_address,
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
status=self.status)
return f"SELECT id, name, phone, email, wallet_address, payment_method FROM orders WHERE {params_sql}", params
def exists_sql(self, condition="AND", params_format="list"):
params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ",
order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant,
from_address=self.from_address, to_address=self.to_address,
create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp,
status=self.status)
return f"SELECT id FROM orders WHERE {params_sql} LIMIT 1", params

View File

@ -1,5 +1,8 @@
import loguru
from custom_decorators import singleton from custom_decorators import singleton
from database import Database from database import Database
from loguru import logger
from utils.datetime import current_timestamp from utils.datetime import current_timestamp
@ -8,14 +11,16 @@ class OrderRepository:
def __init__(self, config): def __init__(self, config):
self.db = Database(config['MYSQL']) self.db = Database(config['MYSQL'])
def create(self, order_id, quant, from_address, to_address): def create(self, order):
timestamp = current_timestamp() timestamp = current_timestamp()
order.create_timestamp = timestamp
order.update_timestamp = timestamp
sql, params = order.insert_sql()
logger.debug(sql)
logger.debug(params)
try: try:
self.db.execute_query( cursor = self.db.execute_query(sql, params)
"INSERT INTO orders (order_id, quant, from_address, to_address, create_timestamp, update_timestamp) " cursor.close()
"VALUES (%s, %s, %s, %s, %s, %s)",
[order_id, quant, from_address, to_address, timestamp, timestamp]
)
self.db.commit() self.db.commit()
return timestamp return timestamp
except Exception: except Exception:
@ -34,7 +39,19 @@ class OrderRepository:
raise raise
def get_order_info(self, order_id): def get_order_info(self, order_id):
self.db.execute_query("SELECT quant, from_address, to_address, create_timestamp " sql = 'SELECT quant, from_address, to_address, create_timestamp FROM orders WHERE order_id = %s'
"FROM orders " logger.debug(f'getting order {order_id} info')
"WHERE order_id = %s", cursor = self.db.execute_query(sql, [order_id])
[order_id]) result = cursor.fetchone()
cursor.close()
logger.debug(f'order {order_id} info: {result}')
return result
def query(self, order, offset, limit):
select_sql, params = order.select_sql()
select_sql = f"{select_sql} LIMIT %s OFFSET %s"
params = params + [limit, offset]
cursor = self.db.execute_query(select_sql, params)
result = cursor.fetchmany(limit)
cursor.close()
return result

View File

@ -1,6 +1,7 @@
import uuid import uuid
from custom_decorators import singleton from custom_decorators import singleton
from models import Order
from repositories.order import OrderRepository from repositories.order import OrderRepository
from services.payment import PaymentService 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
@ -13,13 +14,18 @@ class OrderService:
self.payment_service = PaymentService(config.APIKey.tronscan) self.payment_service = PaymentService(config.APIKey.tronscan)
self.order_repo = OrderRepository(config) self.order_repo = OrderRepository(config)
def create_order(self, quant, address): def queryOrder(self, name, phone, email, wallet_address, offset, limit):
orders = self.order_repo.query(Order(name=name, phone=phone, email=email, from_address=wallet_address),
offset, limit)
return orders
def create_order(self, name, phone, email, quant, wallet_address):
date_str = current().strftime('%Y%m%d%H%M%S') date_str = current().strftime('%Y%m%d%H%M%S')
unique_id = str(uuid.uuid4()).split('-')[0] unique_id = str(uuid.uuid4()).split('-')[0]
order_id = f"{date_str}-{unique_id}" order_id = f"{date_str}-{unique_id}"
order = Order(order_id=order_id, name=name, phone=phone, email=email, quant=quant,
create_timestamp = self.order_repo.create(order_id, quant, from_address=wallet_address, to_address=self.config['PaymentAddresses']['usdt'])
address, self.config['PaymentAddresses']['usdt']) create_timestamp = self.order_repo.create(order)
return order_id, create_timestamp return order_id, create_timestamp
def finish_order(self, order_id): def finish_order(self, order_id):

View File

@ -9,6 +9,8 @@ class PaymentService:
self.tronscan = Tronscan(api_key) self.tronscan = Tronscan(api_key)
def check_payment(self, quant, from_address, to_address, order_create_timestamp, end_timestamp=None): def check_payment(self, quant, from_address, to_address, order_create_timestamp, end_timestamp=None):
# # 删除测试代码
# return 1, 1
if end_timestamp is None: if end_timestamp is None:
end_timestamp = current_timestamp() end_timestamp = current_timestamp()
result = self.tronscan.token_trc20_transfers(limit=100, result = self.tronscan.token_trc20_transfers(limit=100,

View File

@ -14,4 +14,4 @@ class UserService:
users = self.user_repo.get_or_create(User(name=name, phone=phone, email=email)) users = self.user_repo.get_or_create(User(name=name, phone=phone, email=email))
addresses = set(user.address for user in users if user.address) addresses = set(user.address for user in users if user.address)
return list(addresses) return list(addresses)
raise ValueError('A phone number, email, or address is required.') return []

View File

@ -25,8 +25,8 @@ def is_time_difference_greater_than(timestamp1, timestamp2, hours=0, minutes=0,
bool: 如果时间差大于指定的小时分钟和秒数返回True否则返回False bool: 如果时间差大于指定的小时分钟和秒数返回True否则返回False
""" """
# 将时间戳转换为 datetime 对象 # 将时间戳转换为 datetime 对象
time1 = datetime.fromtimestamp(timestamp1) / 1000.0 time1 = datetime.datetime.fromtimestamp(timestamp1 / 1000.0)
time2 = datetime.fromtimestamp(timestamp2) / 1000.0 time2 = datetime.datetime.fromtimestamp(timestamp2 / 1000.0)
# 计算时间差 # 计算时间差
time_difference = abs(time2 - time1) time_difference = abs(time2 - time1)

View File

@ -1 +0,0 @@
.el-card[data-v-0f66bda2] .el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color)}.description[data-v-0f66bda2]{margin-bottom:15px;padding:10px 20px 12px;color:#0d236d;-webkit-text-size-adjust:none;background:rgba(52,100,255,.1);border:1px solid rgba(52,100,255,.3);font:12px Microsoft YaHei,Arial}.description p.title[data-v-0f66bda2]{line-height:30px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,17 @@
.custom-alert {
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: rgba(0, 0, 0, 0.8);
color: white;
padding: 15px 30px;
border-radius: 5px;
font-size: 16px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
z-index: 1000;
opacity: 0;
transition: opacity 0.3s ease-in-out;
text-align: center;
}

View File

@ -6,8 +6,10 @@
<title>Recharge Page</title> <title>Recharge Page</title>
<link href="/css/modules.fdcec670.css" rel="stylesheet"/> <link href="/css/modules.fdcec670.css" rel="stylesheet"/>
<link rel="stylesheet" href="/css/styles.css"/> <link rel="stylesheet" href="/css/styles.css"/>
<link rel="preload" href="/index.js" as="script"> <link rel="stylesheet" href="/css/customAlert.css"/>
<script src="/index.js"></script> <link rel="preload" href="/js/index.js" as="script">
<script src="/js/index.js"></script>
<script src="/js/customAlert.js"></script>
</head> </head>
<body> <body>
<div class="container"> <div class="container">
@ -115,7 +117,8 @@
<label for="wallet">Wallet address:</label> <label for="wallet">Wallet address:</label>
<input type="text" id="wallet" placeholder="Enter your wallet address."> <input type="text" id="wallet" placeholder="Enter your wallet address.">
</div> </div>
<button type="button" onclick="handleSubmit()">Gain Points Now!!!</button> <button type="button" onclick="handleSubmit()" id="createOrder" style="background-color: orange;">Gain Points Now!!!</button>
<button type="button" onclick="handleQuery()" style="margin-top: 1vh;">Query My Order</button>
</form> </form>
</div> </div>
@ -149,6 +152,16 @@
</div> </div>
</div> </div>
</div> </div>
<div id="alertModal" class="modal" style="display: none;">
<div class="modal-content">
<div class="modal-header" id="alertMessage">
</div>
<div class="modal-footer">
<button onclick="closeAlertModal()">Close</button>
</div>
</div>
</div>
<div id="customAlert" class="custom-alert"></div>
<script> <script>
function copyText(text) { function copyText(text) {
navigator.clipboard.writeText(text).then(() => { navigator.clipboard.writeText(text).then(() => {

View File

@ -1,177 +0,0 @@
<html lang="en" class=" ">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
<title>余额充值 - API管理平台</title>
<link href="/css/modules.fdcec670.css" rel="stylesheet" />
<link href="/css/app.f2b97341.css" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="/css/admin-system-adminMoneyRecharge.5cf4644c.css"
<link rel="stylesheet" type="text/css" href="/css/styles.css"/>
<link rel="preload" href="/index.js" as="script">
</head>
<body inmaintabuse="1" data-layout="default">
<div id="app" class="aminui" data-v-app="">
<section class="aminui-wrapper">
<div class="aminui-body el-container">
<div class="adminui-main" id="adminui-main">
<main class="el-main" data-v-0f66bda2="">
<div class="el-card is-always-shadow" data-v-0f66bda2="">
<div class="el-card__header">
<div class="card-header" data-v-0f66bda2="">
<span data-v-0f66bda2="">充值</span>
</div>
</div>
<div class="el-card__body" style="">
<div class="el-scrollbar table-form-scrollbar" data-v-0f66bda2="">
<div class="el-scrollbar__wrap el-scrollbar__wrap--hidden-default">
<div class="el-scrollbar__view" style="">
<div data-v-0f66bda2="">
<section class="description" data-v-0f66bda2="">
<p class="title" data-v-0f66bda2="">温馨提示:</p>
<p data-v-0f66bda2="">
1、目前仅支持USDT充值充值的金额不支持提现
</p>
<p data-v-0f66bda2="">
2、金额会在支付后1分钟内到账如果5分钟未到账请联系客服
</p>
<p data-v-0f66bda2="" style="color: red">
3、实际转账金额必须与支付页面显示金额一致否则无法到账
</p>
</section>
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
<label id="el-id-7163-5" for="el-id-7163-12" class="el-form-item__label">Payment method:</label>
<div class="el-form-item__content">
<i class="el-icon"
data-v-0f66bda2=""
style="font-size: 30px">
<svg
t="1693061019040"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="4072"
width="200"
height="200"
data-v-0f66bda2="">
<path
d="M1023.082985 511.821692c0 281.370746-228.08199 509.452736-509.452736 509.452736-281.360557 0-509.452736-228.08199-509.452737-509.452736 0-281.365652 228.092179-509.452736 509.452737-509.452737 281.370746 0 509.452736 228.087085 509.452736 509.452737"
fill="#1BA27A"
p-id="4073"></path>
<path
d="M752.731701 259.265592h-482.400796v116.460896h182.969951v171.176119h116.460895v-171.176119h182.96995z"
fill="#FFFFFF"
p-id="4074"></path>
<path
d="M512.636816 565.13592c-151.358408 0-274.070289-23.954468-274.070289-53.50782 0-29.548259 122.706786-53.507821 274.070289-53.507821 151.358408 0 274.065194 23.959562 274.065194 53.507821 0 29.553353-122.706786 53.507821-274.065194 53.50782m307.734925-44.587303c0-38.107065-137.776398-68.995184-307.734925-68.995184-169.953433 0-307.74002 30.888119-307.74002 68.995184 0 33.557652 106.837333 61.516418 248.409154 67.711363v245.729433h116.450707v-245.632637c142.66205-6.001353 250.615085-34.077294 250.615084-67.808159"
fill="#FFFFFF"
p-id="4075"></path>
</svg>
</i>
<div data-v-0f66bda2="" style="margin-left: 20px">
<div class="el-radio-group" role="radiogroup" aria-labelledby="el-id-7163-5" data-v-0f66bda2="" id="el-id-7163-12">
<label class="el-radio is-bordered is-checked el-radio--default" data-v-0f66bda2="">
<span class="el-radio__input is-checked">
<input class="el-radio__original" name="el-id-7163-6" type="radio" value="30" onclick="setAmountValue(this.value)"/>
<span class="el-radio__inner"></span>
</span>
<span class="el-radio__label">30$</span>
</label>
<label class="el-radio is-bordered el-radio--default" data-v-0f66bda2="">
<span class="el-radio__input">
<input class="el-radio__original" name="el-id-7163-6" type="radio" value="90" onclick="setAmountValue(this.value)"/>
<span class="el-radio__inner"></span>
</span>
<span class="el-radio__label">90$</span>
</label>
<label class="el-radio is-bordered el-radio--default" data-v-0f66bda2="">
<span class="el-radio__input">
<input class="el-radio__original" name="el-id-7163-6" type="radio" value="150" onclick="setAmountValue(this.value)"/>
<span class="el-radio__inner"></span>
</span>
<span class="el-radio__label">150$</span>
</label>
</div>
</div>
</div>
</div>
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
<label id="amount_label" for="amount_input" class="el-form-item__label">Amount:</label>
<div class="el-form-item__content">
<div class="el-input el-input--default" data-v-0f66bda2="" style="width: 7em">
<div class="el-input__wrapper">
<input class="el-input__inner" type="number" min="30" step="any" autocomplete="off" tabindex="0"
id="amount_input" value="30"/>
</div>
</div>USDT
</div>
</div>
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
<label id="name_label" for="name_input" class="el-form-item__label">Name:</label>
<div class="el-form-item__content">
<div class="el-input el-input--default" data-xv-0f66bda2="">
<div class="el-input__wrapper">
<input class="el-input__inner" type="text" autocomplete="off" tabindex="0" placeholder="Please enter your Nickname." id="name_input"/>
</div>
</div>
</div>
</div>
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
<label id="phone_label" for="phone_input" class="el-form-item__label">Phone:</label>
<div class="el-form-item__content">
<div class="el-input el-input--default" data-v-0f66bda2="">
<div class="el-input__wrapper">
<input class="el-input__inner" type="tel" autocomplete="off" tabindex="0" placeholder="Please enter your phone number." id="phone_input"/>
</div>
</div>
</div>
</div>
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
<label id="email_label" for="email_input" class="el-form-item__label">Email:</label>
<div class="el-form-item__content">
<div class="el-input el-input--default" data-v-0f66bda2="">
<div class="el-input__wrapper">
<input class="el-input__inner" type="email" autocomplete="off" tabindex="0" placeholder="Please enter your email." id="email_input"/>
</div>
</div>
</div>
</div>
<div class="el-form-item el-form-item--default" data-v-0f66bda2="">
<label id="address_label" for="address_input" class="el-form-item__label">Wallet address:</label>
<div class="el-form-item__content">
<div class="el-input el-input--default" data-v-0f66bda2="">
<div class="el-input__wrapper">
<input class="el-input__inner" type="text" autocomplete="off" tabindex="0" placeholder="Please enter your wallet address." id="address_input"/>
</div>
</div>
</div>
</div>
<button class="el-button el-button--primary el-button--default" type="button" data-v-0f66bda2="" onclick="handleSubmit()">
<span class="">Gain Points Now!!!</span>
</button>
</div>
</div>
</div>
<div class="el-scrollbar__bar is-horizontal" style="display: none">
<div class="el-scrollbar__thumb" style="transform: translateX(0%)"></div>
</div>
<div class="el-scrollbar__bar is-vertical" style="display: none">
<div class="el-scrollbar__thumb" style="transform: translateY(0%)"></div>
</div>
</div>
</div>
</div>
<div class="el-overlay" style="z-index: 2002; display: none">
<div role="dialog" aria-modal="true" aria-label="支付" aria-describedby="el-id-7163-9" class="el-overlay-dialog"></div>
</div>
</main>
</div>
</div>
</section>
</div>
</body>
</html>

View File

@ -0,0 +1,15 @@
function showCustomAlert(message) {
const alertBox = document.getElementById('customAlert');
alertBox.textContent = message;
alertBox.style.display = 'block';
alertBox.style.opacity = '1';
// 3秒后隐藏弹窗
setTimeout(() => {
alertBox.style.opacity = '0';
// 等到过渡效果结束再隐藏元素
setTimeout(() => {
alertBox.style.display = 'none';
}, 300); // 与过渡时间一致
}, 3000);
}

View File

@ -1,3 +1,5 @@
const apiBaseUrl = 'http://127.0.0.1:5000'
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const options = document.querySelectorAll('.el-radio'); const options = document.querySelectorAll('.el-radio');
options.forEach(option => { options.forEach(option => {
@ -37,37 +39,9 @@ document.addEventListener('DOMContentLoaded', () => {
// Close modal when clicking outside the modal content // Close modal when clicking outside the modal content
document.getElementById('addressModal').addEventListener('click', closeModalOnClickOutside); document.getElementById('addressModal').addEventListener('click', closeModalOnClickOutside);
document.getElementById('paymentModal').addEventListener('click', closeModalOnClickOutside); document.getElementById('paymentModal').addEventListener('click', closeModalOnClickOutside);
document.getElementById('alertModal').addEventListener('click', closeModalOnClickOutside);
}); });
function finishOrder() {
const orderID = localStorage.getItem('currentOrderID'); // 获取订单 ID
if (!orderID) {
console.error('Order ID is not available.');
handleError('Order ID is not available. Please create an order first.');
return;
}
const url = `http://127.0.0.1:5000/finishOrder?orderID=${orderID}`;
return fetch(url, {
method: 'GET'
})
.then(response => {
if (!response.ok) {
throw new Error(`Network response was not ok: ${response.statusText}`);
}
return response.json();
})
.then(data => {
console.log('Response data:', data);
return data;
})
.catch(error => {
console.error('There was a problem with the GET request:', error);
throw error;
});
}
function handleOrderSuccess(orderId, amount, orderCreateTimestamp, orderExpirationTime) { function handleOrderSuccess(orderId, amount, orderCreateTimestamp, orderExpirationTime) {
openPaymentModal(orderId, amount, orderCreateTimestamp, orderExpirationTime); openPaymentModal(orderId, amount, orderCreateTimestamp, orderExpirationTime);
@ -77,7 +51,7 @@ function handleOrderSuccess(orderId, amount, orderCreateTimestamp, orderExpirati
function handleMultipleAddresses(walletAddresses) { function handleMultipleAddresses(walletAddresses) {
// Find the modal and the modal body // Find the modal and the modal body
const addressList = document.getElementById('addressList'); const addressList = document.getElementById('addressList');
addressList.innerHTML = ''; // 清空当前内容 addressList.innerHTML = '';
// Create a list of wallet addresses // Create a list of wallet addresses
walletAddresses.forEach(address => { walletAddresses.forEach(address => {
@ -137,6 +111,18 @@ function openAddressModal() {
function closeAddressModal() { function closeAddressModal() {
document.getElementById('addressModal').style.display = 'none'; document.getElementById('addressModal').style.display = 'none';
const addressList = document.getElementById('addressList');
addressList.innerHTML = '';
}
function openAlertModal() {
document.getElementById('alertModal').style.display = 'flex';
}
function closeAlertModal() {
document.getElementById('alertModal').style.display = 'none';
const alertElement = document.getElementById("alertMessage")
alertElement.innerText = "";
} }
function closeModalOnClickOutside(event) { function closeModalOnClickOutside(event) {
@ -168,7 +154,7 @@ function promptUserForAddress() {
async function createOrder(amount, name, phone, email, wallet_address, paymentMethod) { async function createOrder(amount, name, phone, email, wallet_address, paymentMethod) {
try { try {
const response = await fetch('http://127.0.0.1:5000/createOrder', { const response = await fetch(`${apiBaseUrl}/createOrder`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
@ -214,3 +200,60 @@ function handleSubmit() {
// 调用createOrder函数 // 调用createOrder函数
createOrder(amount, name, phone, email, payment_address, "USDT"); createOrder(amount, name, phone, email, payment_address, "USDT");
} }
function finishOrder() {
const orderID = localStorage.getItem('currentOrderID'); // 获取订单 ID
if (!orderID) {
console.error('Order ID is not available.');
handleError('Order ID is not available. Please create an order first.');
return;
}
const url = `${apiBaseUrl}/finishOrder?orderID=${orderID}`;
return fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
})
.then(response => {
if (!response.ok) {
throw new Error(`Network response was not ok: ${response.statusText}`);
}
return response.json();
})
.then(data => {
if (data.status === 0) {
// 订单超时, 联系客服
const alertElement = document.getElementById("alertMessage")
alertElement.innerText = "<h2>The order has timed out. Please contact customer support if you have any questions.</h2>";
openAlertModal();
} else if (data.status === 1) {
const createOrderElement = document.getElementById('createOrder');
createOrderElement.textContent = 'Gain More Points!!!';
} else if (data.status === 3) {
const alertElement = document.getElementById("alertMessage")
alertElement.innerText = "<h2>The payment amount is abnormal. Please contact customer support if you have any questions.</h2>";
openAlertModal();
}
return data;
})
.catch(error => {
console.error('There was a problem with the GET request:', error);
throw error;
});
}
function handleQuery() {
const name = document.getElementById('nickname').value.trim();
const phone = document.getElementById('phone').value.trim();
const email = document.getElementById('email').value.trim();
const payment_address = document.getElementById('wallet').value.trim();
// 清除之前的消息
// document.getElementById('message').classList.add('hidden');
// 调用createOrder函数
queryOrder(name, phone, email, payment_address);
}

View File

@ -2,7 +2,7 @@
"name": "payment_headend", "name": "payment_headend",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "js/index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>