📄 signature.ts

/**
 * WeCom 签名计算与验证
 */

import crypto from "node:crypto";

function sha1Hex(input: string): string {
    return crypto.createHash("sha1").update(input).digest("hex");
}

/**
 * 计算 WeCom 消息签名
 */
export function computeWecomMsgSignature(params: {
    token: string;
    timestamp: string;
    nonce: string;
    encrypt: string;
}): string {
    const parts = [params.token, params.timestamp, params.nonce, params.encrypt]
        .map((v) => String(v ?? ""))
        .sort();
    return sha1Hex(parts.join(""));
}

/**
 * 验证 WeCom 消息签名
 */
export function verifyWecomSignature(params: {
    token: string;
    timestamp: string;
    nonce: string;
    encrypt: string;
    signature: string;
}): boolean {
    const expected = computeWecomMsgSignature({
        token: params.token,
        timestamp: params.timestamp,
        nonce: params.nonce,
        encrypt: params.encrypt,
    });
    return expected === params.signature;
}