应用场景
当买家或卖家在交易后一年内需要退款时,卖家可以通过退款接口将货款退还给买家,微信支付在收到退款请求并验证成功后,会将货款按原方式退还到买家账户。
通知规则
商家退款完成后,微信会将相关退款结果和用户信息发送给清算机构。清算机构接收处理后需要返回成功响应,然后继续异步通知下游从业者。
通知消息
结果退款通知是指POST方法访问的商家设置的通知url,通知的数据以JSON格式通过请求体传输。通知的数据包括加密的支付结果细节。
问题如果开发者通过【退款申请界面】设置了notify_url,通知消息会被推送到指定链接。由于微信支付接口分为v2版本和v3版本,所以收到的通知消息的格式分别对应触发退款的接口版本。
退款流程开发者按照接口文档开发,自己处理通知消息,自然没问题。但如果开发者只开发v3版本但通过商家平台发起退款,通知消息默认为v2的xml格式,那么当开发者在后台收到通知消息时,按照v3版本处理会给出错误。
通知报文V2版本
& ltxml & gt & lt;return _ code & gt成功& lt/return _ code & gt; & lt;appid & gt & lt;![CDATA[appid]]& gt; & lt;/appid & gt; & lt;mch _ id & gt & lt;![CDATA[mch _ id]]& gt; & lt;/mch _ id & gt; & lt;nonce _ str & gt & lt;![CDATA[nonce _ str]]& gt; & lt;/nonce _ str & gt; & lt;req _ info & gt & lt;![CDATA[req_info]]> & lt;/req _ info & gt; & lt;/XML & gt;V3版本
{ original _ type:& # 39;退款& # 39;, 算法:& # 39;AEAD _ AES _ 256 _ GCM & # 39, 密文:& # 39;密文& # 39;, associated _ data:& # 39;退款& # 39;, nonce:& # 39;nonce & # 39 }解决方案服务器端响应& # 39;内容类型& # 39;:'text/XML & # 39;确定通知消息是v2还是v3版本,然后对不同的消息数据进行解密,得到真实信息。
解密退款通知
V2版本
{ return _ code:& # 39;成功& # 39;, appid:& # 39;appid & # 39, mch _ id:& # 39;mch _ id & # 39, nonce _ str:& # 39;nonce _ str & # 39, req _ info:{ out _ refund _ no:& # 39;out _ refund _ no & # 39, out _ trade _ no:& # 39;out _ trade _ no & # 39, 退款_账户:& # 39;退款_来源_充值_资金& # 39;, 退款_费用:& # 39;退款_费用& # 39;, 退款_ id:& # 39;退款_ id & # 39, refund _ recv _ account:& # 39;退款_退款_账户& # 39;, 退款_请求_来源:& # 39;供应商平台& # 39;, 退款_状态:& # 39;成功& # 39;, 结算_退款_费用:& # 39;结算_退款_费用& # 39;, 结算_合计_费用:& # 39;settlement _ total _ fee & # 39, 成功_时间:& # 39;成功_时间& # 39;, total _ fee:& # 39;total _ fee & # 39, transaction _ id:& # 39;交易标识& # 39; } }v3版本
{ mchid: 'mchid', out_trade_no: 'out_trade_no', transaction_id: 'transaction_id', out_refund_no: 'out_refund_no', refund_id: 'refund_id', refund_status: 'SUCCESS', success_time: 'success_time', amount: { total: total, refund: refund, payer_total: payer_total, payer_refund: payer_refund }, user_received_account: 'user_received_account' }(此处已添加小程序,请到客户端查看)