欢迎您!
API文档中心
入门指南
快速接入 签名算法 调用示例
参考文档
SDK 参考 错误码速查

签名算法

为保证请求安全,所有 API 调用均需携带签名参数 sign。签名采用 MD5 算法,仅需 pidappkey 两个身份字段,业务参数不参与签名。

公共请求参数

参数类型必填说明
pidint/string用户ID(用户中心可见)
signstring签名值,规则见下

签名说明

核心设计:签名只验证调用者身份,不验证业务参数。这样开发者无需关心接口参数变化,接入成本更低。

签名步骤

  1. pidappkey 拼接成字符串:"pid=" + pid + appkey
  2. 对上述字符串进行 MD5 哈希,得到 32 位小写十六进制字符串
  3. 将签名值作为 sign 参数,与 pid 一起发送

示例:假设 pid=1000appkey=tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA,则:

# 步骤 1:拼接字符串
拼接结果:pid=1000tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA

# 步骤 2:对拼接结果做 MD5
MD5 签名:6a1e9f2d3c4b5a6e7f8g9h0i1j2k3l4m

安全机制

各语言签名示例

以下示例展示如何生成签名。传入 pidappkey 后,函数返回 sign 字符串。

  • PHP
  • Python
  • Go
  • Java
  • C#
  • Objective-C
<?php
/**
 * PHP 签名示例
 * 功能:根据 pid 和 appkey 生成 sign
 */

// 示例参数
$pid    = '1000';                                // 用户ID,用户中心可见
$appkey = 'tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA';  // appkey,用户中心-API设置获取

/**
 * 生成签名
 *
 * 签名规则:MD5("pid=" + pid + appkey)
 * 返回:32 位小写 MD5 字符串
 */
function makeSign($pid, $appkey)
{
    // 拼接签名原文
    $signStr = 'pid=' . $pid . $appkey;
    // 计算并返回 MD5
    return md5($signStr);
}

// 生成签名并输出
$sign = makeSign($pid, $appkey);
echo 'sign: ' . $sign . "\n";
import hashlib  # 导入 hashlib 模块,用于 MD5 计算

# 示例参数
PID    = '1000'                                # 用户ID,用户中心可见
APPKEY = 'tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA'  # appkey,用户中心-API设置获取

def make_sign(pid: str, appkey: str) -> str:
    """
    生成签名
    签名规则:MD5("pid=" + pid + appkey)
    返回:32 位小写 MD5 字符串
    """
    # 拼接签名原文
    sign_str = f'pid={pid}{appkey}'
    # 使用 UTF-8 编码后计算 MD5,再返回十六进制字符串
    return hashlib.md5(sign_str.encode('utf-8')).hexdigest()

# 生成签名并输出
sign = make_sign(PID, APPKEY)
print(f'sign: {sign}')
package main

import (
	"crypto/md5"  // MD5 算法包
	"fmt"         // 格式化输出
)

// 示例参数
const (
	pid    = "1000"                                // 用户ID,用户中心可见
	appkey = "tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA"  // appkey,用户中心-API设置获取
)

// makeSign 生成签名
// 签名规则:MD5("pid=" + pid + appkey)
func makeSign(pid, appkey string) string {
	// 拼接签名原文
	raw := "pid=" + pid + appkey
	// 计算 MD5,得到 16 字节数组
	hash := md5.Sum([]byte(raw))
	// 格式化为 32 位小写十六进制字符串
	return fmt.Sprintf("%x", hash)
}

func main() {
	// 生成签名并输出
	sign := makeSign(pid, appkey)
	fmt.Println("sign:", sign)
}
import java.security.MessageDigest;        // MD5 算法
import java.nio.charset.StandardCharsets;   // UTF-8 编码

public class SignDemo {

    // 示例参数
    private static final String PID    = "1000";                                // 用户ID
    private static final String APPKEY = "tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA";  // appkey

    /**
     * 生成签名
     * 签名规则:MD5("pid=" + pid + appkey)
     * 返回:32 位小写 MD5 字符串
     */
    private static String makeSign(String pid, String appkey) throws Exception {
        // 拼接签名原文
        String raw = "pid=" + pid + appkey;
        // 获取 MD5 摘要实例
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 计算 MD5,得到字节数组
        byte[] digest = md.digest(raw.getBytes(StandardCharsets.UTF_8));
        // 转为 32 位小写十六进制字符串
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        // 生成签名并输出
        String sign = makeSign(PID, APPKEY);
        System.out.println("sign: " + sign);
    }
}
using System;                           // 基础类型
using System.Security.Cryptography;    // MD5 算法
using System.Text;                     // 文本编码

public class SignDemo
{
    // 示例参数
    private const string Pid    = "1000";                                // 用户ID
    private const string Appkey = "tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA";   // appkey

    /// <summary>
    /// 生成签名:MD5("pid=" + pid + appkey)
    /// </summary>
    private static string MakeSign(string pid, string appkey)
    {
        // 拼接签名原文
        string raw = "pid=" + pid + appkey;
        // 计算 MD5
        byte[] hash = MD5.HashData(Encoding.UTF8.GetBytes(raw));
        // 转为 32 位小写十六进制字符串
        return Convert.ToHexStringLower(hash);
    }

    public static void Main()
    {
        // 生成签名并输出
        string sign = MakeSign(Pid, Appkey);
        Console.WriteLine("sign: " + sign);
    }
}
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>

// 示例参数
static NSString * const kPid    = @"1000";                               // 用户ID
static NSString * const kAppkey = @"tF9r7oQJ1dim46nM5xzBbuUaLNjf3uOA";  // appkey

/**
 * 生成签名:MD5("pid=" + pid + appkey)
 * 返回:32 位小写 MD5 字符串
 */
NSString *makeSign(NSString *pid, NSString *appkey)
{
    // 拼接签名原文
    NSString *raw = [NSString stringWithFormat:@"pid=%@%@", pid, appkey];
    // 转为 UTF-8 编码的 NSData
    NSData *data = [raw dataUsingEncoding:NSUTF8StringEncoding];

    // 计算 MD5
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5(data.bytes, (CC_LONG)data.length, digest);

    // 转为 32 位小写十六进制字符串
    NSMutableString *hex = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [hex appendFormat:@"%02x", digest[i]];
    }
    return hex;
}

int main(int argc, const char * argv[])
{
    // 生成签名并输出
    NSString *sign = makeSign(kPid, kAppkey);
    NSLog(@"sign: %@", sign);
    return 0;
}
完整错误码请查看错误码速查页。

© 网程科技(林州网程科技有限公司)   |  豫ICP备2025120409号-2   |  豫B2-20230220   |  豫公网安备 41058102000262号