商户提现状态变更通知

更新时间:2024.12.19

一、回调描述

商户调用商户提现API中,当提现状态发生变更时微信支付会通过POST的请求方式,向商户预先设置的回调地址发送回调通知,让商户知晓提现状态变更(包括提现状态变为提现成功、失败、退票、关单)。

回调地址设置方式: 回调地址通过发起提现API中的“notify_url”参数设置(仅支持HTTPS协议),回调地址的设置规范和回调IP列表请参考文档:回调通知注意事项(如与本文档不一致的,以本文档为准)。支持接口如下:

二、回调处理步骤

1、商户接收回调通知报文

微信支付会通过POST的方式向回调地址发送回调报文,回调报文的HTTP请求头中会包含报文的签名信息,用于后续验签,具体如下:

参数

描述

Wechatpay-Serial

验签的“微信支付平台证书”所对应的平台证书序列号

Wechatpay-Signature

验签的签名值

Wechatpay-Timestamp

验签的时间戳

Wechatpay-Nonce

验签的随机字符串

 

回调通知的请求主体中会包含JSON格式的通知参数,具体的通知参数列表如下:

通知参数

BODY 包体参数

 

id 必填 string(36)

【通知ID】回调通知的唯一编号。


create_time 必填 string(32)

【通知创建时间】回调通知创建的时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日13点29分35秒。


event_type 必填 string(32)

【通知类型】微信支付回调通知的类型,商户提现状态变更通知为:MCHWITHDRAW.CHANGE。


resource_type 必填 string(32)

【通知数据类型】通知的资源数据类型,固定为encrypt-resource。


resource 必填 object

【通知资源数据】
json格式,见示例

属性

summary 必填 string(64)

【回调摘要】微信支付对回调内容的摘要备注。为:商户提现状态变更通知。

支付成功结果通知

1{
2    "id":"9ba73029-2717-553f-8e98-1d04bded4fc0",
3    "create_time":"2024-11-16T02:09:29+08:00",
4    "resource_type":"encrypt-resource",
5    "event_type":"MCHWITHDRAW.CHANGE",
6    "resource" : {
7      	"original_type": "mch_withdraw",
8        "algorithm":"AEAD_AES_256_GCM",
9        "ciphertext": "...",
10        "nonce": "...",
11        "associated_data": "mch_withdraw"
12    },
13  "summary": "商户提现状态变更通知"
14}

2、回调验签与应答

商户接收到回调通知报文后,需在3秒内完成对报文的验签,并应答回调通知。

2.1、对回调通知进行验签

验签需使用请求头中的【Wechatpay-Timestamp】、【Wechatpay-Nonce】以及请求主体中JSON格式的通知参数构建出验签串,然后使用【Wechatpay-Serial】对应的微信支付平台证书对验签串和【Wechatpay-Signature】进行验签,确保接收的回调内容是来自微信支付。

详细验签步骤请参考:非文件/图片下载如何验证签名

微信支付会在极少数通知回调中返回以“WECHATPAY/SIGNTEST/”开头的错误【Wechatpay-Signature】,以检测商户系统是否正确验证签名。商户请参考:如何应对签名探测流量进行处理。

2.2、对回调通知进行应答

商户验签后,根据验签结果对回调进行应答:

验签通过商户需告知微信支付接收回调成功,HTTP应答状态码需返回200204,无需返回应答报文。

验签不通过商户需告知微信支付接收回调失败,HTTP应答状态码需返回5XX或4XX,同时需返回以下应答报文:

BODY 包体参数

code 必填 string(32)

【返回状态码】
错误码,FAIL为回调接收失败。


message 选填 string(256)

【返回信息】
返回信息,回调接收失败原因。

应答示例

1{  
2    "code": "FAIL",
3    "message": "失败"
4}

微信支付接收到商户的应答后,会根据应答结果做对应的逻辑处理:
若商户应答回调接收成功,微信支付后续不再发送该回调内容。若因网络或其他原因,商户收到了重复的回调通知,按正常业务流程应答即可。
若商户应答回调接收失败,或超时(3s)未应答时,微信支付会按照(15秒×10次 / 5分钟×10次 / 30分钟×47次)的频次重复发送回调通知,最多覆盖到24小时。

3、对回调通知内容进行解密

为了保证业务信息的安全性,微信支付将业务信息进行了 AES-256-GCM 或 SM4-GCM 加密(取决于商户发起提现API使用的签名方式),并通过参数resource将加密信息回调给商户,商户需要进行解密后才能获取到业务信息。

解密步骤如下:

  1. 获取商户平台上设置的APIv3密钥,记为key;

  2. 通过回调通知参数resource.algorithm确认加密算法,取决于商户发起提现API使用的签名方式:

    1. 签名类型为 WECHATPAY2-SHA256-RSA2048,则加密算法为:AES-256-GCM

    2. 签名类型为WECHATPAY2-SM2-WITH-SM3,则加密算法为:SM4-GCM

  3. 使用key与回调通知参数resource.nonce和resource.associated_data,对数据密文resource.ciphertext进行解密,最终可得到JSON格式的业务信息。

解密示例代码可参考文档:如何解密回调报文

注意

  • 使用Java进行回调解密,取JSON串内的参数值时,只需取引号内的内容进行解密。例:"nonce":"123",只需取值123,不用取加上引号的"123"。

resource解密后字段

同相应的查单返回结构:

  • 平台预约提现 对应的内容同 平台查询预约提现状态 的返回body。

  • 二级商户预约提现 对应的内容同 二级商户查询预约提现状态 的返回body。

  • 平台商户给二级商户按日终余额预约提现 对应的内容同 平台商户查询二级商户的按日终余额预约提现状态 的返回body。