feat: add student checkout pages

This commit is contained in:
Codex
2026-06-29 13:17:49 +08:00
parent 2776ce12a5
commit 65905aaf8f
13 changed files with 666 additions and 15 deletions

View File

@@ -7,6 +7,7 @@ export interface SvipPlan {
priceCents?: number;
originalPrice?: number | null;
days?: number;
regionId?: string | null;
desc?: string | null;
badge?: string | null;
recommended?: boolean;
@@ -16,10 +17,75 @@ export interface OrderItem {
id: string;
orderNo: string;
status: string;
productType?: string | null;
productName?: string | null;
amountCents?: number;
amount?: number;
refundedAmountCents?: number;
payMethod?: string | null;
payProvider?: string | null;
tradeNo?: string | null;
planId?: string | null;
days?: number | null;
regionId?: string | null;
paidAt?: string | null;
createdAt?: string;
updatedAt?: string;
}
export interface OrderDetail extends OrderItem {
pricing?: Record<string, unknown> | null;
payments?: Record<string, unknown>[];
items?: Record<string, unknown>[];
couponRedemptions?: Record<string, unknown>[];
}
export interface OrderStatus {
orderNo: string;
status: string;
amountCents?: number;
amount?: number;
refundedAmountCents?: number;
payProvider?: string | null;
payMethod?: string | null;
tradeNo?: string | null;
paidAt?: string | null;
updatedAt?: string;
payment?: Record<string, unknown> | null;
}
export interface PaymentCreateResult {
orderNo: string;
provider: 'wechat_pay' | 'alipay' | 'manual' | string;
method: string;
paymentParams?: Record<string, unknown>;
}
export interface CouponClaimResult {
valid?: boolean;
idempotent?: boolean;
coupon?: {
code?: string;
discountType?: string | null;
discountValue?: number | null;
discountCents?: number;
redemptionId?: string | null;
redemptionStatus?: string | null;
plan?: {
id?: string;
name?: string;
price?: number;
priceCents?: number;
days?: number;
regionId?: string | null;
};
};
redemption?: {
id?: string;
status?: string;
claimedAt?: string | null;
usedAt?: string | null;
};
}
export async function loadSvipPlans(regionId?: string) {
@@ -33,8 +99,9 @@ export async function createOrder(body: {
payProvider?: string;
quantity?: number;
couponCode?: string;
couponRedemptionId?: string;
}) {
return apiRequest<{ item?: Record<string, unknown> }>('/api/commerce/orders', {
return apiRequest<{ item?: OrderDetail }>('/api/commerce/orders', {
method: 'POST',
body,
});
@@ -44,6 +111,34 @@ export async function loadOrders(limit = 20) {
return apiRequest<{ items?: OrderItem[] }>('/api/commerce/orders', { query: { limit } });
}
export async function loadOrderDetail(orderNo: string) {
return apiRequest<{ item?: OrderDetail }>('/api/commerce/orders/detail', { query: { orderNo } });
}
export async function loadOrderStatus(orderNo: string) {
return apiRequest<{ item?: OrderStatus }>('/api/commerce/orders/status', { query: { orderNo } });
}
export async function claimCoupon(body: { code: string; planId?: string; regionId?: string }) {
return apiRequest<CouponClaimResult>('/api/commerce/coupons/claim', {
method: 'POST',
body,
});
}
export async function createPayment(body: {
orderNo: string;
provider?: 'wechat_pay' | 'alipay' | 'manual' | string;
openId?: string;
returnUrl?: string;
quitUrl?: string;
}) {
return apiRequest<{ item?: PaymentCreateResult }>('/api/commerce/payments/create', {
method: 'POST',
body,
});
}
export async function loadEntitlements() {
return apiRequest<{ items?: Record<string, unknown>[]; summary?: Record<string, unknown> }>('/api/commerce/entitlements');
}