解决了,签名没有问题,是axios发送请求时把空的data转成了“{}”
商家转账中的撤销转账签名方式和其他api不同吗?我调用发起转账和商户单号查询转账单接口签名都成功了,用同样的方法签名调用撤销转账接口就返回签名错误;要签名的数据: "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; } }
01-20