订单支付失败(TRANSACTION.FAIL)回调通知(XML)
用户确认完成后,微信后台会把相关确认结果和订单信息发送给商户,商户需要接收处理该消息,并返回应答。 免押租借订单支付失败通知 免压速住订单支付失败通知
请求报文
xml
<xml>
<mch_id>10000100</mch_id>
<app_id>wx2134213414324</app_id>
<event_id>EV-2018022511223320873</event_id>
<event_create_time>20180225112233</event_create_time>
<event_type>TRANSACTION.FAIL</event_type>
<event_algorithm>AEAD_AES_256_GCM</event_algorithm>
<event_nonce>...</event_nonce>
<event_associated_data>...</event_associated_data>
<event_ciphertext>...</event_ciphertext>
<algorithm>HMAC-SHA256</algorithm>
<nonce_str>...</nonce_str>
<sign>xxxxxxx</sign>
</xml>
event_ciphertext 解密后明文格式
xml
<xml>
<state>USER_PAID</state>
<service_id>1234352342</service_id>
<out_order_no >1234352342545345454</out_order_no>
<order_id>1234352342545345454</order_id>
<room>豪华双人房</room>
<checked_in>TRUE</checked_in>
<start_time>20091225091010</start_time>
<deposit_amount>10000</deposit_amount>
<total_amount>200</total_amount>
<end_time>20091225091210</end_time>
<finish_transaction_id>…</finish_transaction_id>
</xml>
- 免押租借 event_ciphertext 解密后含 goods_name 字段
- 免压速住 event_ciphertext 解密后含 room 字段
处理程序
js
const { Transformer, Hash, Aes } = require('wechatpay-axios-plugin')
const {
mch_id,
app_id,
event_id,
event_create_time,
event_type,
event_algorithm,
event_nonce,
event_associated_data,
event_ciphertext,
algorithm,
nonce_str,
sign,
} = Transformer.toObject(xml)
const obj = {
mch_id,
app_id,
event_id,
event_create_time,
event_type,
event_algorithm,
event_nonce,
event_associated_data,
event_ciphertext,
algorithm,
nonce_str,
}
const sign_type = algorithm || 'HMAC-SHA256'
let return_code = 'SUCCESS', return_msg = 'OK'
if (!Hash.equals(Hash.sign(sign_type, obj, apiv2Secret), sign)) {
return_code = 'FAIL'
return_msg = 'sign mismatched'
}
// do your business
// ...
// ...
const {
state,
service_id,
out_order_no,
order_id,
room,
checked_in,
start_time,
deposit_amount,
total_amount,
end_time,
finish_transaction_id,
} = Transformer.toObject(Aes.AesGcm.decrypt(
event_nonce, apiv3Key, event_ciphertext, event_associated_data
))
// do your business
// ...
// ...
const response = Transformer.toXml({code: return_code, message: return_msg})
应答报文
xml
<xml>
<code><![CDATA[SUCCESS]]></code>
<message><![CDATA[OK]]></message>
</xml>
注意:
- 用户确认完成后,微信后台会把相关确认结果和订单信息发送给商户,商户需要接收处理该消息,并返回应答。
- 对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)
- 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
- 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
- 如果在所有通知频率(4小时)后没有收到微信侧回调,商户应调用查询订单接口确认订单状态。
- 特别提醒:商户系统对于确认结果通知的内容一定要做签名验证,并校验通知的信息是否与商户侧的信息一致,防止数据泄露导致出现“假通知”,造成资金损失。