2、签名规则及方法
创建于 2025-04-08 / 最近更新于 2025-04-09 /
914
字体:
[默认]
[大]
[更大]
sign签名说明:下方已提供 php、c#、java、Python 方法可以参考。
接口签名规则说明
签名计算流程:
1. 参数升序排序:将业务参数(不包含 sign)的键名进行升序排序。
2. 转换为 JSON 字符串:将排序后的参数数组转换为 JSON 字符串。
- 注意:JSON 格式必须标准,不要多余空格;
- 如果有中文字符,需进行 Unicode 编码(仅用于签名前字符串);
- 示例:测试 → \u6d4b\u8bd5。
3. 拼接 secret:将平台提供的 secret 放在 JSON 字符串前面拼接。
4. MD5 加密:对拼接后的字符串进行 MD5 加密(小写),所得结果即为签名 sign 值。
示例说明
原始业务参数(未排序):
{
"method": "youquanyi.api.out.buyorder",
"appid": "1696669018990",
"time": "1700117505",
"cus_order_no": "202311161435176001151771",
"count": "1",
"good_id": "397",
"extend_field": ["13899996666"]
}排序后参数(按键名升序):
{
"appid": "1696669018990",
"count": "1",
"cus_order_no": "202311161435176001151771",
"extend_field": ["13899996666"],
"good_id": "397",
"method": "youquanyi.api.out.buyorder",
"time": "1700117505"
}如果参数中包含中文,例如 "remark": "测试",则签名前需改为: "remark": "\u6d4b\u8bd5"。
签名前的拼接字符串示例:
假设 secret 为:
05fb53258fa59f5c7586015d2c00f634
拼接字符串为:
05fb53258fa59f5c7586015d2c00f634{"appid":"1696669018990","count":"1","cus_order_no":"202311161435176001151771","extend_field":["13899996666"],"good_id":"397","method":"youquanyi.api.out.buyorder","time":"1700117505"}最终 MD5 签名结果:
2c6d5f6c565508ac3977594f8a972cd5
注意事项:
1、中文字段仅在签名前需 Unicode 编码,传参本身不需要编码;
2、签名用的 JSON 必须保持标准格式(字段顺序、引号、数组等);
3、最终请求需附加参数 sign 一并提交。
签名方法DEMO
PHP签名方法示例代码
//v.1 ksort参数进行升序排序后拼接参数:
private function getsign($param,$secret){
ksort($param);
$str = json_encode($param);
return md5($secret.$str);
}C#签名方示例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
public class SignHelper
{
public static string GetSign(Dictionary param, string secret)
{
// 1. 升序排序参数
var sorted = param.OrderBy(kv => kv.Key)
.ToDictionary(kv => kv.Key, kv => kv.Value);
// 2. 转为 JSON 字符串(保持 key 顺序)
string json = JsonConvert.SerializeObject(sorted);
// 3. 拼接 secret + json,进行 MD5 加密
string raw = secret + json;
return GetMd5(raw);
}
private static string GetMd5(string input)
{
using (var md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);
// 转换为小写十六进制字符串
return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
}
}
}使用方法
var param = new Dictionary{
{ "b", "value2" },
{ "a", "value1" }
};
string secret = "mysecret";
string sign = SignHelper.GetSign(param, secret);
Console.WriteLine(sign);JAVA签名示例代码
import java.security.MessageDigest;
import java.util.*;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class SignUtil {
public static String getSign(Map param, String secret) {
// 1. 参数按键升序排序
Map sortedMap = new TreeMap<>(param);
// 2. 转为 JSON 字符串
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String jsonStr = gson.toJson(sortedMap);
// 3. 拼接 secret + jsonStr 并计算 MD5
String raw = secret + jsonStr;
return md5(raw);
}
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(input.getBytes("UTF-8"));
// 转换为小写十六进制字符串
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException("MD5计算失败", e);
}
}
// 示例
public static void main(String[] args) {
Map param = new HashMap<>();
param.put("b", "value2");
param.put("a", "value1");
String secret = "mySecret";
String sign = getSign(param, secret);
System.out.println("Sign: " + sign);
}
}Python签名示例代码
import hashlib
import json
def get_sign(param, secret):
# 字典按键名升序排序
sorted_param = dict(sorted(param.items()))
# 转换为 JSON 字符串
json_str = json.dumps(sorted_param, separators=(',', ':'), ensure_ascii=False)
# 拼接 secret + json_str 并 md5 加密
sign_str = secret + json_str
return hashlib.md5(sign_str.encode('utf-8')).hexdigest()
1 人点赞过
系统操作手册
开放平台
会员操作手册