http://doc.cocolian.cn/essay/payment/2016/10/24/account-5-iap/
作者:凤凰牌老熊

一、退款逻辑

1、退款请求基本要素判断:订单支付状态、是否支持退款、退款金额、退款帐户、退款描述;
2、通过基本要素判断后的退款请求会透传至渠道侧并生成退款对象;

  • 如果渠道侧未明确返回退款处理的结果或状态,则设置为 pending(这里需要注意的是,如果出现请求连接超时或网络异常,将该笔退款状态设置为 pending ,且会进行一次原单重试,若依旧连接超时或网络异常,保持 pending 并通过后续的查询结果更新状态);
  • 如果渠道侧返回了退款处理失败的结果或状态,则设置为 failed;
  • 如果渠道侧返回了退款处理成功的结果或状态,则设置为 success;

3、根据渠道的退款成功异步通知或退款查询结果,更新退款的状态;
4、针对所有对接的渠道均设置了退款状态的自动查询逻辑(按照一定的时间间隔),主要因为以下两点原因:

  • 部分渠道没有退款成功的异步通知;
  • 由于某些魔障的原因导致没能正常接收渠道的异步通知;
    5、针对部分渠道有会特殊处理逻辑:比如由于部分渠道侧的原因,我们会增加对于退款查询返回的特定错误码标记为处理中(pending),再按照与渠道达成的时间约定再次查询更新,或者进行手动更新,这种情况和概率都比较少,多见于渠道侧的数据不同步、逻辑待优化情况。

    二、渠道侧处理

    2.1 微信

    1.退款周期
    默认 1 年(客户可自行与渠道 BD 申请延长可退款周期)
    2.退款规则
    1)退款创建

  • 微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号;

  • 每个支付订单的部分退款次数不能超过 50 次;
  • 请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次。错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次。

2)退款查询

  • 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款 3 个工作日后重新查询退款状态;
  • 如果单个支付订单部分退款次数超过20次请使用退款单号(refund_id)查询;
  • 微信订单号查询的优先级是: 微信退款单号refund_id > 商户退款单号out_refund_no > 微信订单号transaction_id > 商户订单号out_trade_no;

3)退款通知

  • 开通该功能需要在商户平台-交易中心-退款配置中配置notify_url ;
  • 退款的三种情况会发送异步通知:SUCCESS-退款成功、CHANGE-退款异常、REFUNDCLOSE-退款关闭;

    2.2 支付宝

    1.退款周期
    默认 3 个月(客户可自行与渠道 BD 申请延长可退款周期)
    2.退款规则
    1)退款创建(针对 openapi 接口)

  • 支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。

  • 交易超过约定时间(签约时设置的可退款时间)的订单无法进行退款,支付宝退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。
  • 一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额;
  • 返回码 code = 10000 且 fund_change = Y 时,可以判断退款成功;

2)退款查询
返回码 code=10000,仅代表本次查询操作成功,不代表退款成功。如果退款查询接口返回了查询数据,则代表退款成功,如果没有查询到则代表未退款成功,可以调用退款接口进行重试。重试时请务必保证退款请求号一致。
3)退款通知

  • mapi 接口(旧):退款成功时会发送异步通知:REFUND_SUCCESS-退款成功;
  • openapi 接口(新):无

    2.3 QQ 钱包

    1.退款周期
    默认 1 年(客户可自行与渠道 BD 申请延长可退款周期)
    2.退款规则
    1)退款创建
    QQ钱包退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额;
    2)退款查询

  • 商户退款单号 out_refund_no 和 QQ 钱包订单号 transaction_id 映射关系只保存1个月,超过1个月查 out_refund_no 将会查不到订单,提示“REFUND_NOT_EXIST”,按照 transaction_id 来查退款单则不会有问题;

  • qq 钱包在落 db 前有很多检查,没落 db 的退款请求在查询时会提示“REFUND_NOT_EXIST”,以下退款情况不会落 db :
    a.根据交易单号或者钱包单号没有找到支付订单;
    b.退款的商家帐户余额不足;
    c.续费查询失败;

3)退款通知

2.4 翼支付

1.退款周期
默认 6 个月(客户可自行与渠道 BD 申请延长可退款周期)
2.退款规则
1)退款创建

  • 商户向翼支付网关发起退款请求,翼支付网关回传退款请求受理结果(“受理成功”or“受理失败”);
  • 退款请求受理成功后,翼支付网关向银行发起线上退款,由银行进行退款并将退款处理结果回传至翼支付网关(“退款成功”or“退款失败”);

2)退款查询

  • 线上退款转至线下退款时,因线下退款处理时效较长,商户发起查询退款结果的请求时,翼支付查询订单是根据商户发起请求的时间 ±1 天的时间区间进行查询的,但实际线下退款处理时间可能超过该区间,故可能导致查询不到该笔退款订单;

3)退款通知

  • 线上退款的两种情况会触发异步通知:退款成功、退款失败。线下退款成功不会同步信息至线上且不会发起异步通知。
  • 如线上退款失败,商户会收到“退款失败”的异步通知,该笔退款订单第二天由翼支付系统自动向银行再次发起退款,如果退款成功,将异步回调商户“退款成功”,并将翼支付网关系统内该笔订单“退款失败”的状态更新为“退款成功”;如果线上退款失败将转由翼支付线下人工退款,线下退款成功后,翼支付网关系统会将该笔订单“退款失败”的状态更新为“退款成功”,并不再异步回传处理结果。
  • 部分银行不支持当日交易退款,在发生当日交易退款时,退款订单将会返回商户“退款失败”,并进入翼支付网关系统待退款表内,系统将于次日自动再次发起退款,并返回处理结果;

    三、关于手续费

  1. 一般银行方不退
  2. 支付宝,不退回(默认) 支付宝针对不同的支付产品退款退回手续费策略不一样
    • 当面付产品,退款时候会退回手续费;
    • 非当面付产品主要根据商户与支付宝 BD 签约时候的具体协议,可以申请退手续费;
  3. 微信,退回
  4. 银联,退回
  5. 京东,不退回(默认) 默认退款不退回手续费,商户可以向京东申请退款时候退手续费。
  6. QQ 钱包,退回

感谢您对本文的关注,如需要及时收到凤凰牌老熊的最新作品,或者有相关问题探讨,请扫码关注“凤凰牌老熊”的微信公众号,在公众号里留言或者回复,可以尽快处理,谢谢。
本文欢迎转载,转载时请注明本文来自 微信公众号“凤凰牌老熊”。