如何在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;
额外排查建议
- 对照Paynamics官方文档的签名步骤逐行核对,确保每一步都和文档完全一致;
- 测试时用Paynamics的沙箱环境,避免影响真实交易;
- 如果Paynamics返回了对比用的签名值,把你生成的签名和它对比,看拼接的字符串哪里不一样。
内容的提问来源于stack exchange,提问作者nikko
相关产品推荐
相关产品推荐

