函数中异常处理及proxy池相关代码结构,提升容错性
- 优化XiechengCardSpider初始化调用顺序,提前获取x_token - 修正部分日志打印格式,统一异常日志输出 - 更新代理服务器默认请求地址,移除多余参数
This commit is contained in:
@@ -116,7 +116,10 @@ async def app_store(
|
||||
except Exception as e:
|
||||
logger.error(f"请求失败:{traceback.format_exc()}")
|
||||
return error(code=BusinessCode.INTERNAL_ERROR, message=str(e))
|
||||
return error(code=BusinessCode.JD_ORDER_RISK_ERR, message=err.message if err else "风控")
|
||||
return error(
|
||||
code=BusinessCode.JD_ORDER_RISK_ERR,
|
||||
message=err.message if err else "风控",
|
||||
)
|
||||
case AppleStoreRequestCategoryEnum.Walmart:
|
||||
skus = {
|
||||
100.0: "10140177420168",
|
||||
@@ -131,31 +134,36 @@ async def app_store(
|
||||
data={},
|
||||
message="不支持的充值金额",
|
||||
)
|
||||
try:
|
||||
code = BusinessCode.INTERNAL_ERROR
|
||||
for i in range(2):
|
||||
err = None
|
||||
for _ in range(2):
|
||||
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.JD_ORDER_RISK_ERR:
|
||||
if code == BusinessCode.SUCCESS:
|
||||
return success(data=res)
|
||||
return error(code=code, data=res, message="请求完成")
|
||||
except JDServiceException as e:
|
||||
err = e
|
||||
if e.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,
|
||||
)
|
||||
continue
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"请求失败:{traceback.format_exc()}")
|
||||
return error(code=BusinessCode.INTERNAL_ERROR, message=str(e))
|
||||
return error(
|
||||
code=BusinessCode.JD_ORDER_RISK_ERR,
|
||||
message=err.message if err else "风控",
|
||||
)
|
||||
except JDServiceException:
|
||||
raise
|
||||
except Exception as e:
|
||||
@@ -192,21 +200,41 @@ async def query_card(request_data: QueryCardRequest):
|
||||
AppleStoreRequestCategoryEnum.CTrip
|
||||
| AppleStoreRequestCategoryEnum.Walmart
|
||||
):
|
||||
c_trip_spider = XiechengCardSpider(
|
||||
cookies=cookies,
|
||||
order_num=request_data.jd_order_id,
|
||||
sku_id=request_data.order_id,
|
||||
err = None
|
||||
for _ in range(2):
|
||||
try:
|
||||
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)
|
||||
except JDServiceException as e:
|
||||
err = e
|
||||
if e.code == BusinessCode.JD_ORDER_RISK_ERR:
|
||||
proxy_pool = ProxyPoolFactory.get_proxy_pool(
|
||||
ProxyPoolType.EXPIRING, expire_time=60
|
||||
)
|
||||
proxy = proxy_pool.get_proxy(order_id=request_data.order_id)
|
||||
if proxy:
|
||||
proxy_pool.remove_invalid_proxy(proxy)
|
||||
continue
|
||||
except Exception as e:
|
||||
logger.error(f"请求失败:{traceback.format_exc()}")
|
||||
return error(
|
||||
code=BusinessCode.INTERNAL_ERROR,
|
||||
)
|
||||
return error(
|
||||
code=BusinessCode.JD_ORDER_RISK_ERR,
|
||||
message=err.message if err else "风控",
|
||||
)
|
||||
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="查询异常")
|
||||
|
||||
@@ -10,6 +10,9 @@ from apps.jd.schemas.models import (
|
||||
)
|
||||
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.exceptions import JDServiceException
|
||||
from core.responses import ApiResponse, BusinessCode, success, error
|
||||
from observability.logging import get_logger_with_trace
|
||||
|
||||
@@ -58,16 +61,9 @@ async def refresh_payment(request_data: RefreshPaymentRequest):
|
||||
logger.info(
|
||||
f"获取微信app端支付参数 cookie:{request_data.cookies} order_id:{request_data.order_id} pay_id:{request_data.pay_id} user_order_id:{request_data.user_order_id}"
|
||||
)
|
||||
# data = {
|
||||
# "deeplink": "weixin://wap/pay?prepayid%3Dwx11141602253864f3a03c1c654daa820001&package=3012187903&noncestr=1760163364&sign=b8e94df5e28a10e0938d84e322161882",
|
||||
# "order_id": "339328433580",
|
||||
# "pay_id": "652e4edb825348e78f692c17ef1bc8b9",
|
||||
# "face_price": 0
|
||||
# }
|
||||
# return my_json(code=100, data=data, msg="请求完成")
|
||||
res = {}
|
||||
try:
|
||||
for i in range(3):
|
||||
for i in range(3):
|
||||
try:
|
||||
c_trip_spider = XiechengCardSpider(
|
||||
cookies=request_data.cookies,
|
||||
order_num=request_data.user_order_id,
|
||||
@@ -78,19 +74,22 @@ async def refresh_payment(request_data: RefreshPaymentRequest):
|
||||
request_data.pay_id,
|
||||
request_data.order_id,
|
||||
)
|
||||
if code == BusinessCode.JD_ORDER_RISK_ERR:
|
||||
continue
|
||||
if code == BusinessCode.SUCCESS:
|
||||
return success(data=res)
|
||||
return error(
|
||||
code=BusinessCode.JD_ORDER_RISK_ERR,
|
||||
data=PlatPayResponseData(**{
|
||||
"deeplink": "",
|
||||
"order_id": "",
|
||||
"pay_id": "",
|
||||
"remark": res.get("remark"),
|
||||
}),
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"请求失败:{traceback.format_exc()}")
|
||||
raise HTTPException(status_code=500, detail="请求失败")
|
||||
except JDServiceException as e:
|
||||
if e.code == BusinessCode.JD_ORDER_RISK_ERR:
|
||||
proxy_pool = ProxyPoolFactory.get_proxy_pool(
|
||||
ProxyPoolType.EXPIRING, expire_time=60
|
||||
)
|
||||
proxy = proxy_pool.get_proxy(order_id=request_data.user_order_id)
|
||||
if proxy:
|
||||
proxy_pool.remove_invalid_proxy(proxy)
|
||||
continue
|
||||
raise e
|
||||
except Exception as e:
|
||||
logger.error(f"请求失败:{traceback.format_exc()}")
|
||||
raise HTTPException(status_code=500, detail="请求失败")
|
||||
return error(
|
||||
code=BusinessCode.JD_ORDER_RISK_ERR,
|
||||
message="风控",
|
||||
)
|
||||
|
||||
@@ -96,7 +96,6 @@ class SmsLoginRequest(BaseModel):
|
||||
class PlatPayResponseData(BaseModel):
|
||||
deeplink: str = Field("", description="微信唤起链接或支付信息")
|
||||
order_id: str = Field("", description="订单号")
|
||||
remark: str | None = Field(None, description="备注")
|
||||
pay_id: str = Field("", description="支付ID")
|
||||
face_price: float = Field(0.0, description="面值")
|
||||
|
||||
@@ -107,4 +106,3 @@ class QueryCardResponseData(BaseModel):
|
||||
order_status: str = Field(..., description="订单状态")
|
||||
card_num: str = Field(..., description="卡号")
|
||||
card_pwd: str = Field(..., description="卡密")
|
||||
remark: str = Field(default="", description="备注")
|
||||
@@ -30,6 +30,7 @@ class XiechengCardSpider:
|
||||
def __init__(self, cookies, order_num, sku_id):
|
||||
self.eid = None
|
||||
self.x_token = None
|
||||
self.get_x_token()
|
||||
self._session = requests.Session()
|
||||
self._order_num = order_num
|
||||
self.cookies = cookies
|
||||
@@ -234,11 +235,8 @@ class XiechengCardSpider:
|
||||
)
|
||||
res = response.json()
|
||||
if res.get("code") == 20001:
|
||||
return BusinessCode.JD_ORDER_CK_ERR, QueryCardResponseData(
|
||||
order_status="",
|
||||
card_num="",
|
||||
card_pwd="",
|
||||
remark=str(res),
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_CK_ERR, message=str(res)
|
||||
)
|
||||
|
||||
if res and res.get("code") == 0:
|
||||
@@ -264,8 +262,8 @@ class XiechengCardSpider:
|
||||
card_pwd=card_pwd,
|
||||
)
|
||||
else:
|
||||
return BusinessCode.JD_ORDER_NORMAL_ERR, QueryCardResponseData(
|
||||
order_status="", card_num="", card_pwd="", remark=str(res)
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_NORMAL_ERR, message=str(res)
|
||||
)
|
||||
|
||||
def plat_wx_pay_res(self, pay_id):
|
||||
@@ -391,7 +389,7 @@ class XiechengCardSpider:
|
||||
)
|
||||
logger.info(f"获取x-api-eid-token返回:{response.text}")
|
||||
if response.text == "参数异常":
|
||||
return self.get_x_token(retry-1)
|
||||
return self.get_x_token(retry - 1)
|
||||
|
||||
res = response.json()
|
||||
token = res["data"]["token"]
|
||||
@@ -400,7 +398,9 @@ class XiechengCardSpider:
|
||||
|
||||
def get_current_order(self, retry_count: int = 2):
|
||||
if not retry_count:
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_RISK_ERR, message="风控重试失败")
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_RISK_ERR, message="风控重试失败"
|
||||
)
|
||||
body = (
|
||||
'{"deviceUUID":"6785593751540242498","appId":"wxae3e8056daea8727","appVersion":"2.5.2","tenantCode":"jgm","bizModelCode":"3","bizModeClientType":"M","token":"3852b12f8c4d869b7ed3e2b3c68c9436","externalLoginType":1,"referer":"https://item.m.jd.com/","resetGsd":true,"useBestCoupon":"1","locationId":"1-72-2819-0","packageStyle":true,"sceneval":"2","balanceCommonOrderForm":{"supportTransport":false,"action":1,"overseaMerge":false,"international":false,"netBuySourceType":0,"appVersion":"2.5.2","tradeShort":false},"balanceDeviceInfo":{"resolution":"2048*1152"},"cartParam":{"skuItem":{"skuId":"%s","num":"1","orderCashBack":false,"extFlag":{}}}}'
|
||||
% self.sku_id
|
||||
@@ -702,26 +702,37 @@ class XiechengCardSpider:
|
||||
return response.json()
|
||||
|
||||
def run(self):
|
||||
self.x_token, self.eid = self.get_x_token()
|
||||
# 提交预付款订单
|
||||
self.get_current_order()
|
||||
order_res = self.submit_order()
|
||||
# 火爆
|
||||
if order_res.get("body", {}).get("errorCode") == "7201":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_RISK_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_RISK_ERR, message=str(order_res)
|
||||
)
|
||||
# 未登录
|
||||
if order_res.get("body", {}).get("errorCode") == "302":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_CK_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_CK_ERR, message=str(order_res)
|
||||
)
|
||||
# 无货
|
||||
if order_res.get("body", {}).get("errorCode") == "722":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_STOCK_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_STOCK_ERR, message=str(order_res)
|
||||
)
|
||||
# 火爆
|
||||
if order_res.get("body", {}).get("errorCode") == "601":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_RISK_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_RISK_ERR, message=str(order_res)
|
||||
)
|
||||
if order_res.get("code") != "0":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_NORMAL_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_NORMAL_ERR, message=str(order_res)
|
||||
)
|
||||
if order_res.get("body", {}).get("errorCode") == "601":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_NORMAL_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_NORMAL_ERR, message=str(order_res)
|
||||
)
|
||||
order_id = order_res.get("body", {}).get("order", {}).get("orderId")
|
||||
# 获取支付信息
|
||||
pay_res = self.get_pay_res(order_id)
|
||||
@@ -730,9 +741,13 @@ class XiechengCardSpider:
|
||||
order_res.get("body", {}).get("errorCode") == "302"
|
||||
and order_res.get("body", {}).get("errorReason") == "未登录"
|
||||
):
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_CK_ERR, message=str(order_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_CK_ERR, message=str(order_res)
|
||||
)
|
||||
if pay_res.get("code") != "0":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_NORMAL_ERR, message=str(pay_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_NORMAL_ERR, message=str(pay_res)
|
||||
)
|
||||
pay_id = pay_res["body"]["payId"]
|
||||
# 获取微信支付信息
|
||||
return self.refresh_payment_url(pay_id, order_id)
|
||||
@@ -744,17 +759,25 @@ class XiechengCardSpider:
|
||||
f"订单号:{self._order_num},app_store请求微信渠道返回:{pay_channel_res}"
|
||||
)
|
||||
if pay_channel_res.get("code") == "601":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_RISK_ERR, message=str(pay_channel_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_RISK_ERR, message=str(pay_channel_res)
|
||||
)
|
||||
if pay_channel_res.get("code") != "0":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_NORMAL_ERR, message=str(pay_channel_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_NORMAL_ERR, message=str(pay_channel_res)
|
||||
)
|
||||
wx_pay_res = self.plat_wx_pay_res(pay_id)
|
||||
logger.info(
|
||||
f"订单号:{self._order_num},app_store获取微信支付信息返回:{wx_pay_res}"
|
||||
)
|
||||
if wx_pay_res.get("code") != "0":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_NORMAL_ERR, message=str(wx_pay_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_NORMAL_ERR, message=str(wx_pay_res)
|
||||
)
|
||||
if wx_pay_res.get("errorCode") == "-1":
|
||||
raise JDServiceException(BusinessCode.JD_ORDER_CK_ERR, message=str(wx_pay_res))
|
||||
raise JDServiceException(
|
||||
BusinessCode.JD_ORDER_CK_ERR, message=str(wx_pay_res)
|
||||
)
|
||||
return BusinessCode.SUCCESS, {
|
||||
"deeplink": wx_pay_res.get("payInfo", {}).get("mweb_url"),
|
||||
"order_id": str(order_id),
|
||||
|
||||
@@ -108,7 +108,7 @@ class Settings(BaseSettings):
|
||||
# 代理设置
|
||||
proxy_enable: bool = Field(default=True, description="是否启用代理")
|
||||
proxy_url: str = Field(
|
||||
default="https://share.proxy.qg.net/get?key=7ASQH2BI&num=1&area=&isp=0&format=txt&seq=\r\n&distinct=false&area=510100",
|
||||
default="https://share.proxy.qg.net/get?key=7ASQH2BI&num=1&area=&isp=0&format=txt&seq=\r\n&distinct=false",
|
||||
description="代理服务器地址",
|
||||
)
|
||||
proxy_type: ProxyPoolType = Field(
|
||||
|
||||
Reference in New Issue
Block a user