2、签名规则及方法
创建于 2025-04-08 / 最近更新于 2025-04-09 /
214
字体:
[默认]
[大]
[更大]
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()
0 人点赞过