修复虚拟支付
This commit is contained in:
@@ -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) {
|
||||
// 只填现网 -> 现网
|
||||
|
||||
Reference in New Issue
Block a user