github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/jssdk/sign_test.go (about)

     1  package jssdk
     2  
     3  import (
     4  	"bufio"
     5  	"crypto/sha1"
     6  	"encoding/hex"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  func TestWXConfigSign(t *testing.T) {
    12  	jsapiTicket := "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg"
    13  	nonceStr := "Wm3WZYTPz0wzccnW"
    14  	timestamp := "1414587457"
    15  	url := "http://mp.weixin.qq.com?params=value#xxxx"
    16  
    17  	wantSignature := "0f9de62fce790f9a083d5c99e95740ceb90c27ed"
    18  
    19  	haveSignature := WXConfigSign(jsapiTicket, nonceStr, timestamp, url)
    20  	if haveSignature != wantSignature {
    21  		t.Errorf("test WXConfigSign failed,\nhave: %s\nwant: %s\n", haveSignature, wantSignature)
    22  		return
    23  	}
    24  
    25  	haveSignature2 := WXConfigSign2(jsapiTicket, nonceStr, timestamp, url)
    26  	if haveSignature2 != wantSignature {
    27  		t.Errorf("test WXConfigSign2 failed,\nhave: %s\nwant: %s\n", haveSignature2, wantSignature)
    28  		return
    29  	}
    30  
    31  	haveSignature3 := WXConfigSign3(jsapiTicket, nonceStr, timestamp, url)
    32  	if haveSignature3 != wantSignature {
    33  		t.Errorf("test WXConfigSign3 failed,\nhave: %s\nwant: %s\n", haveSignature3, wantSignature)
    34  		return
    35  	}
    36  }
    37  
    38  func TestCardSign(t *testing.T) {
    39  	api_ticket := "aaaa"
    40  	timestamp := "bbbb"
    41  	nonce_str := "cccc"
    42  	card_id := "dddd"
    43  	code := "eeee"
    44  	open_id := "ffff"
    45  
    46  	wantSignature := "89a0e60888a9471f75dc5eb0ee86431ddbec1fd9"
    47  
    48  	haveSignature := CardSign([]string{open_id, code, timestamp, card_id, api_ticket, nonce_str})
    49  	if haveSignature != wantSignature {
    50  		t.Errorf("tests CardSign failed,\nhave: %s\nwant: %s\n", haveSignature, wantSignature)
    51  		return
    52  	}
    53  }
    54  
    55  func BenchmarkWXConfigSign(b *testing.B) {
    56  	jsapiTicket := "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg"
    57  	nonceStr := "Wm3WZYTPz0wzccnW"
    58  	timestamp := "1414587457"
    59  	url := "http://mp.weixin.qq.com?params=value"
    60  
    61  	b.ReportAllocs()
    62  	b.ResetTimer()
    63  	for i := 0; i < b.N; i++ {
    64  		WXConfigSign(jsapiTicket, nonceStr, timestamp, url)
    65  	}
    66  }
    67  
    68  func BenchmarkWXConfigSign2(b *testing.B) {
    69  	jsapiTicket := "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg"
    70  	nonceStr := "Wm3WZYTPz0wzccnW"
    71  	timestamp := "1414587457"
    72  	url := "http://mp.weixin.qq.com?params=value"
    73  
    74  	b.ReportAllocs()
    75  	b.ResetTimer()
    76  	for i := 0; i < b.N; i++ {
    77  		WXConfigSign2(jsapiTicket, nonceStr, timestamp, url)
    78  	}
    79  }
    80  
    81  func BenchmarkWXConfigSign3(b *testing.B) {
    82  	jsapiTicket := "sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg"
    83  	nonceStr := "Wm3WZYTPz0wzccnW"
    84  	timestamp := "1414587457"
    85  	url := "http://mp.weixin.qq.com?params=value"
    86  
    87  	b.ReportAllocs()
    88  	b.ResetTimer()
    89  	for i := 0; i < b.N; i++ {
    90  		WXConfigSign3(jsapiTicket, nonceStr, timestamp, url)
    91  	}
    92  }
    93  
    94  func WXConfigSign2(jsapiTicket, nonceStr, timestamp, url string) (signature string) {
    95  	if i := strings.IndexByte(url, '#'); i >= 0 {
    96  		url = url[:i]
    97  	}
    98  	h := sha1.New()
    99  
   100  	bufw := bufio.NewWriterSize(h, 128)
   101  	bufw.WriteString("jsapi_ticket=")
   102  	bufw.WriteString(jsapiTicket)
   103  	bufw.WriteString("&noncestr=")
   104  	bufw.WriteString(nonceStr)
   105  	bufw.WriteString("&timestamp=")
   106  	bufw.WriteString(timestamp)
   107  	bufw.WriteString("&url=")
   108  	bufw.WriteString(url)
   109  	bufw.Flush()
   110  
   111  	hashsum := h.Sum(nil)
   112  	return hex.EncodeToString(hashsum)
   113  }
   114  
   115  var (
   116  	jsapiTicketKey = []byte("jsapi_ticket=")
   117  	nonceStrKey    = []byte("&noncestr=")
   118  	timestampKey   = []byte("&timestamp=")
   119  	urlKey         = []byte("&url=")
   120  )
   121  
   122  func WXConfigSign3(jsapiTicket, nonceStr, timestamp, url string) (signature string) {
   123  	if i := strings.IndexByte(url, '#'); i >= 0 {
   124  		url = url[:i]
   125  	}
   126  	h := sha1.New()
   127  
   128  	h.Write(jsapiTicketKey)
   129  	h.Write([]byte(jsapiTicket))
   130  	h.Write(nonceStrKey)
   131  	h.Write([]byte(nonceStr))
   132  	h.Write(timestampKey)
   133  	h.Write([]byte(timestamp))
   134  	h.Write(urlKey)
   135  	h.Write([]byte(url))
   136  
   137  	hashsum := h.Sum(nil)
   138  	return hex.EncodeToString(hashsum)
   139  }