feat(order): 重构退款全流程并新增申请退款中状态
- 订单状态新增「6 申请退款中」,用户申请退款原子流转并落待审核退款流水 - 退款失败回退订单至已支付并恢复被取消的权益发放任务 - 新增虚拟支付退款查单兜底任务,反查超时订单并自动订正 - 会员包来源额度不叠加,扣减/回退/回收口径统一为只取生效一份 - 退款回收流水按吊销前后有效剩余差值记账,避免无效回收记录 - 同步更新 README 与 Stitch 设计文档
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
// TestTruncateCallbackRaw 回调报文截断:短报文原样保留,长报文按上限截断且不产生非法 UTF-8
|
||||
// (退款流水 callback_raw 为 utf8mb4 列,写入非法字节会直接报错)。
|
||||
func TestTruncateCallbackRaw(t *testing.T) {
|
||||
short := `{"Event":"xpay_refund_notify","MchOrderId":"OD1"}`
|
||||
if got := truncateCallbackRaw(short); got != short {
|
||||
t.Fatalf("short raw should be kept as-is, got %q", got)
|
||||
}
|
||||
|
||||
// 构造跨越截断边界的多字节报文:4KB 边界前后都是中文字符。
|
||||
long := strings.Repeat("退", 3000)
|
||||
got := truncateCallbackRaw(long)
|
||||
if len(got) > 4096 {
|
||||
t.Fatalf("truncated length = %d, want <= 4096", len(got))
|
||||
}
|
||||
if !utf8.ValidString(got) {
|
||||
t.Fatal("truncated raw must be valid UTF-8")
|
||||
}
|
||||
if got == "" || !strings.HasPrefix(long, got) {
|
||||
t.Fatalf("truncated raw should be a prefix of the original, got prefix=%q", got[:min(8, len(got))])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user