支付通路

This commit is contained in:
tianmo committed 2026-09-30 15:08:16 +08:00
1 parent c7f43e30a9
commit 85b0e70907
26 files changed
+1324 -74

No files matched your search

@@ -7,6 +7,8 @@ import { OrdersService } from './orders.service';
const createSchema = z.object({
courseCode: z.string().min(1),
quantity: z.coerce.number().int().min(1).max(10).optional(),
/** 下单设备,小程序上报;缺省不影响下单,只是后台看不到渠道 */
terminal: z.string().max(16).optional(),
});
@Controller('v1/orders')
@@ -17,7 +19,12 @@ export class OrdersController {
create(@CurrentUser() user: AuthPrincipal, @Body() body: unknown) {
const parsed = createSchema.safeParse(body);
if (!parsed.success) throw AppError.badRequest('参数错误:缺少 courseCode');
return this.orders.create(user.id, parsed.data.courseCode, parsed.data.quantity ?? 1);
return this.orders.create(
user.id,
parsed.data.courseCode,
parsed.data.quantity ?? 1,
parsed.data.terminal ?? null,
);
}
@Get()
@@ -30,4 +37,3 @@ export class OrdersController {
return this.orders.status(user.id, outTradeNo);
}
}
@@ -28,7 +28,12 @@ export class OrdersService {
* - signData 是要原样传给客户端的字符串,签名基于同一份字符串
* - goodsPrice 单位是分,必须与 MP 后台道具价格一致
*/
async create(userId: number, courseCode: string, quantity = 1): Promise<{ outTradeNo: string; payData: PayData }> {
async create(
userId: number,
courseCode: string,
quantity = 1,
terminal: string | null = null,
): Promise<{ outTradeNo: string; payData: PayData }> {
if (!this.wxpay.enabled) {
throw new AppError(ErrorCode.PAY_NOT_ENABLED, '支付尚未开通,请联系管理员', 503);
}
@@ -72,6 +77,7 @@ export class OrdersService {
amount_fen: amountFen,
status: OrderStatus.CREATED,
env: this.wxpay.env,
terminal,
attach: `course:${course.code}`,
},
});
@@ -112,6 +118,7 @@ export class OrdersService {
status: order.status,
statusText: STATUS_TEXT[order.status] ?? '未知',
amountFen: order.amount_fen,
terminal: order.terminal,
courseCode: order.course.code,
courseTitle: order.course.title,
createdAt: order.created_at,
@@ -134,6 +141,7 @@ export class OrdersService {
status: o.status,
statusText: STATUS_TEXT[o.status] ?? '未知',
amountFen: o.amount_fen,
terminal: o.terminal,
courseCode: o.course.code,
courseTitle: o.course.title,
createdAt: o.created_at,