From 2b01e0adece0d38030d99f7f0f840a7ffc836a7c Mon Sep 17 00:00:00 2001 From: db_huang <18006480240@163.com> Date: Sat, 31 Oct 2026 17:34:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E4=BD=A3=E9=87=91=E9=85=8D=E7=BD=AE=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.env.example | 1 - .../alipay_provider.cpython-313.pyc | Bin 22201 -> 21960 bytes .../app/__pycache__/config.cpython-313.pyc | Bin 8214 -> 8069 bytes backend/app/__pycache__/main.cpython-313.pyc | Bin 358910 -> 359250 bytes backend/app/alipay_provider.py | 8 ++------ backend/app/config.py | 1 - backend/app/main.py | 6 ++++-- ...ipay_provider.cpython-313-pytest-9.1.1.pyc | Bin 26199 -> 26029 bytes backend/tests/test_alipay_provider.py | 4 +--- frontend/src/TaskBoardPage.jsx | 10 +++++----- 10 files changed, 12 insertions(+), 18 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 0d2eeee..fa424f2 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -53,5 +53,4 @@ ALIPAY_NOTIFY_URL=https://your-domain.example.com/alipay_callback ALIPAY_TRANSFER_API=alipay.fund.trans.uni.transfer ALIPAY_TRANSFER_QUERY_API=alipay.fund.trans.common.query ALIPAY_TRANSFER_SCENE_NAME=佣金报酬 -ALIPAY_TRANSFER_JOB_TYPE=问答任务参与者 ALIPAY_HTTP_TIMEOUT_SECONDS=30 diff --git a/backend/app/__pycache__/alipay_provider.cpython-313.pyc b/backend/app/__pycache__/alipay_provider.cpython-313.pyc index a900da41f7a30c8174bc3b01d51ce19bfacc30ee..dbbec3e7b48cc60f45fe8f32b1e2835ae4132c7e 100644 GIT binary patch delta 3454 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 SD(u|&i%-yKeh3Z>)%_1nb@~7R delta 3477 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 Q$>A+e(CEPic*RxqA0vhjWHa^HWN5QtgT+ cPi~U0mb7CGWBkYfCY_iVctpCb8acqq0ZJ)73IG5A delta 372 zcmZp*pXR{(nU|M~0SF$hf11^^k(ZB|aouJa<_}zxjhH34y@I7onLx4(43i5vW!Q>r zV)&I9CL1zKN_z+Uz@$tWAxesDgMEwa()}j;^Vv+U=i_Dc-`vYr%_b4i5Rvz=BG0g`8w zCBj+R&e)3p$+I>R;oNNJBt(GZc~OaQLALXTB0#c81n5gmzM}BSg>q?9fj~}?5Qq=} q61O;Pa`RJ4b5iY!rcVASS1oDJ7{>UK0Zh6uG4P0VTQzckl>-26W@-)q diff --git a/backend/app/__pycache__/main.cpython-313.pyc b/backend/app/__pycache__/main.cpython-313.pyc index b583da3b10e698260e09fa1c25bd390316c2ee53..d5f443e1e49d127dfd195121b00ee8397b396c9b 100644 GIT binary patch delta 4674 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 OWWEX2uTPaP`Tj2uZy@jh delta 4421 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 diff --git a/backend/app/alipay_provider.py b/backend/app/alipay_provider.py index c9def05..5ff753a 100644 --- a/backend/app/alipay_provider.py +++ b/backend/app/alipay_provider.py @@ -28,7 +28,6 @@ def validate_configuration() -> None: ("ALIPAY_APP_PRIVATE_KEY_PATH", settings.alipay_app_private_key_path), ("ALIPAY_PUBLIC_KEY_PATH 或 ALIPAY_ALIPAY_PUBLIC_CERT_PATH", settings.alipay_public_key_path or settings.alipay_alipay_public_cert_path), ("ALIPAY_TRANSFER_SCENE_NAME", settings.alipay_transfer_scene_name), - ("ALIPAY_TRANSFER_JOB_TYPE", settings.alipay_transfer_job_type), ) if not str(value or "").strip() ] if missing: @@ -269,13 +268,10 @@ def transfer(*, out_biz_no: str, amount_fen: int, account: str, payee_name: str, model.product_code = "TRANS_ACCOUNT_NO_PWD" model.biz_scene = "DIRECT_TRANSFER" model.transfer_scene_name = settings.alipay_transfer_scene_name - job_type = TransferSceneReportInfo() - job_type.info_type = "岗位类型" - job_type.info_content = settings.alipay_transfer_job_type[:32] reward_description = TransferSceneReportInfo() - reward_description.info_type = "报酬说明" + reward_description.info_type = "佣金报酬说明" reward_description.info_content = order_title[:32] - model.transfer_scene_report_infos = [job_type, reward_description] + model.transfer_scene_report_infos = [reward_description] model.order_title = order_title[:128] payee = Participant() payee.identity = account diff --git a/backend/app/config.py b/backend/app/config.py index 2f918ad..3c037e6 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -78,7 +78,6 @@ class Settings: alipay_transfer_api = os.getenv("ALIPAY_TRANSFER_API", "alipay.fund.trans.uni.transfer") alipay_transfer_query_api = os.getenv("ALIPAY_TRANSFER_QUERY_API", "alipay.fund.trans.common.query") alipay_transfer_scene_name = os.getenv("ALIPAY_TRANSFER_SCENE_NAME", "").strip() - alipay_transfer_job_type = os.getenv("ALIPAY_TRANSFER_JOB_TYPE", "").strip() alipay_http_timeout_seconds = int(os.getenv("ALIPAY_HTTP_TIMEOUT_SECONDS", "30")) diff --git a/backend/app/main.py b/backend/app/main.py index 116b8a8..38f5b58 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -3659,6 +3659,8 @@ def _alipay_error_detail(exc: AlipayTransferError, *, querying: bool = False) -> return "当前服务器公网 IP 不在支付宝开放平台白名单,请配置服务器 IP 白名单后重试查询" if exc.code == "isv.invalid-alipay-root-cert-sn": return "支付宝根证书序列号无效,请检查证书模式配置后重试" + if exc.code == "TRANSFER_SCENE_REPORT_INFO_ILLEGAL": + return "支付宝转账失败(TRANSFER_SCENE_REPORT_INFO_ILLEGAL):佣金报酬场景必须上报“佣金报酬说明”,请确认服务器已部署最新代码并重启后端" if exc.ambiguous: return "支付宝请求超时,结果暂不明确;请稍后查询订单状态,勿重复创建转账" action = "查询" if querying else "转账" @@ -3679,8 +3681,8 @@ def _perform_alipay_refund(db: Session, record, kind: str, user: AdminUser, paye if not identity["alipay_account"] or not identity["payee_name"]: raise HTTPException(status_code=400, detail="缺少收款支付宝账号或收款人姓名") amount_fen = identity["refund_amount_fen"] - if amount_fen <= 0: - raise HTTPException(status_code=400, detail="返款金额必须大于0") + if amount_fen < 10: + raise HTTPException(status_code=400, detail="支付宝单笔转账金额不能低于0.10元") if payer.single_limit_fen and amount_fen > payer.single_limit_fen: raise HTTPException(status_code=400, detail="返款金额超过付款账户单笔限额") order = db.scalar(select(AlipayRefundOrder).where( diff --git a/backend/tests/__pycache__/test_alipay_provider.cpython-313-pytest-9.1.1.pyc b/backend/tests/__pycache__/test_alipay_provider.cpython-313-pytest-9.1.1.pyc index 7837d39a244729f01549a082d0081c0f2b7c0269..0b1de5bdce8db1808477c7dacebf0e8309f02f64 100644 GIT binary patch delta 2107 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 ORMIo~*JNn7B>V$Xh)gvA diff --git a/backend/tests/test_alipay_provider.py b/backend/tests/test_alipay_provider.py index 260610f..b20ce82 100644 --- a/backend/tests/test_alipay_provider.py +++ b/backend/tests/test_alipay_provider.py @@ -32,7 +32,6 @@ def test_transfer_parses_official_sdk_json_response(monkeypatch): }) monkeypatch.setattr(alipay_provider, "_client", lambda: client) monkeypatch.setattr(alipay_provider.settings, "alipay_transfer_scene_name", "佣金报酬") - monkeypatch.setattr(alipay_provider.settings, "alipay_transfer_job_type", "问答任务参与者") result = alipay_provider.transfer( out_biz_no="RF001", amount_fen=300, account="buyer@example.com", payee_name="测试收款人", order_title="测试返款", @@ -41,8 +40,7 @@ def test_transfer_parses_official_sdk_json_response(monkeypatch): biz_content = json.loads(client.params["biz_content"]) assert biz_content["transfer_scene_name"] == "佣金报酬" assert biz_content["transfer_scene_report_infos"] == [ - {"info_content": "问答任务参与者", "info_type": "岗位类型"}, - {"info_content": "测试返款", "info_type": "报酬说明"}, + {"info_content": "测试返款", "info_type": "佣金报酬说明"}, ] diff --git a/frontend/src/TaskBoardPage.jsx b/frontend/src/TaskBoardPage.jsx index bb29974..c502846 100644 --- a/frontend/src/TaskBoardPage.jsx +++ b/frontend/src/TaskBoardPage.jsx @@ -60,9 +60,9 @@ export function TaskDetail({ task, close, onConfirmRefund, onSaveRefundAmount, a setAmount(((task.refund_amount_fen ?? (task.selected_questions?.length ?? 0) * 50) / 100).toFixed(2)); setAmountError(""); }, [task.board_key, task.refund_amount_fen]); - const validAmount = /^\d+(\.\d{1,2})?$/.test(amount) && Number(amount) > 0 && Number(amount) <= 999999.99; + const validAmount = /^\d+(\.\d{1,2})?$/.test(amount) && Number(amount) >= 0.1 && Number(amount) <= 999999.99; async function saveAmount(reset = false) { - if (!reset && !validAmount) return setAmountError("请输入大于0且最多两位小数的金额"); + if (!reset && !validAmount) return setAmountError("支付宝转账金额最低0.10元,且最多两位小数"); setAmountBusy(true); setAmountError(""); try { @@ -210,7 +210,7 @@ export function TaskDetail({ task, close, onConfirmRefund, onSaveRefundAmount, a
默认:{task.refund_default_amount_fen / 50 || 0} 条 × 0.50 元 = ¥{((task.refund_default_amount_fen || 0) / 100).toFixed(2)}{task.refund_amount_custom ? "(已自定义)" : ""} {!readOnly && task.refund_endpoint && <> @@ -364,8 +364,8 @@ export function TaskDetail({ task, close, onConfirmRefund, onSaveRefundAmount, a

收款人:{task.payee_name || "未填写"}
支付宝账号:{task.alipay_account || "未填写"}