分賬動(dòng)賬通知
應(yīng)用場(chǎng)景
● 分賬或分賬回退成功后,微信會(huì)把相關(guān)變動(dòng)結(jié)果發(fā)送給分賬接收方(只支持商戶)。
● 對(duì)后臺(tái)通知交互時(shí),如果微信收到應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。
本接口使用微信支付V3版接口規(guī)則參見:https://wechatpay-api.gitbook.io/wechatpay-api-v3/
推薦的做法是,當(dāng)收到通知進(jìn)行處理時(shí),首先檢查對(duì)應(yīng)業(yè)務(wù)數(shù)據(jù)的狀態(tài),判斷該通知是否已經(jīng)處理過,如果沒有處理過再進(jìn)行處理,如果處理過直接返回結(jié)果成功。在對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行狀態(tài)檢查和處理之前,要采用數(shù)據(jù)鎖進(jìn)行并發(fā)控制,以避免函數(shù)重入造成的數(shù)據(jù)混亂。
特別提醒:商戶系統(tǒng)對(duì)于分賬動(dòng)賬通知的內(nèi)容一定要做簽名驗(yàn)證,防止數(shù)據(jù)泄露導(dǎo)致出現(xiàn)“假通知”,造成資金損失。
分賬動(dòng)賬通知是以POST方法訪問商戶設(shè)置的通知url,通知的數(shù)據(jù)以JSON格式通過請(qǐng)求主體(BODY)傳輸。通知的數(shù)據(jù)包括了加密的分賬動(dòng)賬結(jié)果詳情。
注意:同樣的通知可能會(huì)多次發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知。
接口說明
請(qǐng)求Url | 該鏈接是通過商戶平臺(tái)【分賬動(dòng)賬通知設(shè)置頁面】中配置的通知url,必須為https協(xié)議。如果鏈接無法訪問,商戶將無法接收到微信通知。必須為直接可訪問的url,不能攜帶參數(shù)。示例:notify_url:http://www.tg885.com/wxpay/123456789 |
---|---|
是否需要證書 | 否 |
請(qǐng)求方式 | post |
請(qǐng)求參數(shù)
名稱 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
---|---|---|---|---|---|
通知ID |
id |
是 | string(32) |
EV-2018022511223320873 |
通知的唯一ID |
通知?jiǎng)?chuàng)建時(shí)間 |
create_time |
是 | string(32) |
2018-06-08T10:34:56+08:00 |
通知?jiǎng)?chuàng)建的時(shí)間,Rfc3339標(biāo)準(zhǔn) |
通知類型 |
event_type |
是 | string(32) |
TRANSACTION.SUCCESS |
通知的類型: TRANSACTION.SUCCESS:分賬 |
通知簡(jiǎn)要說明 |
summary |
是 | string(16) |
分賬 |
通知簡(jiǎn)要說明 |
通知數(shù)據(jù)類型 |
resource_type |
是 | string(32) |
encrypt-resource |
通知的資源數(shù)據(jù)類型,分賬動(dòng)賬通知為encrypt-resource |
+通知數(shù)據(jù) | resource |
是 |
object |
內(nèi)容見下方示例 |
通知資源數(shù)據(jù) 點(diǎn)擊行前的+展開字段詳情 |
下面詳細(xì)描述對(duì)通知數(shù)據(jù)進(jìn)行解密的流程
● 從商戶平臺(tái)上獲取商戶的通知密鑰,記為key
● 針對(duì)resource.algorithm中描述的算法(目前為AEAD_AES_256_GCM),取得對(duì)應(yīng)的參數(shù)nonce和associated_data。
● 使用key、nonce和associated_data,對(duì)數(shù)據(jù)密文resource.ciphertext進(jìn)行解密,得到JSON形式的資源對(duì)象 注:AEAD_AES_256_GCM算法的接口細(xì)節(jié),請(qǐng)參考[rfc5116] (https://datatracker.ietf.org/doc/html/rfc5116)。微信支付使用的密鑰key長(zhǎng)度為32個(gè)字節(jié),隨機(jī)串nonce長(zhǎng)度12個(gè)字節(jié),associated_data長(zhǎng)度小于16個(gè)字節(jié)并可能為空。
解密后的resource對(duì)象列表
名稱 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
---|---|---|---|---|---|
直連商戶號(hào) |
mchid |
是 |
string(32) |
1900000100 |
直連模式分賬發(fā)起和出資商戶 |
微信訂單號(hào) |
transaction_id |
是 |
string(32) |
4200000000000000000000000000 |
微信支付訂單號(hào) |
微信分賬/回退單號(hào) |
order_id |
是 |
string(64) |
1217752501201407033233368018 |
微信分賬/回退單號(hào) |
商戶分賬/回退單號(hào) |
out_order_no |
是 |
string(64) |
P20150806125346 |
分賬方系統(tǒng)內(nèi)部的分賬/回退單號(hào) |
+分賬接收方 | receiver |
是 |
object |
內(nèi)容見下方示例 | 分賬接收方對(duì)象 點(diǎn)擊行前的+展開字段詳情 |
成功時(shí)間 |
success_time |
是 |
string(32) |
2018-06-08T10:34:56+08:00 |
成功時(shí)間,Rfc3339標(biāo)準(zhǔn) |
舉例如下:
{
"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": "運(yùn)費(fèi)/交易分賬/及時(shí)獎(jiǎng)勵(lì)",
},
"success_time": "2018-06-08T10:34:56+08:00",
}
返回結(jié)果
名稱 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
---|---|---|---|---|---|
返回狀態(tài)碼 |
code |
是 |
string(32) |
SUCCESS |
錯(cuò)誤碼,SUCCESS為接收成功,其他錯(cuò)誤碼為失敗 |
返回信息 |
message |
否 |
string(256) |
系統(tǒng)錯(cuò)誤 |
返回信息,如非空,為錯(cuò)誤原因 |
注意:分賬動(dòng)賬通知http應(yīng)答碼為200且返回狀態(tài)碼為SUCCESS才會(huì)當(dāng)做商戶接收成功,否則會(huì)重試。重試過多會(huì)導(dǎo)致微信支付端積壓過多通知而堵塞,影響其他正常通知。
舉例:
{
"code": "SUCCESS"
}