跑通当前mini提交创建订单后,调用微信小程序支付,支付回调,更新订单状态。订单支付成功后,在min订单列表进入订单详情,点击取消订单后,可以取消订单并调用微信支付sdk退款,最后更新订单状态。
Current relevant functionality:
Technology stack:
Integration points:
What's being added/changed:
How it integrates:
Success criteria:
Story 1: 完善支付回调处理逻辑 - 确保支付回调正确更新订单状态,支持多租户隔离
Story 2: 实现订单取消功能 - 支持已支付订单的取消和退款流程
Story 3: 集成微信支付退款功能 - 调用微信支付SDK实现退款
Story 4: 优化订单状态流转和退款记录 - 完善订单状态管理和退款跟踪
Primary Risk: 退款功能可能影响现有支付流程的稳定性
Mitigation: 分阶段实施,先完善支付回调,再实现退款功能
Rollback Plan: 如果出现问题,可以暂时禁用退款功能,保持现有支付流程正常工作
// 支付回调接口 - 修复PaymentMtService中的TODO
class PaymentMtService {
async handlePaymentCallback(callbackData: any, headers: any, rawBody: string): Promise<void> {
// ... 现有验证逻辑 ...
// 根据回调结果更新支付状态
if (parsedData.trade_state === 'SUCCESS') {
payment.paymentStatus = PaymentStatus.PAID;
payment.wechatTransactionId = parsedData.transaction_id;
// TODO: 更新订单状态 - 需要实现
await this.updateOrderPaymentStatus(payment.tenantId, payment.externalOrderId, 2); // 支付成功
} else if (parsedData.trade_state === 'FAIL') {
payment.paymentStatus = PaymentStatus.FAILED;
await this.updateOrderPaymentStatus(payment.tenantId, payment.externalOrderId, 4); // 支付失败
} else if (parsedData.trade_state === 'REFUND') {
payment.paymentStatus = PaymentStatus.REFUNDED;
await this.updateOrderPaymentStatus(payment.tenantId, payment.externalOrderId, 3); // 已退款
}
await paymentRepository.save(payment);
}
}
// 订单取消服务 - 需要在OrderMtService中添加
class OrderMtService {
async cancelOrder(tenantId: number, orderId: number, reason: string, userId: number) {
const order = await this.repository.findOne({
where: { id: orderId, tenantId }
});
if (!order) {
throw new Error('订单不存在');
}
// 验证订单状态
if (order.payState !== 0 && order.payState !== 2) {
throw new Error('该订单状态不允许取消');
}
if (order.payState === 2) {
// 已支付订单,触发退款
const paymentService = new PaymentMtService(this.dataSource);
const refundResult = await paymentService.refund(
tenantId,
order.orderNo,
order.payAmount
);
// 创建退款记录
const refundService = new UserRefundsMtService(this.dataSource);
await refundService.createUserRefund({
orderNo: order.orderNo,
refundOrderNo: refundResult.refund_id,
refundAmount: order.payAmount,
state: 1 // 退款中
}, userId, tenantId);
}
// 更新订单状态
order.payState = 5; // 订单关闭
order.closeTime = new Date();
order.remark = `用户取消: ${reason}`;
order.updatedBy = userId;
await this.repository.save(order);
}
}
// 在PaymentMtService中添加退款功能
class PaymentMtService {
async refund(tenantId: number, orderNo: string, refundAmount: number): Promise<{
refund_id: string;
out_refund_no: string;
}> {
await this.initializeWxPay(tenantId);
const result = await this.wxPay.refund({
out_trade_no: orderNo,
out_refund_no: `REFUND_${orderNo}_${Date.now()}`,
amount: {
refund: refundAmount,
total: refundAmount,
currency: 'CNY'
}
});
return {
refund_id: result.refund_id,
out_refund_no: result.out_refund_no
};
}
}
Story Manager Handoff:
"请为这个棕地史诗开发详细的用户故事。关键考虑因素:
该史诗应在保持系统完整性的同时交付完整的支付退款流程功能。"