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 人点赞过