golang 微信签名算法

发布时间:2024-07-06 23:28:53

微信签名算法

微信签名算法是在开发微信公众号或小程序时,用于验证请求的合法性和确保数据安全。在使用微信支付、获取用户信息等功能时,都需要使用签名算法来保证数据的完整性和安全性。

下面将介绍一种常用的微信签名算法。

生成签名

生成微信签名的步骤如下:

  1. 将待签名的参数按照参数名的ASCII码顺序排序。
  2. 使用URL键值对的格式(即key1=value1&key2=value2...)拼接成字符串。
  3. 在拼接的字符串末尾追加上应用的密钥(例如,微信支付中的API密钥)。
  4. 将拼接后的字符串进行MD5加密,生成签名。

示例代码:

package main

import (
	"crypto/md5"
	"encoding/hex"
	"sort"
	"strings"
)

func generateSignature(params map[string]interface{}, key string) string {
	var keys []string
	for k := range params {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	var strBuilder strings.Builder
	for _, k := range keys {
		v := params[k]
		if v != "" {
			strBuilder.WriteString(k)
			strBuilder.WriteString("=")
			strBuilder.WriteString(v.(string))
			strBuilder.WriteString("&")
		}
	}

	str := strBuilder.String()
	str += "key=" + key

	hasher := md5.New()
	hasher.Write([]byte(str))
	signature := hex.EncodeToString(hasher.Sum(nil))
	return signature
}

func main() {
	params := map[string]interface{}{
		"appid":     "wx123456",
		"timestamp": "1477929292",
		"noncestr":  "abc123",
	}
	key := "abcd1234"

	signature := generateSignature(params, key)
	println("Signature:", signature)
}

在上述示例代码中,通过调用generateSignature函数,传入待签名的参数和密钥,即可生成微信签名。

验证签名

在接收到微信请求时,我们需要对接收到的参数进行验证,确保请求的合法性。验证签名的步骤如下:

  1. 将接收到的参数按照参数名的ASCII码顺序排序。
  2. 使用URL键值对的格式(即key1=value1&key2=value2...)拼接成字符串。
  3. 对拼接后的字符串进行与生成签名相同的MD5加密操作。
  4. 将生成的签名与接收到的签名进行对比,如果一致,则验证通过。

示例代码:

package main

import (
	"crypto/md5"
	"encoding/hex"
	"sort"
	"strings"
)

func verifySignature(params map[string]interface{}, signature string, key string) bool {
	var keys []string
	for k := range params {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	var strBuilder strings.Builder
	for _, k := range keys {
		v := params[k]
		if v != "" {
			strBuilder.WriteString(k)
			strBuilder.WriteString("=")
			strBuilder.WriteString(v.(string))
			strBuilder.WriteString("&")
		}
	}

	str := strBuilder.String()
	str += "key=" + key

	hasher := md5.New()
	hasher.Write([]byte(str))
	expectedSignature := hex.EncodeToString(hasher.Sum(nil))

	return expectedSignature == signature
}

func main() {
	params := map[string]interface{}{
		"appid":     "wx123456",
		"timestamp": "1477929292",
		"noncestr":  "abc123",
	}
	signature := "4B8FD4FE524EE17BA4A7753C50E68B0E"
	key := "abcd1234"

	valid := verifySignature(params, signature, key)
	println("Signature is valid:", valid)
}

通过调用verifySignature函数,传入接收到的参数、接收到的签名和密钥,即可验证签名的有效性。

总结

微信签名算法是保证数据安全的重要手段之一,通过合理地使用签名算法,可以保护用户信息和交易数据的安全性。在开发过程中,我们需要注意生成签名和验证签名的步骤,并正确处理参数的排序、拼接和加密操作。

相关推荐