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
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 结果为小写;· 密钥请妥善保管,泄露后请立即在商户中心重置。