diff --git a/xy-shanghai/example_test.go b/xy-shanghai/example_test.go new file mode 100644 index 0000000..801e965 --- /dev/null +++ b/xy-shanghai/example_test.go @@ -0,0 +1,125 @@ +package xyshanghai + +import ( + "context" + "encoding/json" + "fmt" + "testing" + "time" +) + +// 测试用的密钥和盐值(仅用于测试,生产环境需安全保管) +var ( + testSM4Key = []byte("1234567890abcdef") // 16 字节 + testSM3Salt = []byte("test-salt") +) + +func newTestClient() *Client { + return NewClient( + WithBaseURL("http://localhost:8080"), + WithTimeout(5*time.Second), + WithSM4Key(testSM4Key), + WithSM3Salt(testSM3Salt), + ) +} + +// TestCreateOrder 测试卡券/直充权益下单接口。 +func TestCreateOrder(t *testing.T) { + client := newTestClient() + req := &CreateOrderRequest{ + ActCode: "ACT001", + GoodsCode: "123456", + ActOrderNum: "00001", + Account: "19912345678", + CallbackURL: "https://example.com/notice", + } + resp, err := client.CreateOrder(context.Background(), req) + if err != nil { + t.Fatalf("CreateOrder failed: %v", err) + } + if resp.Code != 0 { + t.Fatalf("unexpected code: %d, msg: %s", resp.Code, resp.Msg) + } + // 解密 data 并解析 + var data CreateOrderResponseData + if err := json.Unmarshal([]byte(resp.Data), &data); err != nil { + t.Fatalf("unmarshal response data: %v", err) + } + fmt.Printf("OrderNo: %s, Status: %d\n", data.OrderNo, data.Status) +} + +// TestQueryOrder 测试订单查询接口。 +func TestQueryOrder(t *testing.T) { + client := newTestClient() + req := &QueryOrderRequest{ + ActCode: "FBG6vdYqGE4mGX7EH/woEg==", + OrderNo: "HM1757046717684000102707339840b23222", + } + resp, err := client.QueryOrder(context.Background(), req) + if err != nil { + t.Fatalf("QueryOrder failed: %v", err) + } + if resp.Code != 0 { + t.Fatalf("unexpected code: %d, msg: %s", resp.Code, resp.Msg) + } + var data QueryOrderResponseData + if err := json.Unmarshal([]byte(resp.Data), &data); err != nil { + t.Fatalf("unmarshal response data: %v", err) + } + fmt.Printf("OrderNo: %s, Status: %d\n", data.OrderNo, data.Status) +} + +// TestRechargeOrder 测试微信立减金充值接口。 +func TestRechargeOrder(t *testing.T) { + client := newTestClient() + req := &RechargeOrderRequest{ + ActCode: "FBG6vdYqGE4mGX7EH/woEg==", + GoodsCode: "0001", + ActOrderNum: "0001", + OpenID: "0001", + AppID: "00001", + } + resp, err := client.RechargeOrder(context.Background(), req) + if err != nil { + t.Fatalf("RechargeOrder failed: %v", err) + } + if resp.Code != 0 { + t.Fatalf("unexpected code: %d, msg: %s", resp.Code, resp.Msg) + } + var data RechargeOrderResponseData + if err := json.Unmarshal([]byte(resp.Data), &data); err != nil { + t.Fatalf("unmarshal response data: %v", err) + } + fmt.Printf("OrderNo: %s, Status: %d, CouponID: %s\n", data.OrderNo, data.Status, data.CouponID) +} + +// TestParseCallbackRequest 测试回调请求解析。 +func TestParseCallbackRequest(t *testing.T) { + client := newTestClient() + + // 模拟回调请求参数 + bizData := CallbackBizData{ + OrderNo: "HM202509291010001", + ActOrderNum: "XY2025092910100001", + Status: 3, + Account: "19912345678", + } + bizJSON, _ := json.Marshal(bizData) + encrypted, _ := SM4Encrypt(testSM4Key, bizJSON) + timestamp := fmt.Sprintf("%d", time.Now().UnixMilli()) + sign := SM3WithSalt(testSM3Salt, timestamp+string(encrypted)) + + // 解析 + decrypted, err := client.ParseCallbackRequest(timestamp, sign, string(encrypted)) + if err != nil { + t.Fatalf("ParseCallbackRequest failed: %v", err) + } + var parsed CallbackBizData + if err := json.Unmarshal([]byte(decrypted), &parsed); err != nil { + t.Fatalf("unmarshal callback data: %v", err) + } + if parsed.OrderNo != "HM202509291010001" { + t.Fatalf("unexpected orderNo: %s", parsed.OrderNo) + } + fmt.Printf("Callback parsed successfully: %+v\n", parsed) +} \ No newline at end of file