支付宝支付签名失败,怎么排查参数或签名问题?
在做支付宝H5支付时,调用下单接口一直返回签名失败,但测试环境能通过。我检查了参数名大小写、时间戳、私钥路径,甚至把沙箱和正式环境的配置对调过,还是报错”签名验签失败(错误码:40017)”。代码里签名生成部分是这样的:
const signContent = Object.keys(params).sort()
.map(key => <code>${key}=${params[key]}</code>)
.join('&') + '&key=' + this.notifyKey;
const sign = crypto.createHmac('SHA256', this.privateKey)
.update(signContent, 'utf8')
.digest('base64');
请问除了这些常规检查,还有哪些容易忽略的地方?比如参数顺序必须严格按ASCII排序?或者正式环境的密钥格式需要特殊处理?
记得把
this.privateKey替换成PKCS8格式的私钥,用命令行转一下:openssl pkcs8 -topk8 -inform PEM -in your_private_key.pem -outform PEM -nocrypt > pkcs8_private_key.pem。别问我怎么知道的,踩过坑。