Files
kami_spider_monorepo/apps/jd/router/app_store.py
danial 6c768b6e7b feat(jd): 添加京东相关路由及苹果权益充值功能
- 新增jd模块基础路由,整合app_store和payment子路由
- 实现苹果权益充值接口,支持苹果、携程及沃尔玛多个渠道
- 实现卡号密码查询接口,支持不同类别订单查询
- 新增短信认证相关接口,实现短信验证码发送及短信登录
- 新增商品管理接口,支持SKU详情查询及账号类下单功能
- 新增订单管理接口,实现订单删除功能
- 实现支付相关接口,增加刷新支付参数功能
- 定义完整请求及响应数据模型,确保接口数据规范
- 编写AppStoreSpider类,封装苹果应用内订单处理逻辑
- 引入多种代理池及请求重试机制,增强接口稳定性
- 添加详细日志记录,便于请求追踪与错误排查
2025-11-03 19:35:39 +08:00

217 lines
8.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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:
# 10010164405229636
# 20010164405699325
# 30010164405273963
# 50010164404344795
# 20010155862962901
# 30010155867355510
# 50010155863307550
# 100010155867606890
# 100010164403489305
# 100010157256668464
# 50010157256668463
# 30010157256668462
# 20010157256668461
# 10010157256668460
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="查询异常")