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  }