大家在用微信小游戏经常会通过小程序的appid和secret来获取访问权限,这样就能获取用户的加密串,或者查询用户的记录。
不过微信社区在一些问题上更新并不及时,或者不活跃导致很多用户使用过程中经常遇到奇奇怪怪的签名错误,但无法找到相关的解决方案,这里我就拿微信官网的这个案例加以说明:
internet.getUserEncryptKey | 微信开放文档
这里我们看到
编辑
于是我们就按照微信官网的方式来生成签名,结果
提示签名错误:
{"errcode":87009,"errmsg":"invalid signature rid: 6442685e-7243b495-3f8fc51f","key_info_list":[]}
那么我们就开始排查签名算法是否有问题:
这里我们提供几个go语言的HmacSha256的签名算法,相信遇到这种问题的很多人都见到过这种算法,我们顺便也就能验证下到底是哪个算法才能帮助我们解决问题,
算法1:
func ComputeHmacSha256(message string, secret string) string { key := []byte(secret) h := hmac.New(sha256.New, key) h.Write([]byte(message)) sha := hex.EncodeToString(h.Sum(nil)) return base64.StdEncoding.EncodeToString([]byte(sha)) }
算法2
func HmacSha256(key string, data string) string { mac := hmac.New(sha256.New, []byte(key)) _, _ = mac.Write([]byte(data)) return hex.EncodeToString(mac.Sum(nil)) }
算法3:
func HmacSha256(key string, data string) []byte { mac := hmac.New(sha256.New, []byte(key)) _, _ = mac.Write([]byte(data)) return mac.Sum(nil) } // HmacSha256ToHex 将加密后的二进制转16进制字符串 func HmacSha256ToHex(key string, data string) string { return hex.EncodeToString(HmacSha256(key, data)) } // HmacSha256ToHex 将加密后的二进制转Base64字符串 func HmacSha256ToBase64(key string, data string) string { return base64.URLEncoding.EncodeToString(HmacSha256(key, data)) }
算法4:
func HmacSha256(message string, secret string) string { h := hmac.New(sha256.New, []byte(secret)) io.WriteString(h, message) return fmt.Sprintf("%x", h.Sum(nil)) }
发现按照官网的方法填充都不对,实际上真正有效的是算法4,那么参数怎么传呢?
应该是
signature:=HmacSha256("",session_key)
最终完美解决,如果你遇到类似的问题,仍然没有解决,可以下方留言