商家转账回调通知(用户确认模式)(JSON) 
商家转账单据到终态后 (转账完成、转账失败和已撤销,对应单据状态status的值为SUCCESS、FAIL和CANCELLED),微信支付会把单据的信息发送给商户,商户需要接收处理该消息,并返回应答。 官方文档
请求头(headers) 
Wechatpay-Nonce: 3d980fb850fdce97f6bfb3d248597f16
Wechatpay-Serial: 7132d72a03e93cddf8c03bbd1f37eedf********
Wechatpay-Signature: i48r5y8IQw1qpTO+ywoV...
Wechatpay-Signature-Type: WECHATPAY2-SHA256-RSA2048
Wechatpay-Timestamp: 1710048759
Request-ID: 08F78BB5AF0610D302189F99DD5C20BA56F89845-0请求报文(body) 
json
{
  "id":"EV-2018022511223320873",
  "create_time":"2015-05-20T13:29:35+08:00",
  "resource_type":"encrypt-resource",
  "event_type":"MCHTRANSFER.BILL.FINISHED",
  "summary": "商家转账单据终态通知",
  "resource" : {
    "original_type": "mch_payment",
    "algorithm":"AEAD_AES_256_GCM",
    "ciphertext": "...",
    "nonce": "...",
    "associated_data": ""
  }
}resource.ciphertext 解密后的明文格式
json
{
  "mchid" : "1900001109",
  "out_bill_no" : "plfk2020042013",
  "transfer_bill_no" : "1330000071100999991182020050700019480001",
  "state" : "ACCEPTED",
  "transfer_amount" : 400000,
  "fail_reason" : "PAYEE_ACCOUNT_ABNORMAL",
  "openid" : "o-MYE42l80oelYMDE34nYD456Xoy",
  "create_time" : "2015-05-20T13:29:35.120+08:00",
  "update_time" : "example_update_time"
}处理程序 
js
const { Formatter, Rsa, Aes } = require('wechatpay-axios-plugin')
const {
  'wechatpay-nonce': wechatpayNonce,
  'wechatpay-serial': wechatpaySerial,
  'wechatpay-signature': wechatpaySignature,
  'wechatpay-timestamp': wechatpayTimestamp,
} = headers
let code = 'SUCCESS', message = undefined
if (Math.abs(Formatter.timestamp() - wechatpayTimestamp) > MAXIMUM_CLOCK_OFFSET) {
  code = 'FAIL'
  message = 'Over clock offset'
}
else
if (!Object.hasOwn(platformPublicKeys, wechatpaySerial)) {
  code = 'FAIL'
  message = 'platform certificate not exists'
}
else
if (!Rsa.verify(
  Formatter.joinedByLineFeed(wechatpayTimestamp, wechatpayNonce, json),
  wechatpaySignature,
  platformPublicKeys[wechatpaySerial]
)) {
  code = 'FAIL'
  message = 'sign mismatched'
}
// do your business
// ...
// ...
const {
  id,
  create_time: event_time,
  resource_type,
  event_type,
  summary,
  resource: {
    ciphertext,
    nonce,
    associated_data
  },
} = JSON.parse(json)
const {
  mchid,
  out_bill_no,
  transfer_bill_no,
  state,
  transfer_amount,
  fail_reason,
  openid,
  create_time,
  update_time,
} = JSON.parse(Aes.AesGcm.decrypt(ciphertext, apiv3Key, nonce, associated_data))
// do your business
// ...
// ...
const response = { code, message }正常应答头(headers) 
Status: 200正常应答报文(body) 
json
{
  "code": "SUCCESS"
}注意:
- 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
 - 如果在所有通知频率后没有收到微信侧回调,商户应调用查询批次接口确认批次状态。
 - 特别提醒:商户系统对于开启结果通知的内容一定要做签名验证,并校验通知的信息是否与商户侧的信息一致,防止数据泄露导致出现“假通知”,造成资金损失。
 - 对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为0s/15s(尝试10次)/300s(尝试10次)/1800s(尝试44次))