注意:
H5支付域名修改申請(qǐng)事件回調(diào)通知API
注意:
● 同樣的通知可能會(huì)多次發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知。
推薦的做法是,當(dāng)商戶系統(tǒ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ì)于開啟結(jié)果通知的內(nèi)容一定要做簽名驗(yàn)證,并校驗(yàn)通知的信息是否與商戶側(cè)的信息一致,防止數(shù)據(jù)泄露導(dǎo)致出現(xiàn)“假通知”,造成意外損失。
1. 接口說(shuō)明
適用對(duì)象: 機(jī)構(gòu)模式
請(qǐng)求URL:該鏈接是通過(guò)創(chuàng)建H5支付域名修改申請(qǐng)單提交notify_url參數(shù)設(shè)置,必須為https協(xié)議。必須為https協(xié)議。如果鏈接無(wú)法訪問,商戶將無(wú)法接收到微信通知。通知url必須為直接可訪問的url,不能攜帶參數(shù)。示例:success_notify_url:“http://www.tg885.com/wxpay/pay.action”
請(qǐng)求方式:POST
2. 通知規(guī)則
H5支付域名修改申請(qǐng),微信會(huì)把相關(guān)審核結(jié)果和申請(qǐng)單信息發(fā)送給商戶,商戶需要接收處理,并按照文檔規(guī)范返回應(yīng)答。出于安全的考慮,我們對(duì)回調(diào)內(nèi)容數(shù)據(jù)進(jìn)行了加密,商戶需要先對(duì)通知數(shù)據(jù)進(jìn)行解密,才能得到回調(diào)結(jié)果數(shù)據(jù)。
對(duì)后臺(tái)通知交互時(shí),如果微信收到應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過(guò)一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。保持階梯式回調(diào),即通知頻率為15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h
- 總計(jì) 24h4m
3. 通知報(bào)文
審核結(jié)果通知是以POST 方法訪問商戶設(shè)置的通知url,通知的數(shù)據(jù)以JSON 格式通過(guò)請(qǐng)求主體(BODY)傳輸。通知的數(shù)據(jù)包括了加密的支付結(jié)果詳情。
下面詳細(xì)描述證書解密的流程
1、從商戶平臺(tái)上獲取商戶的密鑰,記為“key”。
2、針對(duì)resource.algorithm中描述的算法(目前為AEAD_AES_256_GCM),取得對(duì)應(yīng)的參數(shù)nonce和associated_data。
3、使用key、nonce和associated_data,對(duì)數(shù)據(jù)密文resource.ciphertext進(jìn)行解密,得到JSON形式的資源對(duì)象
注意:AEAD_AES_256_GCM算法的接口細(xì)節(jié),請(qǐng)參考rfc5116。微信支付使用的密鑰key長(zhǎng)度為32個(gè)字節(jié),隨機(jī)串nonce長(zhǎng)度12個(gè)字節(jié),associated_data長(zhǎng)度小于16個(gè)字節(jié)并可能為空。
4. 請(qǐng)求參數(shù)
參數(shù)名 |
變量 |
類型[長(zhǎng)度限制] |
必填 |
描述 |
通知ID |
id |
string[1,36] |
是 |
通知的唯一ID
示例值:f7c34059-0f2d-5b32-ba33-a42dks0597c5
|
通知?jiǎng)?chuàng)建時(shí)間 |
create_time |
string[1,64] |
是 |
通知?jiǎng)?chuàng)建的時(shí)間,格式為rfc3339格式,如2018-06-08T10:34:56+08:00?代表北京時(shí)間2018年06月08日10時(shí)34分56秒
示例值:2018-06-08T10:34:56+08:00
|
通知類型 |
event_type |
string[1,32] |
是 |
通知的類型
審核通過(guò)通知的類型為 APPLYMENT_STATE.APPROVED
示例值:APPLYMENT_STATE.APPROVED
|
通知數(shù)據(jù)類型 |
resource_type |
string[1,32] |
是 |
通知的資源數(shù)據(jù)類型,審核成功通知為applyment
示例值:applyment
|
回調(diào)摘要 |
summary |
string[1,64] |
是 |
回調(diào)摘要
示例值:H5支付域名修改申請(qǐng)通知
|
通知數(shù)據(jù) |
resource |
object |
是 |
通知資源數(shù)據(jù) |
參數(shù)名 |
變量 |
類型[長(zhǎng)度限制] |
必填 |
描述 |
加密算法類型 |
algorithm |
string[1,32] |
是 |
對(duì)支付結(jié)果數(shù)據(jù)進(jìn)行加密的加密算法,目前只支持AEAD_AES_256_GCM
示例值:AEAD_AES_256_GCM
|
數(shù)據(jù)密文 |
ciphertext |
string[1,1048576] |
是 |
Base64編碼后的支付結(jié)果數(shù)據(jù)密文 |
原始回調(diào)類型 |
original_type |
string[1,64] |
是 |
原始回調(diào)類型
示例值:applyment
|
附加數(shù)據(jù) |
associated_data |
string[1,16] |
否 |
加密使用的附加數(shù)據(jù) |
隨機(jī)串 |
nonce |
string[1,32] |
是 |
加密使用的隨機(jī)串 |
|
5. 通知簽名
加密不能保證通知請(qǐng)求來(lái)自微信。微信會(huì)對(duì)發(fā)送給商戶的通知進(jìn)行簽名,并將簽名值放在通知的HTTP頭Wechatpay-Signature。商戶應(yīng)當(dāng)驗(yàn)證簽名,以確認(rèn)請(qǐng)求來(lái)自微信,而不是其他的第三方。簽名驗(yàn)證的算法請(qǐng)參考《微信支付API
V3簽名驗(yàn)證》。
{
"id":"f7c34059-0f2d-5b32-ba33-a42dks0597c5",
"create_time":"2019-12-12T16:54:38+08:00",
"resource_type":"applyment",
"event_type":"APPLYMENT_STATE.APPROVED",
"summary":"H5支付域名修改申請(qǐng)通知",
"resource":{
"original_type":"applyment",
"algorithm":"AEAD_AES_256_GCM",
"ciphertext":"xxx",
"associated_data":"applyment",
"nonce":"j9g1wAzF9Xn1"
}
}
商戶對(duì)resource對(duì)象進(jìn)行解密后,得到的資源對(duì)象示例
{
"applyment_id": 1000000,
"applyment_state": "PENDING",
"domains": ["qq.com"],
"notify_url": "http://www.tg885.com/wxpay/pay.action",
"audit_reject_detail": "經(jīng)營(yíng)網(wǎng)址首頁(yè)截圖內(nèi)容違法",
"sub_mchid": "2491935631",
"webiste_url": "https://qq.com",
"website_business_page_pics": ["6uqyGjvHzOhsLleGFQVRF"],
"website_homepage_pics": ["6uqyGjvHzOhsLleGFQVRF"],
"out_applyment_id": "123456",
"website_state": "HAS_LAUNCHED"
}
{
"sp_mchid": "10000100",
}
6. 審核結(jié)果通知參數(shù)
參數(shù)名 |
變量 |
類型[長(zhǎng)度限制] |
必填 |
描述 |
子商戶號(hào) |
sub_mchid |
string[1, 32] |
是 |
當(dāng)前機(jī)構(gòu)/服務(wù)商下的子商戶號(hào)
注意:僅適用于機(jī)構(gòu)模式
示例值:2491935631
|
子商戶經(jīng)營(yíng)網(wǎng)址狀態(tài) |
website_state |
string |
是 |
子商戶經(jīng)營(yíng)網(wǎng)址狀態(tài),包括已上線和未上線
HAS_LAUNCHED:經(jīng)營(yíng)網(wǎng)址已上線
UN_LAUNCHED:經(jīng)營(yíng)網(wǎng)址未上線
注意:僅適用于機(jī)構(gòu)模式
示例值:HAS_LAUNCHED
|
H5支付域名 |
domains |
array |
是 |
Body 拉起H5支付的域名,不超過(guò)5個(gè)。
注意:提交的修改的域名列表審核通過(guò)后將會(huì)覆蓋已有支付域名列表。
示例值:["qq.com"]
|
子商戶H5經(jīng)營(yíng)網(wǎng)址 |
webiste_url |
string[1, 128] |
是 |
包含該子商戶的主營(yíng)業(yè)務(wù)、銷售商品/服務(wù)及價(jià)格、用戶可在線下單購(gòu)買的網(wǎng)址。
注意:僅適用于機(jī)構(gòu)模式
示例值:https://qq.com
|
經(jīng)營(yíng)網(wǎng)址商業(yè)頁(yè)面截圖 |
website_business_page_pics |
array |
否 |
若經(jīng)營(yíng)網(wǎng)址未上線,則此字段必傳。Media ID,通過(guò)上傳圖片API獲得
示例值:["6uqyGjvHzOhsLleGFQVRF"]
|
經(jīng)營(yíng)網(wǎng)址首頁(yè)截圖 |
website_homepage_pics |
array |
否 |
若經(jīng)營(yíng)網(wǎng)址未上線,則此字段必傳。Media ID,通過(guò)上傳圖片API獲得
示例值:["6uqyGjvHzOhsLleGFQVRF"]
|
申請(qǐng)單號(hào) |
applyment_id |
int |
是 |
申請(qǐng)單的唯一標(biāo)識(shí)
示例值:1000000
|
駁回原因 |
audit_reject_detail |
string[1, 500] |
否 |
申請(qǐng)單被駁回的原因,當(dāng)申請(qǐng)單被駁回時(shí)此字段會(huì)顯示具體的駁回原因
示例值:經(jīng)營(yíng)網(wǎng)址首頁(yè)截圖內(nèi)容違法
|
申請(qǐng)單狀態(tài) |
applyment_state |
string |
否 |
H5支付域名修改申請(qǐng)單狀態(tài)
PENDING:待創(chuàng)建,申請(qǐng)單暫未創(chuàng)建,可稍后查詢或檢查進(jìn)件狀態(tài)是否正常
UNDER_REVIEW:審核中,申請(qǐng)單已創(chuàng)建,并且已進(jìn)入審核階段
APPROVED:已通過(guò),申請(qǐng)單已審核通過(guò)
REJECTED:已駁回,申請(qǐng)單已駁回,請(qǐng)留意駁回原因字段 audit_reject_detail
示例值:PENDING
|
商戶提供的審核結(jié)果回調(diào)接口 |
notify_url |
string[1, 128] |
否 |
必須為https協(xié)議。如果鏈接無(wú)法訪問,商戶將無(wú)法接收到微信通知。
通知url必須為直接可訪問的url,不能攜帶參數(shù)。
《域名修改回調(diào)文檔》
示例值:http://www.tg885.com/wxpay/pay.action
|
商戶申請(qǐng)單號(hào) |
out_applyment_id |
string[6, 32] |
是 |
商戶系統(tǒng)內(nèi)部申請(qǐng)單號(hào),只能是數(shù)字、大小寫字母_-*且在同一個(gè)商戶號(hào)下唯一
示例值:123456
|
7. 通知應(yīng)答
參數(shù)名 |
變量 |
類型 |
必填 |
描述 |
返回狀態(tài)碼 |
code |
string[1,32] |
是 |
詳見下面返回狀態(tài)碼說(shuō)明
示例值:SUCCESS
|
返回信息 |
message |
string[1,256] |
否 |
返回信息,為錯(cuò)誤原因
示例值:系統(tǒng)錯(cuò)誤
|
200
{
"code": "SUCCESS",
"message": "OK"
}
{
"code": "SYSTEM_ERROR",
"message": "系統(tǒng)失敗"
}