diff --git a/apps/jd/router/app_store.py b/apps/jd/router/app_store.py index f7ffd9a..c6665ff 100644 --- a/apps/jd/router/app_store.py +++ b/apps/jd/router/app_store.py @@ -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="查询异常") diff --git a/apps/jd/router/payment.py b/apps/jd/router/payment.py index 3c67e19..2396862 100644 --- a/apps/jd/router/payment.py +++ b/apps/jd/router/payment.py @@ -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="风控", + ) diff --git a/apps/jd/schemas/models.py b/apps/jd/schemas/models.py index c5dcf27..d609431 100644 --- a/apps/jd/schemas/models.py +++ b/apps/jd/schemas/models.py @@ -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="备注") \ No newline at end of file diff --git a/apps/jd/services/ctrip.py b/apps/jd/services/ctrip.py index c23c141..a09784b 100644 --- a/apps/jd/services/ctrip.py +++ b/apps/jd/services/ctrip.py @@ -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), diff --git a/core/config.py b/core/config.py index 78f5269..e5880a4 100644 --- a/core/config.py +++ b/core/config.py @@ -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(