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)
}
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
ttwuai1 天前
Go开源后台管理系统推荐:怎么按技术栈和边界比较4个官方仓库?
golang·gin
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
codeejun1 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法