我调用发起转账和商户单号查询转账单接口签名都成功了,用同样的方法签名调用撤销转账接口就返回签名错误;
要签名的数据:
"POST
/v3/fund-app/mch-transfer/transfer-bills/out-bill-no/4885635e6789b9ed016398e816e2693e/cancel
1737080189
e2s39imIkOFBRGqIlQxsVpDGT83OqrjR
"
签名结果:
hm1QU/4C1/CvXfBgmdLCpkB2hYQK+xA3037j03MFjQaiOvXlYoINwyulFQw1YwT0d4Ur+Q6ekGO/lFK5812BPXNhcyveuTVYqpcANccjXqKDbMkAGeN6J/UoQOvJG2Y+j4nzPt6R2/+WmnyWxeDLZnNE1aZBqsaklkr1KxtNv/MHKodTKIatICIF6T6Y8eMhdxBkN1oFSuyjI54GCMbE6RlI6K52+Fopa2L0ceNhbFo7zTkyg/pADEsTQs8OxfaF3MCLIABwqyhlay0ECt8ViEXc8yql7E7ByDDINrzZQhTfKKlNrhmbecKH6u2/FR6S/gK9ux+KzjPCqnCsYEyddg==
签名函数
// 生成签名的函数
function generateSignature(httpMethod, url, timestamp, randomStr, body, privateKey, secondLineQuoteType = "'") {
// 1. 解析 URL,去除域名部分,只保留路径部分
const parsedUrl = new URL(url);
const path = parsedUrl.pathname;
let bodyStr;
if (Object.keys(body).length === 0 && body.constructor === Object) {
// 如果 body 是空对象,设置 bodyStr 为 undefined
bodyStr = undefined;
} else {
// 否则,使用 JSON.stringify() 转换为字符串
bodyStr = JSON.stringify(body);
// 转义 body 中的双引号
// 3. 根据 secondLineQuoteType 处理双引号转义
if (secondLineQuoteType === '"') {
// 如果外层是双引号,则需要转义 body 中的双引号
bodyStr = bodyStr.replace(/"/g, '\\"');
}
}
// 构建签名字符串
const signString = `${httpMethod}\n${path}\n${timestamp}\n${randomStr}\n${bodyStr || ''}\n`;
// 2. 使用商户私钥进行 SHA256 with RSA 签名
try {
const signBuffer = Buffer.from(signString, 'utf8');
const sign = crypto.createSign('RSA-SHA256');
sign.update(signBuffer);
sign.end();
// 使用私钥进行签名
const signature = sign.sign(privateKey, 'base64'); // 输出为 Base64 编码的签名
console.log(49, signature)
console.log(50, signString)
return signature;
} catch (error) {
console.error("签名生成失败:");
return null;
}
}
还请参考链接进行排查https://developers.weixin.qq.com/community/develop/article/doc/000ce8d3ee8b70d868ed6185b5b013
解决了,签名没有问题,是axios发送请求时把空的data转成了“{}”