一、背景
为什么需要关单? 前文说了,用户在下单支付之后,什么时候真正支付是不可预知。
所以,我们一般会对支付订单设置一个过期时间,无论是支付安全也好,还是业务上的支付时间要求也罢。
下面举一个例子,常见于商品搞活动的支付场景:
- 规定某个商品的支付时间必须是在30分钟内完成支付, 业务订单(订单服务所创建的订单)和支付订单都将在30分钟后自动过期。但是,如果用户在即将过期时,已拉起了支付,停留在输入密码界面;等订单过期后,用户这个时候才进行支付,而支付渠道是不知道支付订单已过期了。 所以,我们需要及时通知支付渠道,阻止用户在订单过期之后的支付。
所以我们总结下,什么状态下的支付订单才允许被关单?
- 状态是未支付或者支付中
- 在关单前,再次主动查询支付结果,相当于是二次确认订单是未支付
下面是关单流程:
二、关单流程
三、关单接口
关单接口本身非常简单
- 接口名称:对公收款订单关闭
- 接口URI:/api/corporateAccounts/payments/ordersClose
- 请求方式:POST
- 必填的请求参数:
-
- ebankPyOrdrNo:浦发银行支付流水号,在支付下单的时候返回的字段tranOrdrNo
-
- origTranDate:浦发银行交易日期,也是在支付下单的时候返回的字段tranDate
示例报文
- 请求报文
{
"mrchId": "310319982990001",
"ebankPyOrdrNo": "1901041813111811145662066744",
"origTranDate": "20240418"
}
- 响应报文
判断errCode是否等于0000000,所以需要解析响应报文中的errCode和errInfo。然而其他字段,对于我们程序并不用得上。
{
"statusCode": "0000",
"transNo": "04972404186851313124609429",
"mrchId": "",
"tranOrdrNo": "1A41041813120106664798A00162",
"errCode": "0000000",
"errInfo": "订单关闭成功",
"orgOrdrStCd": "06",
"rsrvFld1": "",
"rsrvFld2": "",
"rsrvFld3": "",
"rsrvFld4": "",
"rsrvFld5": "",
"rsrvFld6": "",
"extdFld1": "",
"extdFld2": ""
}
四、总结
关单接口比较简单,就讲到这。
有些支付渠道却没有提供关单接口,就我对接过的银行中,提供了关单接口的银行有工行、杭州银行、浦发银行和微信;未提供关单接口的银行是农行。
希望通过本文的讲述,你对接第三方支付的时候,尽量接入关单接口。(第三方支付的接口众多,需要形成一个支付闭环,不要对接了一个支付下单和支付回调接口就完事了)