Spaces:
Runtime error
Runtime error
远兮
commited on
Commit
·
1532712
1
Parent(s):
ff0163b
添加支付订单、订单中心api
Browse files- chatgpt-next-web/service.py +118 -3
chatgpt-next-web/service.py
CHANGED
@@ -171,6 +171,123 @@ def logout():
|
|
171 |
return jsonify({'code': 0, 'message': 'Logout successful'})
|
172 |
|
173 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
174 |
# 购买支付套餐
|
175 |
@app.route('/purchase', methods=['POST'])
|
176 |
def purchase():
|
@@ -374,10 +491,8 @@ def generate_token(user_id, username):
|
|
374 |
# 验证令牌
|
375 |
def validate_token(token):
|
376 |
try:
|
377 |
-
print("validate_token", "token:", token)
|
378 |
# 使用密钥进行解码
|
379 |
payload = jwt.decode(token, SECERT_KEY, algorithms=['HS256'])
|
380 |
-
print("validate_token", "payload:", payload)
|
381 |
|
382 |
# 检查令牌的过期时间
|
383 |
if 'exp' in payload and nowtime() > datetime.datetime.fromtimestamp(payload['exp']):
|
@@ -385,7 +500,7 @@ def validate_token(token):
|
|
385 |
|
386 |
if 'user_id' not in payload or 'username' not in payload:
|
387 |
return False
|
388 |
-
|
389 |
return True
|
390 |
except (jwt.DecodeError, jwt.InvalidTokenError):
|
391 |
return False
|
|
|
171 |
return jsonify({'code': 0, 'message': 'Logout successful'})
|
172 |
|
173 |
|
174 |
+
@app.route('/create_order', methods=['POST'])
|
175 |
+
def create_order():
|
176 |
+
# 从请求中获取套餐ID和用户令牌
|
177 |
+
package_id = request.json.get('package_id')
|
178 |
+
token = parse_token(request)
|
179 |
+
|
180 |
+
# 验证令牌
|
181 |
+
if not validate_token(token):
|
182 |
+
return jsonify({'code': 401, 'message': 'Invalid token'})
|
183 |
+
|
184 |
+
# 根据套餐ID获取套餐信息
|
185 |
+
package = pay_package.get_package_by_id(package_id)
|
186 |
+
if not package:
|
187 |
+
return jsonify({'code': 400, 'message': 'Invalid package ID'})
|
188 |
+
|
189 |
+
# 获取用户ID
|
190 |
+
user_id = get_user_id_from_token(token)
|
191 |
+
if not user_id:
|
192 |
+
return jsonify({'code': 400, 'message': 'User not found'})
|
193 |
+
# 创建订单
|
194 |
+
order_id = str(uuid.uuid4())
|
195 |
+
order_data = {
|
196 |
+
'order_id': order_id,
|
197 |
+
'user_id': user_id,
|
198 |
+
'package_id': package_id,
|
199 |
+
'amount': package['price'],
|
200 |
+
'status': 'pending', # 订单状态设置为待支付
|
201 |
+
'created_at': nowtime().strftime('%Y-%m-%d %H:%M:%S') # 将时间转换为字符串格式保存
|
202 |
+
}
|
203 |
+
# 将订单信息存储到Redis,并设置过期时间为2小时
|
204 |
+
order_key = f'order:{user_id}:{order_id}'
|
205 |
+
redis.hmset(order_key, order_data)
|
206 |
+
redis.expire(order_key, datetime.timedelta(hours=2))
|
207 |
+
|
208 |
+
return jsonify({
|
209 |
+
'code': 0,
|
210 |
+
'message': 'Order created',
|
211 |
+
'data': {
|
212 |
+
'order_id': order_id,
|
213 |
+
'amount': package['price']
|
214 |
+
}
|
215 |
+
})
|
216 |
+
|
217 |
+
|
218 |
+
@app.route('/order_center', methods=['POST'])
|
219 |
+
def order_center():
|
220 |
+
token = parse_token(request)
|
221 |
+
|
222 |
+
# 验证令牌
|
223 |
+
if not validate_token(token):
|
224 |
+
return jsonify({'code': 401, 'message': 'Invalid token'})
|
225 |
+
|
226 |
+
# 获取用户ID
|
227 |
+
user_id = get_user_id_from_token(token)
|
228 |
+
if not user_id:
|
229 |
+
return jsonify({'code': 400, 'message': 'User not found'})
|
230 |
+
|
231 |
+
# 获取用户的所有订单
|
232 |
+
user_orders = get_user_orders(user_id)
|
233 |
+
|
234 |
+
print(user_orders)
|
235 |
+
|
236 |
+
# 获取该用户的有效订单列表
|
237 |
+
valid_orders = [
|
238 |
+
order for order in user_orders
|
239 |
+
if not is_order_expired(order)
|
240 |
+
]
|
241 |
+
|
242 |
+
print(valid_orders)
|
243 |
+
return jsonify({
|
244 |
+
'code': 0,
|
245 |
+
'message': 'Order center',
|
246 |
+
'data': {
|
247 |
+
'user_orders': valid_orders
|
248 |
+
}
|
249 |
+
})
|
250 |
+
|
251 |
+
|
252 |
+
def get_user_orders(user_id):
|
253 |
+
# 从Redis中获取该用户的所有订单数据
|
254 |
+
user_orders = []
|
255 |
+
for key in redis.scan_iter(f'order:{user_id}:*'): # 修改获取键的方式
|
256 |
+
order_data = redis.hgetall(key)
|
257 |
+
# 将bytes类型的键和值转换为str类型
|
258 |
+
order_data_str = {
|
259 |
+
k.decode('utf-8'): v.decode('utf-8') for k, v in order_data.items()
|
260 |
+
}
|
261 |
+
user_orders.append(order_data_str)
|
262 |
+
return user_orders
|
263 |
+
|
264 |
+
|
265 |
+
def is_order_expired(order_data):
|
266 |
+
print("is_order_expired", order_data)
|
267 |
+
# 获取订单创建时间
|
268 |
+
created_at_str = order_data.get('created_at')
|
269 |
+
if not created_at_str:
|
270 |
+
print("created_at_str is None")
|
271 |
+
return True
|
272 |
+
|
273 |
+
# 将订单创建时间转换为datetime对象
|
274 |
+
created_at = datetime.datetime.strptime(
|
275 |
+
created_at_str,
|
276 |
+
'%Y-%m-%d %H:%M:%S'
|
277 |
+
)
|
278 |
+
|
279 |
+
# 订单有效期为2小时
|
280 |
+
expiration_time = datetime.timedelta(hours=2)
|
281 |
+
|
282 |
+
# 获取当前时间
|
283 |
+
current_time = nowtime()
|
284 |
+
|
285 |
+
print(current_time, created_at, expiration_time)
|
286 |
+
|
287 |
+
# 检查时间差是否超过订单有效期
|
288 |
+
return (current_time - created_at) >= expiration_time
|
289 |
+
|
290 |
+
|
291 |
# 购买支付套餐
|
292 |
@app.route('/purchase', methods=['POST'])
|
293 |
def purchase():
|
|
|
491 |
# 验证令牌
|
492 |
def validate_token(token):
|
493 |
try:
|
|
|
494 |
# 使用密钥进行解码
|
495 |
payload = jwt.decode(token, SECERT_KEY, algorithms=['HS256'])
|
|
|
496 |
|
497 |
# 检查令牌的过期时间
|
498 |
if 'exp' in payload and nowtime() > datetime.datetime.fromtimestamp(payload['exp']):
|
|
|
500 |
|
501 |
if 'user_id' not in payload or 'username' not in payload:
|
502 |
return False
|
503 |
+
|
504 |
return True
|
505 |
except (jwt.DecodeError, jwt.InvalidTokenError):
|
506 |
return False
|