一. 官网
https://opendocs.alipay.com/open/6c0cdd7d_alipay.trade.refund?scene=common&pathHash=4081e89c
二. 注意事项
1 注意事项
同一笔交易的退款至少间隔3s后发起(加锁) 请严格按照接口文档中的参数进行接入。若在此接口中传入【非当前接口文档中的参数】会造成【退款失败或重复退款】。 该接口不可与其他退款产品混用。若商户侧同一笔退款请求已使用了当前接口退款的情况下,【再使用其他退款产品进行退款】可能会造成【重复退款】。 退款成功判断说明:接口返回fund_change=Y为退款成功,fund_change=N或无此字段值返回时需通过退款查询接口进一步确认退款状态。详见退款成功判断指导。注意,接口中code=10000,仅代表本次退款请求成功,不代表退款成功。
2 退款问题
2.1 Q:交易退款接口是否会触发异步通知?
A:统一收单交易退款接口(alipay.trade.refund)本身接口不支持设置notify_url参数,因此退款导致触发的异步通知是发送到支付接口中设置的notify_url。
根据退款的行为可分为全额退款和部分退款,由于App支付异步触发条件默认TRADE_SUCCESS(交易成功),TRADE_CLOSED(交易关闭),TRADE_FINISHED(交易完成)三种状态均会触发异步通知。
全额退款:交易状态变为TRADE_CLOSED(交易关闭),触发通知。
部分退款:交易状态为TRADE_SUCCESS(交易成功),触发通知。
同理可用于交易关闭接口(alipay.trade.close),接口调用后交易状态为TRADE_CLOSED(交易关闭)。
2.2 Q:如何区分支付和退款触发的通知?
A:相较支付触发的异步通知,退款触发异步通知中有refund_fee(总退款金额)、gmt_refund(交易退款时间)等参数。
2.3 Q:如何区分全额退款和部分退款触发的通知?
A:(1)异步通知中的out_biz_no为退款接口的out_request_no,若未设置则为退款的trade_no,可用于判断对应那笔退款请求。
(2)部分退款的交易状态是TRADE_SUCCESS(交易成功),且异步通知中有退款相关参数等信息。
全额退款成功的交易状态是TRADE_CLOSED(交易关闭),异步通知中有退款相关参数,且含有gmt_close(订单结束时间)。
2.4 Q:如何区分全额退款和订单超时触发的异步通知?
A:全额退款和订单超时都会导致TRADE_CLOSED(交易关闭),由于全额退款是支付成功后退款导致。
全额退款的异步通知中有refund_fee(总退款金额)、gmt_refund(交易退款时间)参数,订单超时关闭没有这两个参数。
2.5 Q:如何查询退款资金到账时间?
A:
-
如果付款是通过支付宝余额等渠道,退款成功后就直接到账。
-
如果付款是通过银行卡支付,可根据退款接口中deposit_back_info(银行卡冲退信息)的est_bank_receipt_time(预估银行到账时间)进行判断。
3 退款时效
商家开通时可能由于开通协议不同或者其它原因,导致退款有效期不同,具体可退款时间建议联系商家客服。请到 商家服务中心 在线咨询或拨打商家服务热线 4007585858 咨询,服务时间为 8:00-24:00。
4 如何查询退款资金到账时间
商户向支付宝发起退款后,可通过 alipay.trade.refund.depositback.completed(收单退款冲退完成通知),获取退款后资金返回银行卡后返回的通知信息从而得知用户真实的退款到账时间。目前支付宝返回的退款时间(gmt_refund)为退款成功时间,不是退款到账时间。
-
如果付款是通过支付宝余额等渠道,为直接到账时间。
-
如果付款是通过银行卡支付的,目前由于受到银行结算时间的影响,统一展示为 1-3 个工作日到账,以银行结算时间为准。
5 退款不收取服务费也不退支付的手续费
三. 整体流程图
退款状态判断:https://opendocs.alipay.com/support/01rawa
退款异步通知参数:https://opendocs.alipay.com/support/01rawh?pathHash=e1a789e8
退款异步注意事项:https://opendocs.alipay.com/support/01rawc
四. 表结构设计
CREATE TABLE pay_refund ( id bigint NOT NULL COMMENT '主键id', user_id bigint NOT NULL COMMENT '用户id', order_trade_id varchar(64) NOT NULL COMMENT '支付订单编号', refund_amount decimal(10,2) NOT NULL COMMENT '退款金额', actually_pay_money decimal(10,2) NOT NULL COMMENT '实付金额', refund_request_no varchar(64) NOT NULL COMMENT '退款单号', plat_fee_money decimal(10,2) NOT NULL COMMENT 'seek收取的退款手续费', status int NOT NULL COMMENT '退款状态 4退款中 5退款成功 6退款失败', refund_fee decimal(10,2) DEFAULT NULL COMMENT '用户实际收到金额', send_back_fee decimal(10,2) DEFAULT NULL COMMENT '本次商户实际退回金额', channel_error_code varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '调用渠道的错误码', channel_error_msg varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '调用渠道报错时,错误信息', success_time bigint DEFAULT NULL COMMENT '退款成功时间', create_time bigint NOT NULL COMMENT '创建时间', update_time bigint NOT NULL COMMENT '更新时间', creator varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者', updater varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者', deleted tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='支付-退款详情';
五. 待确定问题
1. 最晚退款时间为?
支付宝默认12个月可退款
2. 退款路径?是原路退回还是退回至支付宝
只能原路退回
3. 退款支付的手续费?
没有手续费