合单支付通知(XML)
合单支付的支付结果将只通知给合单支付发起方(即combine_appid一方),支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。 官方文档
请求报文
xml
<xml>
<return_code>SUCCESS</return_code>
<return_msg>签名失败</return_msg>
<combine_appid>wx8888888888888888</combine_appid>
<combine_mch_id>1900000109</combine_mch_id>
<nonce_str>5K8264ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<device_info>000077</device_info>
<combine_openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</combine_openid>
<combine_out_trade_no>1217752501201407033233368018</combine_out_trade_no>
<trade_type>MWEB</trade_type>
<bank_type>CMC</bank_type>
<sign>C380BEC2BFD727A4B6845133519F3AD6</sign>
<sign_type>HMAC-SHA256</sign_type>
<result_code>SUCCESS</result_code>
<result_msg>OK</result_msg>
<err_code>SYSTEMERROR</err_code>
<err_code_des>系统错误</err_code_des>
<sub_order_list><![CDATA[{"order_num": 3,"order_list": [{},{},{}]}]]></sub_order_list>
</xml>
处理程序
js
const { Transformer, Hash } = require('wechatpay-axios-plugin')
const obj = Transformer.toObject(xml)
const sign_type = 64 === obj?.sign?.length ? 'HMAC-SHA256' : 'MD5'
let return_code = 'SUCCESS', return_msg = 'OK'
if (!Hash.equals(Hash.sign(sign_type, obj, apiv2Secret), obj?.sign)) {
return_code = 'FAIL'
return_msg = 'sign mismatched'
}
const {
order_num,
order_list,
} = JSON.parse(obj.sub_order_list)
// do your business
// ...
// ...
const response = Transformer.toXml({return_code, return_msg})
应答报文
xml
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
注意:
- 合单支付的支付结果将只通知给合单支付发起方(即combine_appid一方)。
- 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
- 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
- 注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
- 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
- 特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄露导致出现“假通知”,造成资金损失。