新说明:https://open.elong.com/faq/detail?id=329&plt=2
------------------------------------分隔线-------------------------------------
我们的产品产品大致分为两类:现付和预付,现付又可以分为两类:担保和非担保,非担保产品不需要支付。
担保和预付产品的取消逻辑大致相同,查看订单详情中的IsCancelable字段和CancelTime字段,IsCancelable为true且CancelTime大于当前时间时,说明这个订单可以取消。担保订单的取消,担保金额会全额退回,预付订单的取消,则根据取消逻辑可能会收取相应的罚金,罚金的多少在hotel.order.detail接口中的罚金字段可以找到,其余金额原路退回。无论哪种退款,都是建立在取消成功的前提下的。
关于取消成功的判定,首先判断hotel.order.cancel接口的返回值是否为true,为true表示我们成功收到了取消订单的请求,但此时并不代表取消成功,为false,则直接判定取消失败。调用取消接口且返回成功后,还需要轮询hotel.incr.order接口来查询最新的订单状态,订单状态变为D即为取消成功,处于E状态48小时,需联系艺龙客服跟进取消结果。
退款逻辑分为三种,一种是用户主动发起取消,按照上述判定取消成功后,金额会原路退回,如果开通了虚拟卡的代理,我们会退回到虚拟卡中,此时代理应自行给用户退款。
第二种是担保订单,用户正常入住,订单状态变为已结账后,担保金额会原路返回,如果开通了虚拟卡的代理,我们会退回到虚拟卡中,此时代理应自行给用户退款。
第三种是酒店满房,订单无法确认,此时不需要判定取消规则,我们会直接将用户的担保金或预付的金额退回,如果开通了虚拟卡的代理,我们会退回到虚拟卡中,此时代理应自行给用户退款。
预付订单罚金和退款金额说明:
当客人还没有入住这个订单需要进行取消的时候,根据规则需要产生罚金,则订单将取消变成删除状态,并将罚金设置到PenaltyToCustomer属性中;
当客人已经入住了这个订单,但入住的间夜需要减少,酒店同意退款的情况(如果不同意那就是没必要进行操作),订单将保持“已结账”状态,订单总金额不变化,并将退款的金额写入到订单详情接口返回值的RefundAmount属性中。
总结下来,当接收到订单增量时,需要调用订单详情接口,根据CreditCard节点中的ProcessType和Status判断是否有退款和是否退款成功,然后判断RefundAmount字段是否为空,不为空时,按照RefundAmount字段退款,为空时,在罚金PenaltyToCustomer字段为0时,如果发生退款,CreditCard中的Amount就是实际退给用户的金额;如果罚金PenaltyToCustomer字段大于0,那么CreditCard中的Amount是罚金,实际退给用户的金额应该是总价减去这个值。在计算实际退给用户的金额时,总价建议使用TotalPriceExchanged。