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