修复虚拟支付

This commit is contained in:
2026-09-14 01:52:32 +08:00
parent b6e842ac9b
commit d87f904e33
3 changed files with 145 additions and 51 deletions
+67 -7
View File
@@ -148,25 +148,85 @@ func TestParseNotifyAndResponse(t *testing.T) {
}
}
// TestIsOrderPaidStatus 校验订单支付状态白名单判断:仅已知成功枚举为已支付,未知/空串按未支付。
// TestIsOrderPaidStatus 校验订单支付状态白名单判断:仅「已支付及之后」为已支付,
// 未支付/已退款/已关闭等一律按未支付(fail-closed)。
func TestIsOrderPaidStatus(t *testing.T) {
cases := []struct {
status string
status int
want bool
}{
{XPayOrderStatusPaid, true},
{"NOTPAY", false},
{"CLOSED", false},
{"UNKNOWN", false},
{"", false},
{XPayOrderStatusProviding, true},
{XPayOrderStatusProvided, true},
{XPayOrderStatusInit, false},
{XPayOrderStatusCreated, false},
{XPayOrderStatusRefunded, false},
{XPayOrderStatusClosed, false},
{XPayOrderStatusRefundFailed, false},
}
for _, c := range cases {
if got := IsOrderPaidStatus(c.status); got != c.want {
t.Fatalf("IsOrderPaidStatus(%q) = %v, want %v", c.status, got, c.want)
t.Fatalf("IsOrderPaidStatus(%d) = %v, want %v", c.status, got, c.want)
}
}
}
// TestIsOrderRefundedStatus 校验退款状态白名单判断:仅已退款/用户退款完成为已退款。
func TestIsOrderRefundedStatus(t *testing.T) {
cases := []struct {
status int
want bool
}{
{XPayOrderStatusRefunded, true},
{XPayOrderStatusUserRefunded, true},
{XPayOrderStatusPaid, false},
{XPayOrderStatusRefundFailed, false},
{XPayOrderStatusCreated, false},
}
for _, c := range cases {
if got := IsOrderRefundedStatus(c.status); got != c.want {
t.Fatalf("IsOrderRefundedStatus(%d) = %v, want %v", c.status, got, c.want)
}
}
}
// TestXPayOrderInfoUnmarshal 校验 query_order 响应解析:订单字段包在 order 子对象内,status 为数字枚举。
// 回归防护:早期实现把字段平铺在顶层且 status 定义为 string,导致反查恒失败、订单永远停在待支付。
func TestXPayOrderInfoUnmarshal(t *testing.T) {
raw := []byte(`{
"errcode": 0,
"errmsg": "",
"order": {
"order_id": "OD20260914014559fc1cfee91b3748a2",
"wx_order_id": "wx_order_1",
"status": 2,
"order_fee": 990,
"paid_fee": 990,
"order_type": 0,
"refund_fee": 0,
"left_fee": 990,
"env_type": 2,
"biz_meta": "monthly_vip"
}
}`)
var info XPayOrderInfo
if err := json.Unmarshal(raw, &info); err != nil {
t.Fatalf("unmarshal query_order: %v", err)
}
if info.Order.Status != XPayOrderStatusPaid {
t.Fatalf("status = %d, want %d", info.Order.Status, XPayOrderStatusPaid)
}
if info.Order.PaidFee != 990 {
t.Fatalf("paid_fee = %d, want 990", info.Order.PaidFee)
}
if info.Order.OrderID != "OD20260914014559fc1cfee91b3748a2" {
t.Fatalf("order_id = %q", info.Order.OrderID)
}
if !IsOrderPaidStatus(info.Order.Status) {
t.Fatalf("IsOrderPaidStatus(%d) = false, want true", info.Order.Status)
}
}
// TestResolveEnvKey 校验环境自动选择规则:只填现网/只填沙箱/两把都填/两把都空。
func TestResolveEnvKey(t *testing.T) {
// 只填现网 -> 现网