"""支付成功后的统一业务处理(基于 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