From 8f07b6bcf1524cba006e9a95928914c75db10f1c Mon Sep 17 00:00:00 2001 From: db_huang <18006480240@163.com> Date: Fri, 30 Oct 2026 15:58:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=94=AF=E4=BB=98=E5=9C=BA?= =?UTF-8?q?=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 21427 -> 21594 bytes .../app/__pycache__/config.cpython-313.pyc | Bin 7920 -> 8019 bytes backend/app/alipay_provider.py | 3 +++ backend/app/config.py | 1 + ...ipay_provider.cpython-313-pytest-9.1.1.pyc | Bin 23434 -> 25527 bytes backend/tests/test_alipay_provider.py | 22 ++++++++++++++---- 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 563adfd..fa424f2 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -52,4 +52,5 @@ ALIPAY_FORMAT=json 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_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 8148ccae687318ab8f07230b415cca74362b1580..5ab77176a23f16a4c484ad56fee7acabf2a611b2 100644 GIT binary patch delta 3594 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 delta 326 zcmca?_raF$GcPX}0}u$O-pP6g9@ekF#<3z;RQJ%hbWnLtJ} zFqkqz=pyT2?;@LYpUHxJo{YYmqxs@lCtnj*VYJ=+TlgFEWL}9V#^lWz5~{3HH y{DGVzArK(|ByMro None: ("ALIPAY_PAYER_ACCOUNT", settings.alipay_payer_account), ("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), ) if not str(value or "").strip() ] if missing: @@ -265,6 +266,7 @@ def transfer(*, out_biz_no: str, amount_fen: int, account: str, payee_name: str, model.trans_amount = f"{Decimal(amount_fen) / Decimal(100):.2f}" model.product_code = "TRANS_ACCOUNT_NO_PWD" model.biz_scene = "DIRECT_TRANSFER" + model.transfer_scene_name = settings.alipay_transfer_scene_name model.order_title = order_title[:128] payee = Participant() payee.identity = account @@ -299,6 +301,7 @@ def query(*, out_biz_no: str) -> dict: model = AlipayFundTransCommonQueryModel() model.out_biz_no = out_biz_no model.product_code = "TRANS_ACCOUNT_NO_PWD" + model.biz_scene = "DIRECT_TRANSFER" request = AlipayFundTransCommonQueryRequest(biz_model=model) try: raw = _client().execute(request) diff --git a/backend/app/config.py b/backend/app/config.py index e6db07d..3c037e6 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -77,6 +77,7 @@ class Settings: alipay_notify_url = os.getenv("ALIPAY_NOTIFY_URL", "") 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_http_timeout_seconds = int(os.getenv("ALIPAY_HTTP_TIMEOUT_SECONDS", "30")) 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 5a93b9584831cb77d75137ce5476862f08012b93..d69700f83724b20480b1fd2c0189c8cf2152d3ea 100644 GIT binary patch delta 4981 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 diff --git a/backend/tests/test_alipay_provider.py b/backend/tests/test_alipay_provider.py index d8ed369..dc6d46d 100644 --- a/backend/tests/test_alipay_provider.py +++ b/backend/tests/test_alipay_provider.py @@ -16,19 +16,29 @@ class FakeClient: return json.dumps(self.payload, ensure_ascii=False) +class CapturingClient(FakeClient): + def execute(self, request): + self.params = request.get_params() + return super().execute(request) + + def test_transfer_parses_official_sdk_json_response(monkeypatch): - monkeypatch.setattr(alipay_provider, "_client", lambda: FakeClient({ + client = CapturingClient({ "code": "10000", "msg": "Success", "out_biz_no": "RF001", "order_id": "ALI001", "status": "SUCCESS", - })) + }) + monkeypatch.setattr(alipay_provider, "_client", lambda: client) + monkeypatch.setattr(alipay_provider.settings, "alipay_transfer_scene_name", "佣金报酬") result = alipay_provider.transfer( out_biz_no="RF001", amount_fen=300, account="buyer@example.com", payee_name="测试收款人", order_title="测试返款", ) assert result == {"out_biz_no": "RF001", "trade_no": "ALI001", "status": "SUCCESS"} + biz_content = json.loads(client.params["biz_content"]) + assert biz_content["transfer_scene_name"] == "佣金报酬" def test_transfer_preserves_provider_business_error(monkeypatch): @@ -66,16 +76,20 @@ def test_old_sdk_error_envelope_is_recovered_from_response_exception(): def test_query_parses_processing_status(monkeypatch): - monkeypatch.setattr(alipay_provider, "_client", lambda: FakeClient({ + client = CapturingClient({ "code": "10000", "msg": "Success", "out_biz_no": "RF003", "order_id": "ALI003", "status": "DEALING", - })) + }) + monkeypatch.setattr(alipay_provider, "_client", lambda: client) result = alipay_provider.query(out_biz_no="RF003") assert result["status"] == "DEALING" assert result["trade_no"] == "ALI003" + biz_content = json.loads(client.params["biz_content"]) + assert biz_content["biz_scene"] == "DIRECT_TRANSFER" + assert biz_content["product_code"] == "TRANS_ACCOUNT_NO_PWD" def test_legacy_transfer_table_is_migrated_without_losing_rows():