分账动账通知
应用场景
● 分账或分账回退成功后,微信会把相关变动结果发送给分账接收方(只支持商户)。
● 对后台通知交互时,如果微信收到应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
本接口使用微信支付V3版接口规则参见:https://wechatpay-api.gitbook.io/wechatpay-api-v3/
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于分账动账通知的内容一定要做签名验证,防止数据泄露导致出现“假通知”,造成资金损失。
分账动账通知是以POST方法访问商户设置的通知url,通知的数据以JSON格式通过请求主体(BODY)传输。通知的数据包括了加密的分账动账结果详情。
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
接口说明
请求Url | 该链接是通过商户平台【分账动账通知设置页面】中配置的通知url,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。必须为直接可访问的url,不能携带参数。示例:notify_url:https://pay.weixin.qq.com/wxpay/123456789 |
---|---|
是否需要证书 | 否 |
请求方式 | post |
请求参数
名称 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
---|---|---|---|---|---|
通知ID |
id |
是 | string(32) |
EV-2018022511223320873 |
通知的唯一ID |
通知创建时间 |
create_time |
是 | string(32) |
2018-06-08T10:34:56+08:00 |
通知创建的时间,Rfc3339标准 |
通知类型 |
event_type |
是 | string(32) |
TRANSACTION.SUCCESS |
通知的类型: TRANSACTION.SUCCESS:分账 |
通知简要说明 |
summary |
是 | string(16) |
分账 |
通知简要说明 |
通知数据类型 |
resource_type |
是 | string(32) |
encrypt-resource |
通知的资源数据类型,分账动账通知为encrypt-resource |
+通知数据 | resource |
是 |
object |
内容见下方示例 |
通知资源数据 点击行前的+展开字段详情 |
下面详细描述对通知数据进行解密的流程
● 从商户平台上获取商户的通知密钥,记为key
● 针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data。
● 使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象 注:AEAD_AES_256_GCM算法的接口细节,请参考[rfc5116] (https://datatracker.ietf.org/doc/html/rfc5116)。微信支付使用的密钥key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空。
解密后的resource对象列表
名称 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
---|---|---|---|---|---|
服务商商户号 |
sp_mchid |
是 |
string(32) |
1900000100 |
服务商模式分账发起商户 |
子商户号 |
sub_mchid |
是 |
string(32) |
1900000100 |
服务商模式分账出资商户 |
微信订单号 |
transaction_id |
是 |
string(32) |
4200000000000000000000000000 |
微信支付订单号 |
微信分账/回退单号 |
order_id |
是 |
string(64) |
1217752501201407033233368018 |
微信分账/回退单号 |
商户分账/回退单号 |
out_order_no |
是 |
string(64) |
P20150806125346 |
分账方系统内部的分账/回退单号 |
+分账接收方 | receiver |
是 |
object |
内容见下方示例 | 分账接收方对象 点击行前的+展开字段详情 |
成功时间 |
success_time |
是 |
string(32) |
2018-06-08T10:34:56+08:00 |
成功时间,Rfc3339标准 |
举例如下:
{
"mchid": "",
"sp_mchid": "1900000100",
"sub_mchid": "1900000100",
"transaction_id": "4200000000000000000000000000",
"order_id": "1217752501201407033233368018",
"out_order_no": "P20150806125346",
"receiver": {
"type": "MERCHANT_ID",
"account": "1900000100",
"amount": 888,
"description": "运费/交易分账/及时奖励",
},
"success_time": "2018-06-08T10:34:56+08:00",
}
返回结果
名称 |
变量名 |
必填 |
类型 |
示例值 |
描述 |
---|---|---|---|---|---|
返回状态码 |
code |
是 |
string(32) |
SUCCESS |
错误码,SUCCESS为接收成功,其他错误码为失败 |
返回信息 |
message |
否 |
string(256) |
系统错误 |
返回信息,如非空,为错误原因 |
注意:分账动账通知http应答码为200且返回状态码为SUCCESS才会当做商户接收成功,否则会重试。重试过多会导致微信支付端积压过多通知而堵塞,影响其他正常通知。
举例:
{
"code": "SUCCESS"
}