feat(order): 添加订单重新发起支付功能并优化支付流程

- 新增 prepayShopOrder 接口用于对未支付订单生成新预支付参数
- 实现多路径兼容探测机制,支持不同后端版本的支付接口
- 优化订单支付逻辑,优先使用服务端最新状态避免重复支付
- 添加 fallback 机制,在重新支付失败时降级为重新创建订单
- 实现支付成功后自动取消旧待支付订单,避免列表堆积
- 修复订单列表中key值重复的问题
- 在商品列表中添加数量标识符x提升UI显示效果
This commit is contained in:
2026-02-04 15:32:27 +08:00
parent afe8f93c32
commit 5e36f243ef
2 changed files with 111 additions and 38 deletions

View File

@@ -1,4 +1,4 @@
import request from '@/utils/request';
import request, { ErrorType, RequestError } from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
import type { ShopOrder, ShopOrderParam, OrderCreateRequest } from './model';
@@ -113,6 +113,44 @@ export interface WxPayResult {
paySign: string;
}
/**
* 订单重新发起支付(对“已创建但未支付”的订单生成新的预支付参数,不应重复创建订单)
*
* 说明:不同后端版本可能暴露不同路径,这里做兼容探测;若全部失败,调用方可自行降级处理。
*/
export interface OrderPrepayRequest {
orderId: number;
payType: number;
}
export async function prepayShopOrder(data: OrderPrepayRequest) {
const urls = [
'/shop/shop-order/pay',
'/shop/shop-order/prepay',
'/shop/shop-order/repay'
];
let lastError: unknown;
let businessError: unknown;
for (const url of urls) {
try {
const res = await request.post<ApiResult<WxPayResult>>(url, data, { showError: false });
// request.ts 在 code!=0 时会直接 throw走到这里通常都是 code===0
if (res.code === 0) return res.data;
} catch (e) {
// 若已命中“业务错误”(例如订单已取消/已支付),优先保留该错误用于向上提示;
// 不要被后续的 404/网络错误覆盖掉,避免调用方误判为“不支持该接口”而降级走创建订单。
if (!businessError && e instanceof RequestError && e.type === ErrorType.BUSINESS_ERROR) {
businessError = e;
} else {
lastError = e;
}
}
}
return Promise.reject(businessError || lastError || new Error('发起支付失败'));
}
/**
* 创建订单
*/