最佳实践
确保交易为终态
当面付交易存在一个中间状态WAIT_BUYER_PAY
, 和三个最终状态, TRADE_SUCCESS
,TRADE_FINISHED
,和 TRADE_CLOSED
。商户必须确保每笔交易都达到终态,同时,交易状态在商户系统,收银员端,和支付宝端必须一致。
默认情况下,一笔当面付交易三分钟内未完成支付,则会自动关闭。实际情况中,收银员大可不必等待三分钟。商户可根据具体业务要求设置自动关闭时间。
您可采取以下措施确保交易为终态:
- 若交易结果在一定时间内未返回,如交易创建五秒后,使用查询接口,按每3-5秒一次的频率轮询。
- 设置超时时间,如60秒,并在超时前持续进行结果轮询。
- 若查询返回
TRADE_SUCCESS
或TRADE_CLOSED
,收银员将被通知交易结果。 - 若查询结果一直是
WAIT_BUYER_PAY
,必须调用撤销接口将交易强制取消。关于撤销重试的详细逻辑,见错误处理。
Note:
以下规则适用于所有产品。
有时收银员可能无法发起交易自动关闭操作。这时商户系统后台内必须进行配置,以对状态为WAIT_BUYER_PAY
的交易进行自动关闭。该配置的触发时间可设置为稍晚于收银员端的自动关闭时间。
更多关于交易状态的信息,见交易状态。
幂等
对支付宝接口而言,幂等指支付宝对重复提交的相同请求,仅返回唯一的结果。支付宝检查幂等,准确记录每一个请求的交易或退款结果。为了帮助支付宝检查幂等,您需要进行如下操作:
- 对重复提交的支付请求,保持商户交易号(out_trade_no或partner_trans_id)一致。商户交易号相同的交易视为同一笔交易。
- 对重复提交的退款请求,保持商户退款号(out_return_no或partner_refund_id)一致。商户退款号相同的退款视为同一笔退款。
支付宝以如下方式检查支付和退款请求的幂等性:
- 使用相同PID的支付请求:
收到支付请求后,支付宝检查商户交易号out_trade_no或partner_trans_id是否一致。商户交易号相同的交易视为对同一笔交易。之后检查其它信息,包括买家信息,交易金额等。若请求内其它信息同支付宝内部信息不一致,则会报错。否则,支付宝返回该笔交易的真实状态。
- 使用相同PID的退款请求:
收到退款请求后,支付宝检查商户退款号out_return_no或partner_refund_id是否一致。商户退款号相同的退款视为对同一笔退款。之后检查其它信息,如退款金额等。若请求内其它信息同支付宝内部信息不一致,则会报错。否则,支付宝返回该笔退款的真实状态。
更多关于幂等的信息,见幂等。