From 03b343fd0b6f7d715f3880ec51b70427a15ece75 Mon Sep 17 00:00:00 2001 From: stefanfeng Date: Thu, 22 Oct 2026 09:29:56 +0800 Subject: [PATCH] fix: pass Huihui token to production cashier --- digital-avatar-app/backend/routers/tokens.py | 3 +-- digital-avatar-app/backend/tests/test_token_billing.py | 4 ++-- digital-avatar-app/docs/H5_PRODUCTION_DEPLOYMENT.md | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/digital-avatar-app/backend/routers/tokens.py b/digital-avatar-app/backend/routers/tokens.py index 3a030b6..51758a5 100644 --- a/digital-avatar-app/backend/routers/tokens.py +++ b/digital-avatar-app/backend/routers/tokens.py @@ -455,8 +455,7 @@ def charge_via_huihui_org(payload: dict = Body(...), authorization: str = Header db.add(order) db.commit() result = _payment_payload(order, get_or_create_account(db, user.id)) - if "fat-open.99hui.com" in os.getenv("HUIHUI_ORG_BASE_URL", ""): - result["checkoutToken"] = user.huihui_token + result["checkoutToken"] = user.huihui_token return ok(result) diff --git a/digital-avatar-app/backend/tests/test_token_billing.py b/digital-avatar-app/backend/tests/test_token_billing.py index e8926e2..66c6551 100644 --- a/digital-avatar-app/backend/tests/test_token_billing.py +++ b/digital-avatar-app/backend/tests/test_token_billing.py @@ -163,7 +163,7 @@ def test_org_recharge_only_credits_after_verified_provider_order(authorization_c provider.get_order.assert_not_called() -def test_org_recharge_does_not_return_checkout_token_outside_test_environment(authorization_context): +def test_org_recharge_returns_checkout_token_for_production_cashier(authorization_context): seed() context = authorization_context _enable_huihui_payment_login(context) @@ -180,7 +180,7 @@ def test_org_recharge_does_not_return_checkout_token_outside_test_environment(au ) assert response.status_code == 200 - assert "checkoutToken" not in response.json()["data"] + assert response.json()["data"]["checkoutToken"] == f"huihui-payment-{context['suffix']}" def test_expired_pending_payment_orders_are_closed_without_touching_recent_orders(authorization_context): diff --git a/digital-avatar-app/docs/H5_PRODUCTION_DEPLOYMENT.md b/digital-avatar-app/docs/H5_PRODUCTION_DEPLOYMENT.md index ecc2a96..4751f8e 100644 --- a/digital-avatar-app/docs/H5_PRODUCTION_DEPLOYMENT.md +++ b/digital-avatar-app/docs/H5_PRODUCTION_DEPLOYMENT.md @@ -91,7 +91,7 @@ CHAT_ATTACHMENT_CLEANUP_MINUTES=60 `EMBEDDING_API_URL` 同时支持 OpenAI 兼容基础地址(如上面的 `/v1`)和完整的 `/v1/embeddings` 地址,后端会统一请求 `/embeddings`。发布后必须在后端容器内执行一次最小向量探针,确认返回向量数量和维度,而不能只检查 `/api/health`。 -当前 H5 积分充值调用 `/api/token/charge/org` 创建会会组织充值订单。数字分身后端请求会会 `/order/tokenRecharge` 时,把所选套餐 ID 作为字符串 `productId` 传入(`Basic`、`Standard`、`Professional`、`Enterprise`),再用会会返回的订单号打开 `#/payOrder?id=<会会订单号>&isOrgUrl=true&evn=<入口环境>`;测试环境额外透传会会登录 token,生产环境不传。`id` 是收银台查询订单的编号,不能替换为套餐/道具 ID。普通微信 H5 走 JSAPI,App 和其他 H5 沿用会会普通收银台。支付回调确认状态成功且金额与套餐价格完全一致后才增加积分,重复回调不会重复到账。 +当前 H5 积分充值调用 `/api/token/charge/org` 创建会会组织充值订单。数字分身后端请求会会 `/order/tokenRecharge` 时,把所选套餐 ID 作为字符串 `productId` 传入(`Basic`、`Standard`、`Professional`、`Enterprise`),再用会会返回的订单号打开 `#/payOrder?id=<会会订单号>&isOrgUrl=true&token=<会会登录 token>&evn=<入口环境>`。测试和生产收银台都需要此 token 查询订单金额;`id` 是收银台查询订单的编号,不能替换为套餐/道具 ID。普通微信 H5 走 JSAPI,App 和其他 H5 沿用会会普通收银台。支付回调确认状态成功且金额与套餐价格完全一致后才增加积分,重复回调不会重复到账。 微信小程序虚拟支付的服务端接口为:小程序先通过 `POST /api/token/wechat/session` 交换临时登录码,再由 `POST /api/token/charge`(`payScene=LITE`)返回已签名的 `requestVirtualPayment` 参数;其中 `productId` 直接采用套餐 ID(`Basic`、`Standard`、`Professional`、`Enterprise`)。小程序原生支付页仍需调用 `wx.requestVirtualPayment`,不能仅打开上述 H5 收银台 URL 来完成虚拟支付。微信回调地址配置为 `https://digital.99hui.com/api/token/payment/wechat/virtual/notify`。回调会复核签名、OpenID、环境、商品 ID 与实付金额,退款回调确认后才扣回积分。AppKey、AppSecret、session_key 均不得下发前端或写日志。 -- 2.54.0