87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
"""支付成功后的统一业务处理(基于 SDK)"""
|
||
import logging
|
||
|
||
from .pb import get_pb_client
|
||
from .memos import create_memos_user
|
||
|
||
# 已处理订单(防重复)
|
||
processed_orders: set[str] = set()
|
||
|
||
|
||
def parse_order_id(order_id: str) -> tuple[str, str]:
|
||
"""从 order_id 解析 user_id 和 pay_type"""
|
||
if "_order_" not in order_id:
|
||
return "", "unknown"
|
||
prefix = order_id.split("_order_")[0]
|
||
if "_" in prefix:
|
||
parts = prefix.rsplit("_", 1)
|
||
return parts[0], parts[1].lower()
|
||
return prefix, "unknown"
|
||
|
||
|
||
def handle_payment_success(
|
||
order_id: str,
|
||
pay_price: str,
|
||
provider_name: str,
|
||
*,
|
||
use_memos: bool = False,
|
||
):
|
||
"""
|
||
支付成功后的统一业务处理
|
||
:param use_memos: 是否创建 Memos 用户,仅 nomadvip 为 True
|
||
"""
|
||
user_id, pay_type = parse_order_id(order_id)
|
||
if not user_id:
|
||
return
|
||
|
||
print(f"支付成功 [{provider_name}] 用户ID: {user_id},类型: {pay_type},订单: {order_id}")
|
||
|
||
if pay_type == "vip" and use_memos:
|
||
create_memos_user(user_id)
|
||
|
||
if pay_type == "meetup":
|
||
logging.info(f"meetup 类型支付成功,不创建 memos 用户 - user_id: {user_id}")
|
||
|
||
valid_types = ["vip", "book", "meetup", "video"]
|
||
if pay_type not in valid_types:
|
||
pay_type = "vip"
|
||
|
||
amount_cents = int(float(pay_price or 0) * 100)
|
||
|
||
try:
|
||
pb_client = get_pb_client()
|
||
if pay_type == "meetup":
|
||
solan = pb_client.collection("solan")
|
||
existing = solan.get_list(1, 1, {
|
||
"filter": f'user_id = "{user_id}"',
|
||
"sort": "-created",
|
||
})
|
||
if existing.items:
|
||
record_id = existing.items[0].id
|
||
solan.update(record_id, {
|
||
"type": "meetup",
|
||
"order_id": order_id,
|
||
"amount": amount_cents,
|
||
})
|
||
logging.info(f"meetup 支付字段补齐成功 - user_id: {user_id}, record_id: {record_id}")
|
||
else:
|
||
solan.create({
|
||
"user_id": user_id,
|
||
"type": "meetup",
|
||
"order_id": order_id,
|
||
"amount": amount_cents,
|
||
})
|
||
logging.info(f"meetup 完整记录创建(兜底) - user_id: {user_id}")
|
||
else:
|
||
pb_client.collection("payments").create({
|
||
"user_id": user_id,
|
||
"type": pay_type,
|
||
"order_id": order_id,
|
||
"amount": amount_cents,
|
||
})
|
||
processed_orders.add(order_id)
|
||
except Exception as e:
|
||
print(f"PocketBase 操作失败: {e}")
|
||
logging.error(f"PocketBase 操作失败 - order_id: {order_id}, error: {e}")
|
||
raise
|