商家转账批次回调通知
更新时间:2024.08.27微信支付系统通过商家转账回调通知接口通知商户系统单据处理到终态。包含批次处理完成通知、批次关单通知。
|
接口说明
支持商户: 【普通商户】
请求方式: POST
回调URL: 该链接是通过商家转账的请求参数“notify_url”来设置的,要求必须为HTTPS地址。请确保回调URL是外部可正常访问的,且不能携带后缀参数,否则可能导致商户无法接收到微信的回调通知信息。回调URL示例:https://pay.weixin.qq.com/wxpay/pay.action
通知规则
商家转账批次单据到终态后(批次完成或者批次关闭,对应批次状态batch_status的值为FINISHED和CLOSED),微信支付会把批次单据的信息发送给商户,商户需要接收处理该消息,并返回应答。
对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为0s/15s(尝试10次)/300s(尝试10次)/1800s(尝试44次))
通知报文
通知的数据以JSON格式通过请求主体(BODY)传输。通知的数据包括了加密的授权/解除授权结果详情。
|
步骤说明
步骤一:验证签名
微信支付会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》。
步骤二:参数解密
为了保证安全性,微信支付在回调通知,对关键信息进行了AES-256-GCM加密。商户应当按照以下的流程进行解密关键信息,解密的流程:
用商户平台上设置的APIv3密钥【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】,记为key;
获取resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),以及resource.nonce和resource.associated_data;
使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象。
|
通知参数
id
必填 String(36)
【通知ID】
通知的唯一ID
create_time
必填 String(32)
遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
event_type
必填 String(32)
【通知类型】
通知的类型,商家转账通知的类型为MCHTRANSFER.BILL.FINISHED
resource_type
必填 String(32)
【通知数据类型】
通知的资源数据类型,商家转账通知为encrypt-resource
resource
必填 object
【通知数据】
json格式
summary
必填 String(64)
【回调摘要】
回调摘要
通知报文示例
header
resource的格式:
algorithm
必填 String(32)
【加密算法类型】
对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM
ciphertext
必填 String(1048576)
【数据密文】
Base64编码后的开启/停用结果数据密文
associated_data
选填 String(16)
【附加数据】
附加数据
original_type
必填 String(16)
【原始类型】
原始回调类型,为mch_payment
nonce
必填 String(32)
【随机串】
加密使用的随机串
body
当 event_type为MCHTRANSFER.BATCH.FINISHED时,数据密文ciphertext解密之后的内容
ObjectBatchFinished json结构:
out_batch_no
必填 String(32)
【商家批次单号】
商户系统内部的商家批次单号,在商户系统内部唯一
batch_id
必填 String(64)
【微信批次单号】
微信批次单号,微信商家转账系统返回的唯一标识
batch_status
必填 String(32)
【批次状态】
WAIT_PAY: 待付款确认。需要付款出资商户在商家助手小程序或服务商助手小程序进行付款确认
ACCEPTED:已受理。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。商户可查询账户资金流水,若该笔转账批次单的扣款已经发生,则表示批次已经进入转账中,请再次查单确认
PROCESSING:转账中。已开始处理批次内的转账明细单
FINISHED:已完成。批次内的所有转账明细单都已处理完成
CLOSED:已关闭。可查询具体的批次关闭原因确认
total_num
必填 integer
【批次总笔数】
转账总笔数。
total_amount
必填 integer
【批次总金额】
转账总金额,单位为“分”。
success_amount
必填 integer
【转账成功金额】
转账成功的金额,单位为“分”。当批次状态为“PROCESSING”(转账中)时,转账成功金额随时可能变化
success_num
必填 integer
【转账成功笔数】
转账成功的笔数。当批次状态为“PROCESSING”(转账中)时,转账成功笔数随时可能变化
fail_amount
必填 integer
【转账失败金额】
转账失败的金额,单位为“分”
fail_num
必填 integer
【转账失败笔数】
转账失败的笔数
update_time
必填 String(64)
【批次更新时间】
遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
解密后单据信息
当 event_type 为MCHTRANSFER.BATCH.CLOSED时,数据密文ciphertext解密之后的内容
ObjectBatchClosed, json结构:
mchid
必填 String(32)
【商户号】
微信支付分配的商户号
out_batch_no
必填 String(32)
【商家批次单号】
商户系统内部的商家批次单号,在商户系统内部唯一
batch_id
必填 String(64)
【微信批次单号】
微信批次单号,微信商家转账系统返回的唯一标识
batch_status
必填 String(32)
【批次状态】
WAIT_PAY: 待付款确认。需要付款出资商户在商家助手小程序或服务商助手小程序进行付款确认
ACCEPTED:已受理。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。商户可查询账户资金流水,若该笔转账批次单的扣款已经发生,则表示批次已经进入转账中,请再次查单确认
PROCESSING:转账中。已开始处理批次内的转账明细单
FINISHED:已完成。批次内的所有转账明细单都已处理完成
CLOSED:已关闭。可查询具体的批次关闭原因确认
total_num
必填 integer
【批次总笔数】
转账总笔数。
total_amount
必填 integer
【批次总金额】
转账总金额,单位为“分”。
close_reason
必填 String(64)
【批次关闭原因】
如果批次单状态为“CLOSED”(已关闭),则有关闭原因
可选取值:
OVERDUE_CLOSE:系统超时关闭,可能原因账户余额不足或其他错误
TRANSFER_SCENE_INVALID:付款确认时,转账场景已不可用,系统做关单处理
update_time
必填 String(64)
【批次更新时间】
遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
通知应答
接收成功:HTTP应答状态码需返回200,无需返回应答报文。
接收失败:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文,格式如下:
code
必填 String(32)
【返回状态码】
错误码,SUCCESS为接收成功,其他错误码为失败。
message
必填 String(64)
【返回信息】
返回信息,如非空,为错误原因。