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

     1  package jssdk
     2  
     3  import (
     4  	"bufio"
     5  	"crypto/sha1"
     6  	"encoding/hex"
     7  	"sort"
     8  	"strings"
     9  )
    10  
    11  // JS-SDK wx.config 的参数签名.
    12  func WXConfigSign(jsapiTicket, nonceStr, timestamp, url string) (signature string) {
    13  	if i := strings.IndexByte(url, '#'); i >= 0 {
    14  		url = url[:i]
    15  	}
    16  
    17  	n := len("jsapi_ticket=") + len(jsapiTicket) +
    18  		len("&noncestr=") + len(nonceStr) +
    19  		len("&timestamp=") + len(timestamp) +
    20  		len("&url=") + len(url)
    21  	buf := make([]byte, 0, n)
    22  
    23  	buf = append(buf, "jsapi_ticket="...)
    24  	buf = append(buf, jsapiTicket...)
    25  	buf = append(buf, "&noncestr="...)
    26  	buf = append(buf, nonceStr...)
    27  	buf = append(buf, "&timestamp="...)
    28  	buf = append(buf, timestamp...)
    29  	buf = append(buf, "&url="...)
    30  	buf = append(buf, url...)
    31  
    32  	hashsum := sha1.Sum(buf)
    33  	return hex.EncodeToString(hashsum[:])
    34  }
    35  
    36  // JS-SDK 卡券 API 参数签名.
    37  func CardSign(strs []string) (signature string) {
    38  	sort.Strings(strs)
    39  
    40  	h := sha1.New()
    41  
    42  	bufw := bufio.NewWriterSize(h, 128) // sha1.BlockSize 的整数倍
    43  	for _, str := range strs {
    44  		bufw.WriteString(str)
    45  	}
    46  	bufw.Flush()
    47  
    48  	return hex.EncodeToString(h.Sum(nil))
    49  }