feat(redeem): 固定兑换链接 /redeem(输入订单号 → 状态分流 → 兑换)
- 路径式入口 `https://<域名>/redeem`(不带 #):主站是 HashRouter, 故在 App.tsx 里早于 isWorkerSite() 插入独立 BrowserRouter 分支, 主站与打手站路由均不受影响;Caddy 已有 try_files 兜底,无需改部署 - 页面按 7 种状态渲染:not_found / unpaid / cancelled / refunded / pending_certificate / redeemable / verified - not_found 保留用户输入的订单号,不清空 - pending_certificate 只给显式「刷新」,不做自动轮询(公开限流接口,避免空转) - verified 只展示后端已掩码的券码,绝不渲染明文 certNo - confirm 不假设成功:一律按返回的 status 重渲染 - 纯函数抽到 utils/redeem.ts(无 React/antd、无 @ 别名),可直接跑单测
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
import { apiPost } from '@/lib/http'
|
||||
import type { RedeemOrderView } from '@/types/redeem'
|
||||
|
||||
/**
|
||||
* 固定兑换链接的公开接口封装。
|
||||
*
|
||||
* 两者都返回同一个 `RedeemOrderView`:`confirm` 在不可兑换时**不抛错**,
|
||||
* 会把当前状态原样返回,所以调用方必须按 `status` 渲染,不能假设一定成功。
|
||||
*/
|
||||
export function lookupRedeemOrder(orderNo: string) {
|
||||
return apiPost<RedeemOrderView>('/api/v1/redeem/lookup', { orderNo })
|
||||
}
|
||||
|
||||
export function confirmRedeemOrder(orderNo: string) {
|
||||
return apiPost<RedeemOrderView>('/api/v1/redeem/confirm', { orderNo })
|
||||
}
|
||||
Reference in New Issue
Block a user