http请求签名生成算法

算法文档: 签名生成算法

签名生成步骤

步骤1、请求参数拼接为有序字符串

步骤2、将签名字符串使用MD5摘要算法生成MD5值

步骤3、将生成的签名追加到原参数后

lua实现

lua 复制代码
local md5 = require("md5") -- 使用 Lua 的 md5 库,你可能需要安装相应的库

function generateSign(params)
    local signParams = {}

    -- 步骤1:参数按照键名进行字典序排序
    for k, v in pairs(params) do
        if k ~= "sign" and v ~= "" then
            table.insert(signParams, k .. "=" .. tostring(v))
        end
    end
    table.sort(signParams)

    -- 步骤2:使用MD5算法生成MD5值
    local signStr = table.concat(signParams, "&")
    local md5Sign = md5.sumhexa(signStr):upper()

    -- 步骤3:将生成的签名追加到原参数后
    params.sign = md5Sign
    return params
end

function verifySign(params)
    local sign = params.sign
    params.sign = nil

    -- 重新生成签名
    local generatedParams = generateSign(params)
    local generatedSign = generatedParams.sign

    -- 验证签名是否一致
    return sign == generatedSign
end

-- 举例
local params = {
    appId = "ai6ydn7d6okgv2038o",
    outTradeNo = "278347285372910411",
    openId = "soilq51g52bWOgmeKB6Lbjd60oMk",
    amount = 1,
    attach = "mark消息",
    notifyUrl = "https://openplatform-openapi.soulapp.cn/order/notifyUrl",
    nonceStr = "742945738482093302",
    signType = "MD5",
}

-- 生成签名
local signedParams = generateSign(params)
print("Generated Signature:", signedParams.sign)

-- 验证签名
local isValid = verifySign(signedParams)
print("Is Valid Signature:", isValid)

Golang版本

go 复制代码
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"net/url"
	"sort"
	"strings"
)

// generateSign 生成签名
func generateSign(params map[string]string) string {
	// 步骤1:参数按照键名进行字典序排序
	keys := make([]string, 0, len(params))
	for k := range params {
		if k != "sign" && params[k] != "" {
			keys = append(keys, k)
		}
	}
	sort.Strings(keys)

	// 步骤2:使用 MD5 算法生成 MD5 值
	var signStrings []string
	for _, key := range keys {
		signStrings = append(signStrings, key+"="+params[key])
	}
	signStr := strings.Join(signStrings, "&")
	hash := md5.New()
	hash.Write([]byte(signStr))
	md5Sign := hex.EncodeToString(hash.Sum(nil))

	// 步骤3:将生成的签名追加到原参数中
	params["sign"] = strings.ToUpper(md5Sign)
	return params["sign"]
}

// verifySign 验证签名
func verifySign(params map[string]string) bool {
	sign := params["sign"]
	delete(params, "sign")

	// 重新生成签名
	generatedSign := generateSign(params)

	// 验证签名是否一致
	return sign == generatedSign
}

func main() {
	// 举例
	params := map[string]string{
		"appId":      "ai6ydn7d6okgv2038o",
		"outTradeNo": "278347285372910411",
		"openId":     "soilq51g52bWOgmeKB6Lbjd60oMk",
		"amount":     "1",
		"attach":     "mark消息",
		"notifyUrl":  "https://openplatform-openapi.soulapp.cn/order/notifyUrl",
		"nonceStr":   "742945738482093302",
		"signType":   "MD5",
	}

	// 生成签名
	sign := generateSign(params)
	fmt.Println("Generated Signature:", sign)

	// 验证签名
	isValid := verifySign(params)
	fmt.Println("Is Valid Signature:", isValid)
}
相关推荐
Gold_Dino5 小时前
agc011_e 题解
算法
bubiyoushang8885 小时前
基于蚁群算法的直流电机PID参数整定 MATLAB 实现
数据结构·算法·matlab
风筝在晴天搁浅5 小时前
hot100 240.搜索二维矩阵Ⅱ
算法·矩阵
girl-07265 小时前
2025.12.24代码分析
算法
永远睡不够的入6 小时前
直接插入排序、希尔排序、选择排序
数据结构·算法·排序算法
历程里程碑6 小时前
hot 206
java·开发语言·数据结构·c++·python·算法·排序算法
Tipriest_6 小时前
C++ 的 ranges 和 Python 的 bisect 在二分查找中的应用与实现
c++·python·算法·二分法
天天向上10247 小时前
go 配置热更新
开发语言·后端·golang
晨晖27 小时前
顺序查找:c语言
c语言·开发语言·算法
LYFlied7 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划