首先说一下支付宝支付时容易产生误解的两个领域。
一个是
另一个是字段
当用户输入支付密码或进行支付发起扣款操作,支付宝便会启动对用户可用的支付方式进行轮询,例如通过支付宝收银台进行支付。若用户存在欠款情况,支付宝同样会启动这一轮询过程,并直接进行回电。
我们来说一下出现问题的两种场景。
场景一:
我采用支付宝完成交易支付,而送货区域的具体信息却未明确标注。我曾以为这一栏所显示的内容系系统在生成支付宝发货单后,若出现超时情况便会自动更新。然而,随后我接到了客户的不满反馈,指出尽管用户已成功完成支付并显示扣款,但在我们系统记录中却显示交易未能成功处理。
经过仔细检查,我们发现此处所发送的数据字段被设定为某种状态,随后,我们的系统启动了15分钟的异步验证,并持续显示订单不存在的信息。15分钟验证期过后,异步验证流程终止,最终判定结果为失败。然而,支付宝在支付操作完成后,向系统发送了支付成功的通知。由于订单已经被处理为最终状态,并未进行任何修改,这才引发了这一问题。
经过与小马哥的交流得知,此假设在收银环节中,若用户准确输入密码,支付宝将启动订单处理,整个过程需时15分钟。针对已签订的支付宝代扣服务,将采取轮询机制进行扣款。轮询的时间并非我先前所预想的。实际上,请求时间加上后端发送的过期时间,才是真正的过期时间。
用户或许会在支付宝的支付界面逗留长达一小时之久,随后触发支付操作。一旦支付宝向我们发送了通知,我们的订单便已确立,此时将不再接受任何修改。
因此,后续提议将此参数设定为绝对超时限制,这意味着一旦超过此时限,支付宝将停止处理订单。在使用这两个参数之前,我们应当先审视自己的业务需求,明确究竟需要使用哪些参数。
场景二:
先说一下支付宝枚举的状态设置。
WAIT("", "交易已创建,等待买家付款"), //
未付款的交易将会因时间的流逝而自动终止,亦或者,在完成支付后,消费者将获得全额退款。
("", "交易支付成功"), //
("", "交易结束,不予退款");
在使用支付宝的合约代扣功能时,同步请求所反馈的信息中会包含状态码以及业务返回码的详细说明。
通常情况下,我们会选取异步方式进行验证,并且依据验证得出的结果来决定最后的结论。
当前情境下,用户因账户余额短缺而遭遇支付不成功的情况。在同步触发事务处理时,系统会输出相应的状态码及其解释信息。尽管如此,我们的系统已将此次操作记录至数据库,然而,订单的状态目前被标记为正在处理。我们正静待异步验证结果的到来,以便据此调整订单状态。
当返回值为特定字段时,订单将进入补偿查询阶段。在此过程中,我将提及场景一中涉及的两个字段,您可以根据需要选择合适的字段进行表单提交。经过我亲自测试,发现使用这些字段进行操作是可行的,尽管可能涉及中间发送MQ等步骤。需要注意的是,由于存在一至几分钟的延迟,实际测试中设定的15分钟补偿时间,支付宝实际上补偿了17分钟(自生成表格的时间起计算)。
不建议在本地创建订单作业。在完成既定的赔偿之后,务必确认订单的最终完成情况。建议使用“最终状态”这一字段来呈现订单的最终状态(并非所有处于等待状态的订单都代表最终状态)。
我们面临的问题在于,当状态调整至最终阶段,该查询便成为最终的补偿措施。与此同时,MQ会向上游系统发送通知。所发送的状态信息并无异常,然而我们却无法获取到相应的返回码描述。查阅Ant所提供的文档便能明了……查询接口并未提供关于返回码的说明……
若需将错误信息传输至上游,应关注相关操作。不应直接提供查询结果。更理想的做法是,通过状态变更来记录或存储数据库返回的信息,并进一步进行测试。