我们的产品大致分为两类:现付和预付,现付又可以分为两类:担保和非担保,非担保产品不需要支付。
担保和预付产品的取消逻辑大致相同,查看订单详情中的IsCancelable字段和CancelTime字段,IsCancelable为true且CancelTime大于当前时间时,说明这个订单可以取消。担保订单的取消,担保金额会全额退回,预付订单的取消,则根据取消逻辑可能会收取相应的罚金,罚金的多少在hotel.order.detail接口中的罚金字段可以找到,其余金额原路退回。无论哪种退款,都是建立在取消成功的前提下的。
目前退款分为3种
1. 用户主动发起取消,按照上述判定取消成功后,金额会原路退回,如果开通了虚拟卡的代理,我们会退回到虚拟卡中,此时代理应自行给用户退款。
2. 酒店满房,特满,变价导致订单无法确认,客人介入,我们会直接将用户的担保金或预付的金额退回,如果开通了虚拟卡的代理,我们会退回到虚拟卡中,订单详情中RefundDetail节点会返回值,此时代理应自行给用户退款。
3. 现付担保订单,用户正常入住,订单状态变为已结账后,担保金额会原路返回,如果开通了虚拟卡的代理,我们会退回到虚拟卡中,订单详情中RefundDetail节点会返回值,此时代理应自行给用户退款。
关于取消成功的判定,如果通过hotel.order.cancel接口发起取消,先判断接口的返回值是否为true;为true表示我们成功收到了取消订单的请求,但此时并不代表取消成功;为false,则直接判定取消失败。调用取消接口且返回成功后,还需要轮询hotel.incr.order接口来获取订单增量变化,拿到该订单增量变化ID后调用hotel.order.detail判断refundDetail节点下退款金额和退款时间。refundDetail节点中的refundAmount为订单退款总金额 ,refundDetails节点中的refundAmount为每次的退款金额明细, refundTime为每笔退款的时间。当订单发起多次退款时,refundDetails节点下会存在每一次退款的明细。(需要注意的是:支付成功过的才会有退款明细)
合作方可根据每次退款金额明细大于0且当前时间晚于refundTime 时给客人实时进行退款 。但是注意:避免给客人重复退款。
当订单发起取消成功,但24小时之内refundetail未返回数据,可联系艺龙客服跟进退款结果。
接口示例:
{
"refundDetail": {
"refundAmount": 720.0,
"refundDetails": [
{
"refundAmount": 700.0,
"refundTime": "2022-03-29T17:04:43+08:00"
},
{
"refundAmount": 10.0,
"refundTime": "2022-03-29T15:06:42+08:00"
},
{
"refundAmount": 10.0,
"refundTime": "2022-03-29T15:05:23+08:00"
}
]
},
}