收藏
回答

商家转账中的撤销转账签名方式和其他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;
  }
}


回答关注问题邀请回答
收藏

2 个回答

登录 后发表内容