MD5 签名算法

1、将发送或接收到的所有参数按照参数名 ASCII 码从小到大排序(a-z),sign、sign_type 和空值不参与签名!

2、将排序后的参数拼接成 URL 键值对格式,例如 a=b&c=d&e=f,参数值不要进行 URL 编码。

3、再将拼接好的字符串与商户密钥 KEY 拼接后进行 MD5 加密,得出 sign 签名参数:sign = md5(a=b&c=d&e=f + KEY),结果为小写。

PHP 示例

<?php
function getSign($params, $key) {
    // 1. 过滤空值和签名参数
    $params = array_filter($params, function ($v, $k) {
        return $v !== '' && $v !== null && $k != 'sign' && $k != 'sign_type';
    }, ARRAY_FILTER_USE_BOTH);
    // 2. 按参数名 ASCII 升序排序
    ksort($params);
    // 3. 拼接键值对
    $str = '';
    foreach ($params as $k => $v) {
        $str .= "{$k}={$v}&";
    }
    $str = rtrim($str, '&');
    // 4. 拼接密钥后 MD5
    return md5($str . $key);
}

$params = [
    'pid'          => '1001',
    'type'         => 'alipay',
    'out_trade_no' => '20240101123456',
    'notify_url'   => 'http://www.example.com/notify.php',
    'return_url'   => 'http://www.example.com/return.php',
    'name'         => '测试商品',
    'money'        => '1.00',
];
$key  = '你的商户密钥';
$params['sign']      = getSign($params, $key);
$params['sign_type'] = 'MD5';

// 发起支付: 跳转方式
header('Location: https://pay.example.com/submit.php?' . http_build_query($params));

注意事项

· 参数值不要进行 URL 编码;· MD5 结果为小写;· 密钥请妥善保管,泄露后请立即在商户中心重置。