说明

服务域名:

自2018年10月18日开始,服务端统一域名(旧域名仍暂时可用),host 如下:

【对外服务统一提供外网与内网域名,请根据网络环境选用相应的域名请求】

  • 正式服: 外网:https://sapi.hortorgames.com 内网:http://sapi-lan.hortorgames.com
  • 测试服 外网:https://sapi-test.hortorgames.com 内网:http://sapi-test-lan.hortorgames.com

签名

签名字符串示例如下

sign = md5("content=a54456bf13582e773df04a35eab49ecbgameId=yydssecret=57a1fe2376ef483b2fa9cd1cbcf454f7")

其中 content、gameId、secret 在字符串中的顺序要严格按照上面示例中的顺序(字典序)

注意: 如果 query 里有其他参数, 也要参与签名, 并按照字典序排序

签名字符串中的content json 数据整个 body 进行 md5 加密作为 content

步骤

  1. 读取Request获取完整的Body请求参数
  2. 将body进行md5加密,得到content
  3. 读取Query参数form,并设置"content" = content,"secret" = secret
  4. 将参数按照字典序排序,拼接成字符串进行md5加密,得到sign

golang 示例


func CheckSign(c *gin.Context){
    ctx := c.Request.Context()
    body, err := io.ReadAll(c.Request.Body)
    if err != nil {
        resp.Error(err, c)
        return
    }
    defer c.Request.Body.Close()
    content = StringMd5(string(body))
	
    data := c.Request.ParseForm()
    data.Set("content", content)
	if data.Get("sign") != SignWithSecret(data, secret) {
        resp.Error(errors.New("签名错误"), c)
        return
    }
}

func SignWithSecret(data url.Values, secret string) (sign string) {
	data.Set("secret", secret)
	defer data.Del("secret")
	keys := make([]string, 0)
	for k := range data {
		if k == "sign" {
			continue
		}
		keys = append(keys, k)
	}
	sort.Strings(keys)
	str := ""
	for _, k := range keys {
		str += fmt.Sprintf("%s=%s", k, data.Get(k))
	}
	fmt.Println("str:", str)
	fmt.Println("md5Str:", StringMd5(str))
	return StringMd5(str)
}


func StringMd5(str string) string {
    hash := md5.New()
    hash.Write([]byte(str))

    return hex.EncodeToString(hash.Sum(nil))
}
Last Updated:
Contributors: jslgo, yuhongyu, zhuchen