From 5cf434370e58c397d22d34737f8ead659f3cae26 Mon Sep 17 00:00:00 2001 From: danial Date: Sun, 14 Dec 2025 22:13:42 +0800 Subject: [PATCH] =?UTF-8?q?chore(deps):=20=E5=8D=87=E7=BA=A7Go=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=8A=E7=AC=AC=E4=B8=89=E6=96=B9=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将Go版本从1.20升级到1.23.0 - 添加resty客户端库github.com/go-resty/resty/v2 v2.17.0 - 升级go-nanoid库版本到v2.1.0 - 添加golang.org/x/net v0.43.0为间接依赖 - 升级testify测试库到v1.9.0 - 升级yaml.v3到v3.0.1版本 feat(main): 使用resty替代http客户端并提高请求并发 - 用resty库替代原始http.Client实现POST请求 - 修改支付网关和通知URL为测试环境地址 - 将并发请求数从10提升到100以增加负载 - 修正请求参数ProductCode为“玖隆” - 调整请求发送及结果打印逻辑以兼容resty响应结构 --- CLAUDE.md | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 9 ++++- go.sum | 25 +++++++------ main.go | 16 ++++---- 4 files changed, 136 insertions(+), 22 deletions(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3d23dd3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,108 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is a Go-based load testing script (卡密并发脚本) designed for stress testing payment gateways. The script generates concurrent requests with random card numbers and credentials to test system performance under load. + +## Architecture + +### Core Components + +- **main.go**: Entry point containing the main concurrency logic and request generation +- **models/**: Data structures for API requests + - `model.go`: Core request data structures (`Data`, `ExValue`) with URL encoding + - `order.go`: Order parameter encryption (`OrderParams`) + - `account.go`: Account-related models +- **utils/**: Utility functions + - `enctrypt.go`: AES-CBC encryption with PKCS7 padding for sensitive data + +### Key Functions + +- **randomRequest()** (main.go:76): Generates individual HTTP requests with random card data +- **genSign()** (main.go:47): Creates MD5 signature for API authentication using sorted parameter concatenation +- **GenRandomCardNo()** (main.go:31): Generates random 16-digit card numbers starting with "250306" +- **GenRandomCardPass()** (main.go:39): Generates random 16-digit card passwords starting with "350610" + +### Request Flow + +1. Generate unique order ID using nanoid +2. Create random card number and password +3. Build request parameters with hardcoded credentials +4. Generate MD5 signature using parameter sorting and app secret +5. Send POST request to external gateway +6. Process and display response + +## Development Commands + +### Build and Run +```bash +# Build the application +go build -o kami_script + +# Run directly +go run main.go + +# Run with specific parameters if modified +go run main.go -concurrency=50 -requests=1000 +``` + +### Testing +```bash +# Run tests (if any exist) +go test ./... + +# Run with verbose output +go test -v ./... + +# Check code coverage +go test -cover ./... +``` + +### Dependency Management +```bash +# Download dependencies +go mod download + +# Tidy up go.mod +go mod tidy + +# Verify dependencies +go mod verify +``` + +### Code Quality +```bash +# Format code +go fmt ./... + +# Lint code +go vet ./... + +# Check for issues +golint ./... +``` + +## Configuration + +### Hardcoded Values +- App Secret: `"ssssc9kit6bimggos5kk0c9g"` (main.go:48) +- Pay Key: `"kkkkc9kit6bimggos5kk0c90"` (main.go:98) +- Gateway URL: `"https://gateway.oceanpay.cc/gateway/scan"` (main.go:104) +- Notify URL: `"https://shop.oceanpay.cc/shop/notify"` (main.go:97) +- AES Encryption Key: `"thisis32bitlongpassphraseimusing"` (models/order.go:24) +- AES IV: `"1234567890123456"` (models/order.go:26) + +### Concurrency Settings +- Default buffer channel size: 50 (main.go:112) +- Default request count: 10^1 = 10 (main.go:113) + +## Important Notes + +- This script is designed for load testing purposes only +- Contains hardcoded credentials and encryption keys +- Uses goroutines with sync.WaitGroup for concurrent request handling +- Implements panic recovery in goroutines to prevent crashes +- All requests generate random card data for testing uniqueness +- Signature generation follows specific parameter sorting algorithm for API compatibility \ No newline at end of file diff --git a/go.mod b/go.mod index 980e79c..5e7e7a3 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,10 @@ module kami_scripts -go 1.20 +go 1.23.0 -require github.com/matoous/go-nanoid/v2 v2.0.0 +require ( + github.com/go-resty/resty/v2 v2.17.0 + github.com/matoous/go-nanoid/v2 v2.1.0 +) + +require golang.org/x/net v0.43.0 // indirect diff --git a/go.sum b/go.sum index 3fbbbff..023123f 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,16 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= -github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0= -github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-resty/resty/v2 v2.17.0 h1:pW9DeXcaL4Rrym4EZ8v7L19zZiIlWPg5YXAcVmt+gN0= +github.com/go-resty/resty/v2 v2.17.0/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= +github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU669bE= +github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index d669f9b..dee1a35 100644 --- a/main.go +++ b/main.go @@ -5,16 +5,15 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io" "kami_scripts/models" "math" "math/rand" - "net/http" "sort" "strconv" "sync" "time" + "github.com/go-resty/resty/v2" gonanoid "github.com/matoous/go-nanoid/v2" ) @@ -92,25 +91,24 @@ func randomRequest(count int, stop chan int, group *sync.WaitGroup) { OrderNo: id, OrderPeriod: strconv.Itoa(rand.Intn(24)), OrderPrice: "10", - ProductCode: "fdsu", + ProductCode: "玖隆", Ip: "127.0.0.1", - NotifyUrl: "https://shop.oceanpay.cc/shop/notify", + NotifyUrl: "http://kami_shop:12305/shop/notify", PayKey: "kkkkc9kit6bimggos5kk0c90", TimeStamp: strconv.FormatInt(time.Now().Unix(), 10), Sign: "", } formData.Sign = genSign(formData) - client := http.Client{} - res, _ := client.PostForm("https://gateway.oceanpay.cc/gateway/scan", formData.Url()) - result, _ := io.ReadAll(res.Body) - fmt.Println(string(result)) + client := resty.New() + resp, _ := client.R().SetFormDataFromValues(formData.Url()).Post("http://49.233.216.171:12309/gateway/scan") + fmt.Println(string(resp.Body())) } func main() { group := sync.WaitGroup{} startTime := time.Now() stop := make(chan int, 50) - for i := 0; i < int(math.Pow10(1)); i++ { + for i := 0; i < int(math.Pow10(2)); i++ { group.Add(1) stop <- 1 go randomRequest(i, stop, &group)