const publicKeyID = "******" // https://pay.weixin.qq.com/index.php/core/cert/api_cert#/replace-key-step 复制的公钥ID
const publicKey = fs.readFileSync("pub_key.pem") // 从 https://pay.weixin.qq.com/index.php/core/cert/api_cert#/replace-key-step 下载的
if (user_name) {
headers["Wechatpay-Serial"] = publicKeyID
body.user_name = crypto.publicEncrypt(
{
key: publicKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256"
},
Buffer.from(user_name, "utf8")
).toString("base64")
}
我在对 "POST/v3/fund-app/mch-transfer/transfer-bills" 发起请求时,报错:{ code: 'PARAM_ERROR', message: '平台私钥解密失败' }。

首先我对您说的2~3点表示肯定,我确定这些都不存在任何问题。
其次,我对您说的第1点,“是否正确使用APIv3密钥进行公钥加密”表示疑惑?
按照官方代码示例https://pay.weixin.qq.com/doc/v3/merchant/4013053257来看,应该直接使用微信支付公钥下载下来的 pub_key.pem 文件来进行加密吧?
使用微信支付公钥加密字段后,需要把公钥ID显式声明在请求头上,代码可参考 https://wechatpay.js.org/openapi/v3/fund-app/mch-transfer/transfer-bills
这类一般是用错了加密的平台证书/公钥导致的,如果是平台证书需要通过接口获取,如果是微信公钥要从后台下载单独的公钥而不是使用商户 API 证书