github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mch/core/sign_test.go (about) 1 package core 2 3 import ( 4 "bytes" 5 "crypto/md5" 6 "encoding/hex" 7 "hash" 8 "sort" 9 "testing" 10 ) 11 12 func TestSign(t *testing.T) { 13 params := map[string]string{ 14 "appid": "wxd930ea5d5a258f4f", 15 "mch_id": "10000100", 16 "device_info": "1000", 17 "body": "test", 18 "nonce_str": "ibuaiVcKdpRxkhJA", 19 } 20 apiKey := "192006250b4c09247ec02edce69f6a2d" 21 22 haveSignature := Sign(params, apiKey, nil) 23 wantSignature := "9A0A8659F005D6984697E2CA0A9CF3B7" 24 if haveSignature != wantSignature { 25 t.Errorf("signature mismatch, have %s, want %s", haveSignature, wantSignature) 26 return 27 } 28 } 29 30 func TestJsapiSign(t *testing.T) { 31 appId := "appId_value" 32 timeStamp := "123456789" 33 nonceStr := "nonceStr_value" 34 packageStr := "prepay_id=asdfasdfasdf" 35 signType := SignType_MD5 36 37 params := map[string]string{ 38 "appId": appId, 39 "timeStamp": timeStamp, 40 "nonceStr": nonceStr, 41 "package": packageStr, 42 "signType": signType, 43 } 44 apiKey := "192006250b4c09247ec02edce69f6a2d" 45 46 haveSignature := JsapiSign(appId, timeStamp, nonceStr, packageStr, signType, apiKey) 47 wantSignature := Sign(params, apiKey, nil) 48 if haveSignature != wantSignature { 49 t.Errorf("signature mismatch, have %s, want %s", haveSignature, wantSignature) 50 return 51 } 52 } 53 54 func BenchmarkSign(b *testing.B) { 55 b.StopTimer() 56 var ( 57 params = map[string]string{ 58 "asjdfsadfsadfasdfasd1": "sdfasdfasdfsadfsadfasdfasdfasd", 59 "asjdfsadfsadfasdfasd2": "sdfasdfasdfsadfsadfasdfasdfasd", 60 "asjdfsadfsadfasdfasd3": "sdfasdfasdfsadfsadfasdfasdfasd", 61 "asjdfsadfsadfasdfasd4": "sdfasdfasdfsadfsadfasdfasdfasd", 62 "asjdfsadfsadfasdfasd5": "sdfasdfasdfsadfsadfasdfasdfasd", 63 "asjdfsadfsadfasdfasd6": "sdfasdfasdfsadfsadfasdfasdfasd", 64 "asjdfsadfsadfasdfasd7": "sdfasdfasdfsadfsadfasdfasdfasd", 65 "asjdfsadfsadfasdfasd8": "sdfasdfasdfsadfsadfasdfasdfasd", 66 "asjdfsadfsadfasdfasd9": "sdfasdfasdfsadfsadfasdfasdfasd", 67 "asjdfsadfsadfasdfasd11": "sdfasdfasdfsadfsadfasdfasdfasd", 68 "asjdfsadfsadfasdfasd12": "sdfasdfasdfsadfsadfasdfasdfasd", 69 "asjdfsadfsadfasdfasd13": "sdfasdfasdfsadfsadfasdfasdfasd", 70 "asjdfsadfsadfasdfasd14": "sdfasdfasdfsadfsadfasdfasdfasd", 71 "asjdfsadfsadfasdfasd15": "sdfasdfasdfsadfsadfasdfasdfasd", 72 } 73 apiKey = "afadskfjaskldjflkasdjflkashdljkfhalsdjkfhl" 74 ) 75 b.ReportAllocs() 76 b.StartTimer() 77 for i := 0; i < b.N; i++ { 78 Sign(params, apiKey, nil) 79 } 80 } 81 82 func BenchmarkClassicalSign(b *testing.B) { 83 b.StopTimer() 84 var ( 85 params = map[string]string{ 86 "asjdfsadfsadfasdfasd1": "sdfasdfasdfsadfsadfasdfasdfasd", 87 "asjdfsadfsadfasdfasd2": "sdfasdfasdfsadfsadfasdfasdfasd", 88 "asjdfsadfsadfasdfasd3": "sdfasdfasdfsadfsadfasdfasdfasd", 89 "asjdfsadfsadfasdfasd4": "sdfasdfasdfsadfsadfasdfasdfasd", 90 "asjdfsadfsadfasdfasd5": "sdfasdfasdfsadfsadfasdfasdfasd", 91 "asjdfsadfsadfasdfasd6": "sdfasdfasdfsadfsadfasdfasdfasd", 92 "asjdfsadfsadfasdfasd7": "sdfasdfasdfsadfsadfasdfasdfasd", 93 "asjdfsadfsadfasdfasd8": "sdfasdfasdfsadfsadfasdfasdfasd", 94 "asjdfsadfsadfasdfasd9": "sdfasdfasdfsadfsadfasdfasdfasd", 95 "asjdfsadfsadfasdfasd11": "sdfasdfasdfsadfsadfasdfasdfasd", 96 "asjdfsadfsadfasdfasd12": "sdfasdfasdfsadfsadfasdfasdfasd", 97 "asjdfsadfsadfasdfasd13": "sdfasdfasdfsadfsadfasdfasdfasd", 98 "asjdfsadfsadfasdfasd14": "sdfasdfasdfsadfsadfasdfasdfasd", 99 "asjdfsadfsadfasdfasd15": "sdfasdfasdfsadfsadfasdfasdfasd", 100 } 101 apiKey = "afadskfjaskldjflkasdjflkashdljkfhalsdjkfhl" 102 ) 103 b.ReportAllocs() 104 b.StartTimer() 105 for i := 0; i < b.N; i++ { 106 ClassicalSign(params, apiKey, nil) 107 } 108 } 109 110 // 传统的签名代码, Sign 是优化后的代码, 要提高 30% 的速度 111 func ClassicalSign(params map[string]string, apiKey string, fn func() hash.Hash) string { 112 if fn == nil { 113 fn = md5.New 114 } 115 h := fn() 116 117 keys := make([]string, 0, len(params)) 118 for k := range params { 119 if k == "sign" { 120 continue 121 } 122 keys = append(keys, k) 123 } 124 sort.Strings(keys) 125 126 for _, k := range keys { 127 v := params[k] 128 if v == "" { 129 continue 130 } 131 h.Write([]byte(k)) 132 h.Write([]byte{'='}) 133 h.Write([]byte(v)) 134 h.Write([]byte{'&'}) 135 } 136 h.Write([]byte("key=")) 137 h.Write([]byte(apiKey)) 138 139 signature := make([]byte, hex.EncodedLen(h.Size())) 140 hex.Encode(signature, h.Sum(nil)) 141 return string(bytes.ToUpper(signature)) 142 }