from typing import Any import traceback from fastapi import APIRouter from fastapi.concurrency import run_in_threadpool from apps.jd.schemas.models import ( AppStoreRequest, AppleStoreRequestCategoryEnum, PlatPayResponseData, QueryCardRequest, QueryCardResponseData, ) from apps.jd.services.app_store import AppStoreSpider from apps.jd.services.ctrip import XiechengCardSpider from apps.shared.proxy_pool.proxy_pool import ProxyPoolFactory from core.config import ProxyPoolType from core.responses import ApiResponse, BusinessCode, error, success from observability.logging import LoggerAdapter, get_logger_with_trace router = APIRouter(prefix="/jd", tags=["苹果权益充值"]) logger: LoggerAdapter = get_logger_with_trace(__name__) @router.post("/app/store", response_model=ApiResponse[PlatPayResponseData]) async def app_store( request_data: AppStoreRequest, ) -> ApiResponse[PlatPayResponseData] | ApiResponse[Any]: """苹果权益充值""" # 接收参数 order_num = request_data.order_num cookies = request_data.cookies.strip() res = {} try: match request_data.category: case AppleStoreRequestCategoryEnum.Apple: return error(code=BusinessCode.NOT_IMPLEMENTED) # app_store_ = AppStoreSpider( # cookies=cookies, # face_price=request_data.face_price, # order_num=order_num, # ) # code, res, msg = await run_in_threadpool(app_store_.run) # logger.info(msg=f"订单ID:{order_num},最终返回日志:{res}") # return success(data=res, message=msg) case AppleStoreRequestCategoryEnum.CTrip: # 100:10164405229636 # 200:10164405699325 # 300:10164405273963 # 500:10164404344795 # 200:10155862962901 # 300:10155867355510 # 500:10155863307550 # 1000:10155867606890 # 1000:10164403489305 # 1000:10157256668464 # 500:10157256668463 # 300:10157256668462 # 200:10157256668461 # 100:10157256668460 skus = { 10.0: "10186761790338", 20.0: "10157199199546", 100.0: "10157256668460", 200.0: "10155862962901", 300.0: "10164405273963", 500.0: "10164404344795", 1000.0: "10155867606890", 102.0: "10157256668460", 308.0: "10155867355510", 520: "10155863307550", 1026: "10155867606890", } if request_data.face_price not in skus: return error( code=BusinessCode.JD_ORDER_FACE_PRICE_ERR, data=PlatPayResponseData( **{ "deeplink": "", "order_id": "", "pay_id": "", "remark": "不支持的充值面额", "face_price": 0, } ), message="不支持的充值金额", ) try: c_trip_spider = XiechengCardSpider( cookies=cookies, order_num=order_num, sku_id=skus[request_data.face_price], ) code, res = await run_in_threadpool(c_trip_spider.run) if code == BusinessCode.SUCCESS: return success(data=res) return error(code=code, data=res, message="请求完成") except Exception as e: logger.error(f"请求失败:{traceback.format_exc()}") return error( code=BusinessCode.INTERNAL_ERROR, data={ "deeplink": "", "order_id": "", "pay_id": "", "remark": str(e), }, ) case AppleStoreRequestCategoryEnum.Walmart: skus = { 100.0: "10140177420168", 200.0: "10140177579817", 300.0: "10140177668026", 500.0: "10140177784201", 1000.0: "10140177806944", } if request_data.face_price not in skus: return error( code=BusinessCode.JD_ORDER_FACE_PRICE_ERR, data={}, message="不支持的充值金额", ) try: code = BusinessCode.INTERNAL_ERROR for i in range(3): c_trip_spider = XiechengCardSpider( cookies=cookies, order_num=order_num, sku_id=skus[request_data.face_price], ) code, res = await run_in_threadpool(c_trip_spider.run) if code == BusinessCode.JD_ORDER_RISK_ERR: proxy_pool = ProxyPoolFactory.get_proxy_pool( ProxyPoolType.EXPIRING, expire_time=60 ) proxy = proxy_pool.get_proxy(order_id=order_num) if proxy: proxy_pool.remove_invalid_proxy(proxy) break if code == BusinessCode.SUCCESS: return success(data=res) return error(code=code, data=res, message="请求完成") except Exception as e: logger.error(f"请求失败:{traceback.format_exc()}") return error( code=BusinessCode.INTERNAL_ERROR, data={ "deeplink": "", "order_id": "", "pay_id": "", "remark": str(e), }, ) except Exception as e: logger.error(f"请求失败:{traceback.format_exc()}") return error( code=BusinessCode.INTERNAL_ERROR, data={ "deeplink": "", "order_id": "", "pay_id": "", "remark": str(e), }, message="请求完成", ) @router.post("/query/card", response_model=ApiResponse[QueryCardResponseData]) async def query_card(request_data: QueryCardRequest): """查卡密""" cookies = request_data.cookies.strip() # 打印参数日志 logger.info(f"订单:{request_data}") try: match request_data.category: case AppleStoreRequestCategoryEnum.Apple: app_store_ = AppStoreSpider( cookies=cookies, order_num=request_data.jd_order_id ) code, res = await run_in_threadpool( app_store_.query_card, request_data.jd_order_id ) logger.info( f"订单号:{request_data.order_id},订单ID:{request_data.jd_order_id},最终返回日志:{res}" ) if code == BusinessCode.SUCCESS: return success(data=res) return error(code=code, data=res, message="查询完成") case ( AppleStoreRequestCategoryEnum.CTrip | AppleStoreRequestCategoryEnum.Walmart ): c_trip_spider = XiechengCardSpider( cookies=cookies, order_num=request_data.jd_order_id, sku_id=request_data.order_id, ) code, res = await run_in_threadpool( c_trip_spider.get_locdetails, request_data.jd_order_id ) logger.info( f"订单号:{request_data.order_id},订单ID:{request_data.jd_order_id},最终返回日志:{res}" ) if code == BusinessCode.SUCCESS: return success(data=res) return error(code=code, data=res, message="查询完成") return error(code=BusinessCode.JD_ORDER_RISK_ERR, data=None, message="查询失败") except Exception as e: logger.error(f"查询卡密失败: {traceback.format_exc()}") return error(code=BusinessCode.INTERNAL_ERROR, data=None, message="查询异常")