You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP网站集成Paynamics支付网关?签名验证失败求助

解决Paynamics支付网关“Signature Verification Failed”问题

嘿,我来帮你搞定这个Paynamics签名验证失败的问题!Paynamics的签名机制对参数顺序、密钥使用和格式要求特别严格,咱们一步步排查:

常见问题及修复方案

  • 用错密钥了! 你代码里用的$_mid是商户ID,但签名生成必须用Paynamics给你的商户密钥(Merchant Secret Key)——这是一串和商户ID完全不同的字符串,别搞混了!
  • 参数顺序不对 Paynamics要求所有请求参数按ASCII字母升序排序后再拼接,比如amount要排在mid前面,requestid要在timestamp前面。如果你的参数拼接顺序乱了,签名肯定不匹配。
  • IP地址不真实 你现在写的是内网IP(192.168.51.1),生产环境必须换成用户的真实公网IP,用$_SERVER['REMOTE_ADDR']获取就行,Paynamics可能会校验这个IP的有效性。
  • 参数格式/缺失 比如金额要保留两位小数、货币代码必须是大写(PHP)、requestid要确保唯一且长度符合要求,还有别忘了加文档里要求的必填参数(比如时间戳timestamp,格式一般是YYYYMMDDHHMMSS)。
  • 编码乱码 拼接字符串前要确保所有参数都是UTF-8编码,尤其是带特殊字符的描述类字段,乱码会直接导致签名错误。

正确的签名生成示例代码

// 替换成你的真实商户信息
$merchantId = "xxxxxxxxxxxxxxxxxxx";
$merchantSecret = "your_merchant_secret_key_here"; // 重点!用这个密钥,不是商户ID

// 收集所有必填请求参数
$params = [
    'amount' => '100.00', // 示例金额,必须两位小数
    'currency' => 'PHP',
    'ipaddress' => $_SERVER['REMOTE_ADDR'], // 获取用户真实公网IP
    'mid' => $merchantId,
    'requestid' => substr(uniqid(), 0, 13), // 确保唯一且13位
    'timestamp' => date('YmdHis'), // 符合要求的时间戳格式
    'description' => 'Test Payment', // 示例订单描述
    'email' => 'customer@example.com' // 示例用户邮箱
];

// 按ASCII字母升序排序参数(关键步骤!)
ksort($params);

// 拼接成key=value&key=value的格式
$signatureString = http_build_query($params);

// 生成HMAC-SHA256签名,转成小写(具体看Paynamics文档要求,有的要大写)
$signature = hash_hmac('sha256', $signatureString, $merchantSecret);
$signature = strtolower($signature);

// 把签名加入参数,准备提交给Paynamics
$params['signature'] = $signature;

额外排查建议

  1. 对照Paynamics官方文档的签名步骤逐行核对,确保每一步都和文档完全一致;
  2. 测试时用Paynamics的沙箱环境,避免影响真实交易;
  3. 如果Paynamics返回了对比用的签名值,把你生成的签名和它对比,看拼接的字符串哪里不一样。

内容的提问来源于stack exchange,提问作者nikko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:57