PHP使用base64 hmac sha256签名时单双引号导致结果异常问题
支付网关带引号字段签名异常解决方案
- 首先排查PHP自动转义配置:检查php.ini中
magic_quotes_gpc配置项是否开启,该配置会自动给用户提交的单/双引号前增加反斜杠,导致参与签名的字段内容和实际业务值不符。如果开启,需使用stripslashes()处理所有表单提交的字段内容后再参与签名:
// 处理收货地址字段自动转义问题 $raw_address = $this->_basket['delivery_address']['line1']; $address = get_magic_quotes_gpc() ? stripslashes($raw_address) : $raw_address;
- 排查字段内容是否被额外HTML实体转义:不要对参与签名的字段调用
htmlspecialchars()、htmlentities()等转义函数,这类函数会把单引号转为'、双引号转为",和加密时使用的原始引号内容不一致,自然会生成错误签名。 - 校验拼接字符串一致性:将代码中生成的
$concatenated_string和预期加密的原文逐字节对比,最简单的方式是分别输出两个字符串的原始十六进制编码,对比差异即可快速定位是否多了反斜杠、转义字符等额外内容:
// 输出拼接串的十六进制编码用于对比 echo bin2hex($concatenated_string);
- 确认签名拼接规则完全符合网关要求:绝大多数支付网关要求参与签名的字段按ASCII码字典序排序后拼接,部分网关还要求键值对之间用指定分隔符(如
+、|)拼接,需确保拼接规则和网关文档要求完全一致,且参与签名的字段值和最终提交给网关的字段值完全相同,不能出现签名用原始值、提交用转义值的情况。
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

