簽名規則:

下單簽名與回調驗簽使用同一套規則,均以商戶的 secretkey 作為金鑰


計算步驟

  1. 收集所有參與簽名的參數:下單時為 POST body 中的全部參數,排除 sign;回調時為通知參數中的全部欄位,排除 sign。
  2. 按參數名進行 ASCII 升序排序(ksort)。
  3. 拼接為 k=v 形式,參數之間用 & 連線。值使用傳送時的原始字串,不做 URL 編碼、不做類型轉換。
  4. 在拼接結果末尾直接追加 secretkey(不新增 &)。
  5. 對最終字串計算 MD5,輸出 32 位小寫字串。
sign = md5( k1=v1&k2=v2&...&kn=vn + secretkey )

簽名示例

以下參數按 key 升序拼接(注意:apikey 在 URL 中,不參與簽名):

amount=100.00&chain_id=56&ip=203.0.113.10&merchant_id=10000&merchant_order=T202611010001&notify_url=https://example.com/pay/notify&parameters=order-123&pay_mode=1&product_name=TestProduct&return_url=https://example.com/pay/return&token_type=1


追加示例金鑰 demo_secret_123456 後計算 MD5:

adde550dac98c94e47d0754aa18b245d

注意事項


  • 金額格式必須與傳送值一致:100 與 100.00 是不同的簽名原文。
  • 值不做 URL 編碼:簽名用原始值,傳送時再由表單編碼(http_build_query / URLSearchParams 等)。
  • 空值也要參與簽名:如果傳送了空字串參數,它同樣會被拼入簽名串。不需要的可選參數建議不傳。
  • 只支援標量參數:陣列 / 物件形式的參數會被拒絕,也不適用於簽名。
  • 不要對參數做二次過濾:驗簽必須基於原始值,框架的 trim / 轉義處理可能破壞簽名(尤其是包含引號、尖括號的值)。
  • 回調驗簽時,建議使用常量時間比較(如 PHP 的 hash_equals、Python 的 hmac.compare_digest)。

簽名函式示例(PHP)

<?php
function tokenpay_sign(array $params, string $secretKey): string
{
    unset($params['sign']);
    ksort($params);
    $signStr = '';
    foreach ($params as $k => $v) {
        $signStr .= ($signStr === '' ? '' : '&') . $k . '=' . $v;
    }
    return md5($signStr . $secretKey);
}