diff --git a/api/v1/key/key_test.go b/api/v1/key/key_test.go index 390d390..22a2062 100644 --- a/api/v1/key/key_test.go +++ b/api/v1/key/key_test.go @@ -33,6 +33,51 @@ func newCore() *Key { return &k } +func TestGetRequestBody(t *testing.T) { + + c := newCore() + + request := &NotifyData{ + NotifyId: "1111", + OutBizNo: "1111", + TradeNo: "1111", + Key: "1111", + UsableNum: 1, + UsageNum: 1, + Status: 1, + Url: "1", + Amount: 0, + PayAmount: 0, + PayTime: "1", + SettlementPrice: 0, + ValidBeginTime: "1", + ValidEndTime: "1", + UsageTime: "1", + DiscardTime: "1", + Account: "1", + OrderInfo: OrderInfo{ + OrderNo: "1", + Account: "1", + }, + } + _, b, err := c.GetRequestBody(context.Background(), request) + if err != nil { + t.Error(err) + return + } + + t.Logf("data=%s", string(b)) + + var p core.Params + if err = json.Unmarshal(b, &p); err != nil { + t.Error(err) + return + } + + ok := c.Verify(p.Timestamp, p.Ciphertext, p.Sign) + t.Log("verify result:", ok) +} + func TestOrder(t *testing.T) { c := newCore() @@ -123,10 +168,33 @@ func TestResponse(t *testing.T) { t.Logf("%+v", result) } +func TestNotify(t *testing.T) { + + client := newCore() + + reqStr := `{"data": {"url": "https://market.86698.cn/dpK5jqYvPNdAdX0W", "status": 2, "trade_no": "753998793059999745", "notify_id": "845594378564157441", "usage_num": 1, "out_biz_no": "CT2025032321122150383448", "usable_num": 1, "usage_time": "2025-11-19 09:30:10", "valid_end_time": "2025-05-31 23:59:59", "settlement_price": 1.7, "valid_begin_time": "2025-02-19 14:39:15"}, "sign": "EYkEtc7OXkjoHxVrH0PNdRSzWCEB+PmpAi5opgeqqlpdNg0CXoIDkdHEKRtdIanuHNAEHutlIfIODsS+ZWZfCd6wGoDpCxCdzUW2OdHrMAq4TVzqdSxn9e4WBy+B4UWKgXyqgcLMn4/gBZpF3o12qtO06t/xZwNmMMSGtGocJybr6yMBWDAu2gQ5gFKPsVPIwF3DiIeg5nS09HW1St6UZtqUv5T7g8s+tVwsWtsnyplIeqTnyrrZel8rRYP/UHzkl32cWa4aToeyl5eO0uhAexf4GjuqC95pUumU7vde0iwOZSc6FqwQgWVO/AMhOGf4eYFMBU2Iomriidyo8Sn1qA==", "app_id": "UTBoBcAgWSRQ", "sign_type": "RSA", "timestamp": "2025-11-19 09:30:10"}` + + req := &Notify{} + + err := json.Unmarshal([]byte(reqStr), req) + if err != nil { + t.Error(err) + } + if err = req.Validate(); err != nil { + t.Error(err) + } + + rsp, err := client.Notify(context.Background(), req) + if err != nil { + t.Error(err) + } + t.Log(rsp) +} + func TestCallBack(t *testing.T) { - reqStr := `{"data": {"url": "https://gateway.dev.cdlsxd.cn/yxh5/dpK5ly6oVVE2AM0W", "status": 2, "account": "18479266021", "trade_no": "794167617429315585", "notify_id": "7345294954732199936", "usage_num": 0, "out_biz_no": "0627002001", "usable_num": 2, "usage_time": "2025-06-30 11:39:46", "valid_end_time": "2026-06-30 23:59:59", "settlement_price": 2, "valid_begin_time": "2025-06-24 11:00:08"}, "sign": "XLwRQ12EBXSGOSVzUMXwjSlKP88P4Odhe6c9MrfaszKLe+3HtPTeB6QWvyAmXGeIvsy02P0YtcOYV4xQHlWo3Uh5FZc6IJU/+KN+xVnn/DlFLpc+DhCKw6o4hYv+eLLyshjFZPZYVUU2I2YmkI1ZlwBaufsB+N9ds8gBz5+hELn17/qcFcbO6pYOd2te7xmJSGKOAMn0q2c2DSvTLvyQXhKUlDZfUZZGBOc1LGChy9CHc7Z/0E8/p2YYTlMPnvk0VHjEjV5sJxDnXwhSZqE7f3mRx0IN3au3VtZnXJsgl/whxdTyab9dYpfIxK75bS0mjncdqxGf1hLdhYJhTx8bog==", "app_id": "lzm", "sign_type": "RSA", "timestamp": "2025-06-30 11:39:46"}` - headerStr := `{"Sign": ["Boj6IrOOrRATJt0IBE+z5Ie/g4mo3MZk+JpJ4bLYoBbDfMqvgTBhxqiC8CheRm/nEF9iFFJCvq9S0dL25fLexQ1k5AxE3cX1+qR5fCRdaiZvqWG4jaXOjUUW8K7fQ9g5ii6T4b3cWp71FBHiG3ZH5XohM9JuLo3W17MxrizsLLD0euGROAY3bXcakVustto07V3i0g59+ajsCTTdxF/gNcrsO5a3eTJ8CTSDnMgpwqMbU+E9YMX1zGFH/+m/RtL9s8tLRf8j4T/t8g6b94JfvBv+Fu1wV4eMUO7H4Iv0LJ1TL8qMBkWul5BbwGxSdEGQoWU0CIAehYTfR5meKxTOTQ=="], "Appid": ["lzm"], "Version": ["1.0"], "Sign-Type": ["RSA"], "Timestamp": ["2025-06-30 11:39:46"], "Content-Type": ["application/json"]}` + reqStr := `{"data": {"url": "https://market.86698.cn/dpK5jqYvPNdAdX0W", "status": 2, "trade_no": "753998793059999745", "notify_id": "845594378564157441", "usage_num": 1, "out_biz_no": "CT2025032321122150383448", "usable_num": 1, "usage_time": "2025-11-19 09:30:10", "valid_end_time": "2025-05-31 23:59:59", "settlement_price": 1.7, "valid_begin_time": "2025-02-19 14:39:15"}, "sign": "EYkEtc7OXkjoHxVrH0PNdRSzWCEB+PmpAi5opgeqqlpdNg0CXoIDkdHEKRtdIanuHNAEHutlIfIODsS+ZWZfCd6wGoDpCxCdzUW2OdHrMAq4TVzqdSxn9e4WBy+B4UWKgXyqgcLMn4/gBZpF3o12qtO06t/xZwNmMMSGtGocJybr6yMBWDAu2gQ5gFKPsVPIwF3DiIeg5nS09HW1St6UZtqUv5T7g8s+tVwsWtsnyplIeqTnyrrZel8rRYP/UHzkl32cWa4aToeyl5eO0uhAexf4GjuqC95pUumU7vde0iwOZSc6FqwQgWVO/AMhOGf4eYFMBU2Iomriidyo8Sn1qA==", "app_id": "UTBoBcAgWSRQ", "sign_type": "RSA", "timestamp": "2025-11-19 09:30:10"}` + headerStr := `{"Sign": ["ty0dtWdEFMWOXv6sIMABmN4XKcgSqq1sBlKG2ovQz6zBERWVKgbks7mFkvIcB6ZisZDRiDTVc5k/qTtj712k+0VtPleSHxat8VrOOG/G/geRpKz+Gg/bJXWVhGM0iJeIE5cwcz+XdZFi7kY4UPu9eDIF0v8BUwYkIORUunMP8QvVnB3jf/W32VNvS3kmfB8+9mhNvIoxrvTfQ01E+PP4tms/ZQAcsr7n66A5YA82yPxVeciZnxDjHipxFyldpZlRUrH4Dy+903k6n4dXS1aohpxK4xkNu54dl9qobSkkHKodQy4ToV7ZetUKIqXV63PUHY9t2W40uSQ307oNcLvSDQ=="], "Appid": ["UTBoBcAgWSRQ"], "Version": ["1.0"], "Sign-Type": ["RSA"], "Timestamp": ["2025-11-19 09:30:10"], "Content-Type": ["application/json"]}` var headers http.Header if err := json.Unmarshal([]byte(headerStr), &headers); err != nil { diff --git a/api/v1/key/models.go b/api/v1/key/models.go index fec9fd6..0ec8faa 100644 --- a/api/v1/key/models.go +++ b/api/v1/key/models.go @@ -103,24 +103,31 @@ func (d *DiscardRequest) Validate() error { return nil } +// OrderInfo 兑换订单信息 +type OrderInfo struct { + OrderNo string `json:"order_no"` // 平台系统兑换订单号 + Account string `json:"account,omitempty"` // 兑换账号,卡密平台下发无该数据 +} + type NotifyData struct { - NotifyId string `json:"notify_id" validate:"required,alphanum,min=2,max=32"` - OutBizNo string `json:"out_biz_no" validate:"required,alphanum,min=2,max=32"` - TradeNo string `json:"trade_no" validate:"required,alphanum,min=2,max=32"` - Key string `json:"key,omitempty"` - UsableNum uint32 `json:"usable_num"` - UsageNum uint32 `json:"usage_num"` - Status Status `json:"status" validate:"required"` - Url string `json:"url,omitempty"` - Amount float32 `json:"amount,omitempty"` - PayAmount float32 `json:"pay_amount,omitempty"` - PayTime string `json:"pay_time,omitempty"` - SettlementPrice float32 `json:"settlement_price,omitempty"` - ValidBeginTime string `json:"valid_begin_time,omitempty"` - ValidEndTime string `json:"valid_end_time,omitempty"` - UsageTime string `json:"usage_time,omitempty"` - DiscardTime string `json:"discard_time,omitempty"` - Account string `json:"account,omitempty"` // 可兑换账号 + NotifyId string `json:"notify_id" validate:"required,alphanum,min=2,max=32"` + OutBizNo string `json:"out_biz_no" validate:"required,alphanum,min=2,max=32"` + TradeNo string `json:"trade_no" validate:"required,alphanum,min=2,max=32"` + Key string `json:"key,omitempty"` + UsableNum uint32 `json:"usable_num"` + UsageNum uint32 `json:"usage_num"` + Status Status `json:"status" validate:"required"` + Url string `json:"url,omitempty"` + Amount float32 `json:"amount,omitempty"` + PayAmount float32 `json:"pay_amount,omitempty"` + PayTime string `json:"pay_time,omitempty"` + SettlementPrice float32 `json:"settlement_price,omitempty"` + ValidBeginTime string `json:"valid_begin_time,omitempty"` + ValidEndTime string `json:"valid_end_time,omitempty"` + UsageTime string `json:"usage_time,omitempty"` + DiscardTime string `json:"discard_time,omitempty"` + Account string `json:"account,omitempty"` // 可兑换账号 + OrderInfo OrderInfo `json:"order_info,omitempty"` } type Notify struct { AppId string `json:"app_id" validate:"required"` @@ -182,23 +189,25 @@ func (a *Notify) SignString() string { return a.AppId + a.Timestamp + string(b) } +// Data 查询响应数据 type Data struct { - OutBizNo string `json:"out_biz_no"` - TradeNo string `json:"trade_no"` - Key string `json:"key"` - UsableNum uint32 `json:"usable_num"` - UsageNum uint32 `json:"usage_num"` - Status Status `json:"status"` - Url string `json:"url"` - Amount float32 `json:"amount,omitempty"` - PayAmount float32 `json:"pay_amount,omitempty"` - PayTime string `json:"pay_time,omitempty"` - SettlementPrice float32 `json:"settlement_price,omitempty"` - ValidBeginTime string `json:"valid_begin_time,omitempty"` - ValidEndTime string `json:"valid_end_time,omitempty"` - UsageTime string `json:"usage_time,omitempty"` - DiscardTime string `json:"discard_time,omitempty"` - Account string `json:"account,omitempty"` // 可兑换账号 + OutBizNo string `json:"out_biz_no"` + TradeNo string `json:"trade_no"` + Key string `json:"key,omitempty"` + UsableNum uint32 `json:"usable_num,omitempty"` + UsageNum uint32 `json:"usage_num,omitempty"` + Status Status `json:"status,omitempty"` + Url string `json:"url,omitempty"` + Amount float32 `json:"amount,omitempty"` + PayAmount float32 `json:"pay_amount,omitempty"` + PayTime string `json:"pay_time,omitempty"` + SettlementPrice float32 `json:"settlement_price,omitempty"` + ValidBeginTime string `json:"valid_begin_time,omitempty"` + ValidEndTime string `json:"valid_end_time,omitempty"` + UsageTime string `json:"usage_time,omitempty"` + DiscardTime string `json:"discard_time,omitempty"` + Account string `json:"account,omitempty"` // 可兑换账号 + OrderInfoArr []OrderInfo `json:"order_info_arr,omitempty"` } func ConvertData(b []byte) (*Data, error) { diff --git a/cmd/rsa/main.go b/cmd/rsa/main.go index 57c513d..85e2ac4 100644 --- a/cmd/rsa/main.go +++ b/cmd/rsa/main.go @@ -7,10 +7,10 @@ import ( func main() { n := rsa.NewGenerateKey() - err := n.SavePem("../../pem") - if err != nil { - panic(err) - } + //err := n.SavePem("../../pem") + //if err != nil { + // panic(err) + //} privateKeyStr, publicKeyStr := n.GetKey() fmt.Println("privateKeyStr=", privateKeyStr) fmt.Println("publicKeyStr=", publicKeyStr) diff --git a/core/core_test.go b/core/core_test.go index 5242eb2..b914dbf 100644 --- a/core/core_test.go +++ b/core/core_test.go @@ -6,6 +6,82 @@ import ( "time" ) +func TestRSADecode(t *testing.T) { + c := Config{ + AppID: "KY7gREqQ96Phxhcvj8es7B6e", + PrivateKey: "MIIEowIBAAKCAQEA4YYRanaqAryAxemV+A9UfbKglFapYPsH9MSR83hwrE1we4hG47sN2f+agT6DF1vnb7MocChQzs0puJzJLHY53FK00fOgSmQ7IoE2cB/ywabNm4ynVMuJD0QCumb9m6wd9vT47R6eKL5ZQ5lP0pzPjw632rzQfOwTGAQeq6Sg9R73NQbL3r6Kk0KorTgF6F+in0PwAiaSoKSKMPcF2sNdZONtPcx2XAEt/5DHz4XkgCEVtxZCw1/lJegjlP8j/8Uy4BjOSxAWMrIu3C9kJxP2Dftc8bBFs8YVEA019Q2IP22Ws35QgnQ9+YyesPLLnJgjLkifsNgSj457+LlWR/rtOQIDAQABAoIBAQCXM47LpUF40i84AdLlXEnWeIOG0M+A0O1VotEDvnU0YDsQ5543orq3tNI+4s17RMfXMPPktnLvI8hcGOob4CwM1nqa5M9L8QVgreb0p8bXJOFm75dkl42N6Zg2p0RTMcNpRnb6a3O4d15bnxdQaogSLtj/U2YoyxJGIMT7aUXs8JK0AaZNTdjqeoJIxuRSYQ+Viu3nBuCqhMKeh579kFs4/8DD/+fADSa39w1skW0U064Ou0jKjqK8+rNTdx1ANyoxe2/9AJjLggIosswJStfI9BmPgd9MtATmi/DN7ceXNyfDqtyLgWmJD+Iad7XQFXrDSxUPbV7xVBK0N9Zz9+LxAoGBAO6zJZMIAGPwROZKNj7WmhjCNEdUBrV2zZHNo0ABwu+eeyrlX9dyf7Kg2O8j+wWs4lcQoDMjopaSoDCqlYBGAOEuTATbinhzURyT1+mMDRd3tHvaGB0xVSDCg9MKDOnXTSAI049Rw4qy4gxLw0aDOYVyQVeaRKOeICyQ2S/UZ4ktAoGBAPHec36J5L+k3WVVejMyh8xBjKucbPJ2QSQxprHovINq4fiZGoBHJWA8hnF4xffb8HO+1hSfs7iUnNpqUF9qqsq5uFEEFRJQHEVkabL92MKQW6oTvB/3AtuYo1ieL4Ri/s+p72GD2sEF85vfXoNMy9kGGTxuxXSaJcphANZh36O9AoGAHq2pq58ApdeQk2SAWk0smvgCzhQPlK0DOLUMQUK4siFVRSsbyU3u+Z9QolOmhJE2uefqHwh6cg3ARuD1u/nDTS2tGYa54kc36otZ2atlV1nMOYrLRJ09iqtVU/9br4Y7ZF2eCzKABkh9YwUtwNdGwk7v9PlfzwOYsQGg2FPdRrUCgYB7kkZ5kOPw0b9XRWuQerGMtrSy/NFgsvAnGMLsxFaD4fifdUFn5nF/EI0zrhuevZzE1ew0Tz+X/z2ADa8QgMPPnUFBCw/k8k7vWRTzoOO8y9o5M6n6vs2T+hECdpcaUSWUXWLy9FWwJmVG7sEv3e2L7KS6DnINV7AVDKhL32dOFQKBgBGsKG+W6Qs90qFZ92oF138csK1ewop4Fl8JiORQAVicEp1F7rd9HDZ+yn6VqkYI3eJ7W77IQPRAb39Nm36ebY/iiZ1q1b3VMzNPWk0JtLSUTR8asihn6UB/3phQE+dtmVgqqwTuV+J8l7Tor4JPACWTo2A72qbkNV923Y/Jzb0W", + PublicKey: "MIIBCgKCAQEA4YYRanaqAryAxemV+A9UfbKglFapYPsH9MSR83hwrE1we4hG47sN2f+agT6DF1vnb7MocChQzs0puJzJLHY53FK00fOgSmQ7IoE2cB/ywabNm4ynVMuJD0QCumb9m6wd9vT47R6eKL5ZQ5lP0pzPjw632rzQfOwTGAQeq6Sg9R73NQbL3r6Kk0KorTgF6F+in0PwAiaSoKSKMPcF2sNdZONtPcx2XAEt/5DHz4XkgCEVtxZCw1/lJegjlP8j/8Uy4BjOSxAWMrIu3C9kJxP2Dftc8bBFs8YVEA019Q2IP22Ws35QgnQ9+YyesPLLnJgjLkifsNgSj457+LlWR/rtOQIDAQAB", + Key: "941862746dc51adf517be9f820b4e558", + SignType: SignRSA, + BaseURL: "http://127.0.0.1:9000", + } + + httpClient := &http.Client{ + Timeout: time.Second * 10, + } + core, err := NewCore(&c, WithHttpClient(httpClient)) + if err != nil { + t.Error(err) + return + } + + ciphertexts := []string{ + "Avf1QExKRhCLkSkfVsqABmbN8k89B6hsolfM7Atmdn3aiMl8AiwjK6TWvp9q/VQDmW7E3pi23+K3JVbv5u5eRQo0zzelzVLZb6zpNlGEJqvd23Ze3RpIZJJhfoerhXThbAkt5dFLNsoSy7vmt73vVA==", + "OX3577Ru7VyZSfeJN6sI3xalL2xGW/kO4kwLYyIxykT0vZz4hwI8yg5JtfI4WILBmW7E3pi23+K3JVbv5u5eRQo0zzelzVLZb6zpNlGEJquBnHi5ejbF63SWCKJrU3NSmp65whhwZj1YrxnVaRf0BQ==", + "h1yrzbvCBtiUjFwXP/+Kue0gl4/gklv4Mha+fVJtwT6EA+o85aDwfQhkzkWIba09mW7E3pi23+K3JVbv5u5eRQo0zzelzVLZb6zpNlGEJqv+rBy30uT37E+0wjgk9IKKHGucOtLZ818cOSbaRcuf/g==", + "WnRBvE4qAdrWMs8yGXkHXsRk6v9bf4nP6aWtnW/VgJqEA+o85aDwfQhkzkWIba09mW7E3pi23+K3JVbv5u5eRQo0zzelzVLZb6zpNlGEJqteK4sShwziQaN9P5Kvp49v89lLLc5N6se1C5p/nFkIqQ==", + "QxPlK33+blw9nYi7hkuWxp3dLDhu0wRQuP3N/rm7ylgS5xzRiIuhQrBLaZ39wcbMZYJIUNHmaYd0mpo4fnUUVLt3cqtus8+Cz1zo5D2OrhB3ltBKRNn/gsybc6IpH1zR+28CST0YVxhrFkAy7mjCwg==", + "oXcdSAsVb0hgOXuTG4BDPDAn6Q4ZU0JexYElEgI3Tq+EA+o85aDwfQhkzkWIba09mW7E3pi23+K3JVbv5u5eRQo0zzelzVLZb6zpNlGEJqvdcwL8USD/g6c0srPYJxVW9nK/W4FQucUqdS30qN7E4g==", + "h3wu3LA4J67kRQ83dW0D/TGcJMAPwY3T6t+klVmntkWEA+o85aDwfQhkzkWIba09mW7E3pi23+K3JVbv5u5eRQo0zzelzVLZb6zpNlGEJqvtKEu3lpUuSGc3y4sJ34lZPCFUg9gnGKG0JIM/gwo0vg==", + "OE/NlJh8d17KDlMieOdz0eSapHIlCDV73peCh2bImAfnxKILn3T5x7VdXkr6QXVW", + "OE/NlJh8d17KDlMieOdz0aZ2qA8uLQa1uJIl+OKi1tr2X0J0wTI4/d8OlVt9n4zk", + "OE/NlJh8d17KDlMieOdz0bXpG9yJj1kt7IZVTZl2T2q278xMqsnrn8X9LxjUE4m+", + } + for index, ciphertext := range ciphertexts { + e, err := core.CryptographySuite.Cipher.Decode(ciphertext) + if err != nil { + t.Errorf("解密失败,index:%d", index+1) + } + t.Logf("解密成功: %s", e) + } + +} + +func TestRSADecodeVerify(t *testing.T) { + c := Config{ + AppID: "JLYPGHBSDKok", + PrivateKey: "MIIEowIBAAKCAQEA4YYRanaqAryAxemV+A9UfbKglFapYPsH9MSR83hwrE1we4hG47sN2f+agT6DF1vnb7MocChQzs0puJzJLHY53FK00fOgSmQ7IoE2cB/ywabNm4ynVMuJD0QCumb9m6wd9vT47R6eKL5ZQ5lP0pzPjw632rzQfOwTGAQeq6Sg9R73NQbL3r6Kk0KorTgF6F+in0PwAiaSoKSKMPcF2sNdZONtPcx2XAEt/5DHz4XkgCEVtxZCw1/lJegjlP8j/8Uy4BjOSxAWMrIu3C9kJxP2Dftc8bBFs8YVEA019Q2IP22Ws35QgnQ9+YyesPLLnJgjLkifsNgSj457+LlWR/rtOQIDAQABAoIBAQCXM47LpUF40i84AdLlXEnWeIOG0M+A0O1VotEDvnU0YDsQ5543orq3tNI+4s17RMfXMPPktnLvI8hcGOob4CwM1nqa5M9L8QVgreb0p8bXJOFm75dkl42N6Zg2p0RTMcNpRnb6a3O4d15bnxdQaogSLtj/U2YoyxJGIMT7aUXs8JK0AaZNTdjqeoJIxuRSYQ+Viu3nBuCqhMKeh579kFs4/8DD/+fADSa39w1skW0U064Ou0jKjqK8+rNTdx1ANyoxe2/9AJjLggIosswJStfI9BmPgd9MtATmi/DN7ceXNyfDqtyLgWmJD+Iad7XQFXrDSxUPbV7xVBK0N9Zz9+LxAoGBAO6zJZMIAGPwROZKNj7WmhjCNEdUBrV2zZHNo0ABwu+eeyrlX9dyf7Kg2O8j+wWs4lcQoDMjopaSoDCqlYBGAOEuTATbinhzURyT1+mMDRd3tHvaGB0xVSDCg9MKDOnXTSAI049Rw4qy4gxLw0aDOYVyQVeaRKOeICyQ2S/UZ4ktAoGBAPHec36J5L+k3WVVejMyh8xBjKucbPJ2QSQxprHovINq4fiZGoBHJWA8hnF4xffb8HO+1hSfs7iUnNpqUF9qqsq5uFEEFRJQHEVkabL92MKQW6oTvB/3AtuYo1ieL4Ri/s+p72GD2sEF85vfXoNMy9kGGTxuxXSaJcphANZh36O9AoGAHq2pq58ApdeQk2SAWk0smvgCzhQPlK0DOLUMQUK4siFVRSsbyU3u+Z9QolOmhJE2uefqHwh6cg3ARuD1u/nDTS2tGYa54kc36otZ2atlV1nMOYrLRJ09iqtVU/9br4Y7ZF2eCzKABkh9YwUtwNdGwk7v9PlfzwOYsQGg2FPdRrUCgYB7kkZ5kOPw0b9XRWuQerGMtrSy/NFgsvAnGMLsxFaD4fifdUFn5nF/EI0zrhuevZzE1ew0Tz+X/z2ADa8QgMPPnUFBCw/k8k7vWRTzoOO8y9o5M6n6vs2T+hECdpcaUSWUXWLy9FWwJmVG7sEv3e2L7KS6DnINV7AVDKhL32dOFQKBgBGsKG+W6Qs90qFZ92oF138csK1ewop4Fl8JiORQAVicEp1F7rd9HDZ+yn6VqkYI3eJ7W77IQPRAb39Nm36ebY/iiZ1q1b3VMzNPWk0JtLSUTR8asihn6UB/3phQE+dtmVgqqwTuV+J8l7Tor4JPACWTo2A72qbkNV923Y/Jzb0W", + PublicKey: "MIIBCgKCAQEA4YYRanaqAryAxemV+A9UfbKglFapYPsH9MSR83hwrE1we4hG47sN2f+agT6DF1vnb7MocChQzs0puJzJLHY53FK00fOgSmQ7IoE2cB/ywabNm4ynVMuJD0QCumb9m6wd9vT47R6eKL5ZQ5lP0pzPjw632rzQfOwTGAQeq6Sg9R73NQbL3r6Kk0KorTgF6F+in0PwAiaSoKSKMPcF2sNdZONtPcx2XAEt/5DHz4XkgCEVtxZCw1/lJegjlP8j/8Uy4BjOSxAWMrIu3C9kJxP2Dftc8bBFs8YVEA019Q2IP22Ws35QgnQ9+YyesPLLnJgjLkifsNgSj457+LlWR/rtOQIDAQAB", + Key: "941862746dc51adf517be9f820b4e558", + SignType: SignRSA, + BaseURL: "http://127.0.0.1:9000", + } + + httpClient := &http.Client{ + Timeout: time.Second * 10, + } + core, err := NewCore(&c, WithHttpClient(httpClient)) + if err != nil { + t.Error(err) + return + } + + ciphertext := "aBOvDVJaym2ADd9IcE3LmeQ27JNzSx4W1eUveB1Jl3y4y/eGA+bpkTmM3J8GQ5kA" + timestamps := "2025-11-24 11:46:00" + dataToSign := c.AppID + timestamps + ciphertext + signature := "lP1O2btOLjWaOVF/XLfkoFKKIM+sWAEr7e/uiE7YUlhiu266QD/Zfg+eBZLIUX7xVSe3REvmjFfm9L3y3pfy5Rf0m18oJAvrK9eJ6nUOftTo53WeeZ+afGNUfbk434exx1Cb09S3AtH8u7idQqcIYR6b+qi2/gCoFooNxEjpUD66j3ixVaOxy3QlBLNrqORttKcsMwRpU+c3V3s1SSkGwSmOha9wEHRrU+hCELa5HjU0YvL2jWlMbqc6qPx2kuFkKMrfuGrKP1GvhPM+t9oeEOXlbll491TKmb934XTWBeC/mdwbpt+4zkHo+ElRK8P8QaqJH06GtAMoiQgX88HeEA==" + + e, err := core.CryptographySuite.Cipher.Decode(ciphertext) + if err != nil { + t.Error("解密失败") + } + t.Log(e) + b := core.CryptographySuite.Verifier.Verify(dataToSign, signature) + if !b { + t.Error("验签失败") + } +} + func TestRSASignVerify(t *testing.T) { c := Config{ AppID: "",