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)
}
相关推荐
guygg8826 分钟前
基于matlab的FIR滤波器
开发语言·算法·matlab
ysh98881 小时前
PP-OCR:一款实用的超轻量级OCR系统
算法
遇雪长安1 小时前
差分定位技术:原理、分类与应用场景
算法·分类·数据挖掘·rtk·差分定位
数通Dinner1 小时前
RSTP 拓扑收敛机制
网络·网络协议·tcp/ip·算法·信息与通信
恋喵大鲤鱼2 小时前
Golang 运算符
golang·运算符
weixin_437398212 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
张人玉3 小时前
C# 常量与变量
java·算法·c#
ac.char3 小时前
Golang读取ZIP压缩包并显示Gin静态html网站
golang·html·gin
weixin_446122464 小时前
LinkedList剖析
算法
Cxzzzzzzzzzz5 小时前
.golangci.yml文件配置
golang