前言大家好,好久不见,我是CrazyCodes,今天我们来说说支付系统。支付系统是每个系统必备的模块之一,也是很多模块的核心功能。如果付款出现问题,则意味着将直接影响产品收益,事故的严重性很高。本篇我们讲一下支付系统的基本流程,支付、通知(包括同步通知和异步通知)、查询、退款、对账。下面是本文将要用到的流程交互图。支付首先,让我们谈谈在发起支付之前需要做些什么。用户选择好想要的商品后,我们首先创建一个订单,创建订单的基本信息,如名称、价格、数量、用户的收货地址等。之后,我们需要跟进。二、如果系统集成了多种支付方式,我们会有收银页面供用户选择某种支付方式完成支付,比如支付宝、微信、银联等,用户完成选择后,我们会进行支付根据三方系统要求的参数集合,向第三方发起支付请求。一般需要的信息一般包括订单号、商品名称、价格、同步&异步通知地址,部分支付方式还需要用户的收货地址和用户的银行卡信息(卡号、cvv、日期)当然,用户隐私信息需要加密传输。总之,三方支付系统需要什么,我们就传输什么。一切就绪后,我们通过三方支付系统提供的PayUrl发起支付。通知用户支付成功或者失败,三方至少都会给我们一个同步通知,所以我们先来了解一下什么是同步通知地址,给我们发送一个直接跳回本站的POST或者GET请求,以及要求向我们发送来自第三方的一些关键交易信息。如果是移动端,这种通知会在调用支付的Callback的回调结果中通知大概的参数。我们传输的大部分信息,交易状态,第三方交易号,签名(用于验证双方系统的来源),还有一些可能暂时用不到的信息。当我们收到返回的数据时,我们首先对其进行验证以确保它不是欺诈请求。验证的内容无非就是两个系统确定的签名算法,以及一些关键字段,比如金额是否匹配。我们不能完全信任第三方系统发送的信息。我们收到通知后,如果第三方系统提供了查询接口,我们还需要通过查询方式查询第三方订单交易的关键信息,确保支付确实顺利完成。验证完成后,根据自己系统的逻辑,将订单转给后续处理。了解了同步通知后,我们再来看看异步通知。有些朋友比较迷茫。有了同步通知,为什么还要异步通知呢?你暂时可以理解。为了同步通知,支付流程才真正完成。这是一个瞬时过程。第三方系统也暂时认为支付已经完成。但如果出现异常或用户在第三方秒内退款或申诉,我们的流程将受到影响。如上图所示,三方系统一般也需要归档。在系统完成所有验证并确保交易安全完成后,将交易添加到数据库中。至此,整个支付流程就全部完成了。这时候三方会通过我们提供的异步通知地址通知我们支付确实完成了(有时异步和同步通知是一个地址)。我们收到第三方后,还是先进行验证,防止请求欺诈,再保证信息的正确性。我们还是去请求查询界面。异步通知和同步通知最大的区别是我们需要在确保信息完整无误后才发送给第三方。系统返回一个两个系统约定的值,可能是HTTPCODE=200,或者在Document中写200或者complete等。不同的三方系统有不同的要求。每次购买都有退款,退款占支付模块逻辑的一半。大体流程和支付没有太大区别,如上图所示。对于大部分三方系统,退款一般都是通过HTTPResponse返回结果,不会有同步通知。我们根据用户发起退款的商品金额创建退款表单,组装必要的参数后,请求第三方提供的RefundUrl完成退款。注意,是退款申请,为什么是退款申请而不是退款呢?这其实是一个时效问题。一般退款不是实时的,因为三方系统可能有下层链接(比如下层可能有银行链接),那么退款需要一个链接自动审批或者人工审批,当完整链接确认可以退款时,即可完成退款。因为不是实时的,所以没有同步通知,但是大部分系统都有异步通知。当三方系统确认退款完成后,会根据我们发起支付时传输的异步通知地址通知我们退款完成,并携带必要的参数。我们在收到的时候还是需要先进行验证,防止欺诈,然后我们还是需要通过第三方提供的查询接口来查询退款状态,根据我们自己的系统逻辑完成退款的标记,并通知用户。当然,如果没有异步通知,我们可以使用查询接口,通过延迟队列、失败队列重试或者定时脚本,时时向第三方请求退款结果。对账付款或退款完成后,还没有结束。我们应该定期拉账单。大多数第三方系统都会提供bill等接口。拿到账单后,我们需要将自己的系统数据与第三方系统数据进行比对,确保每笔交易的金额、交易时间、交易状态都是完全正确的。当你遇到错误时,你应该寻找问题所在。只有对账完成后,整个交易才能正确完成,否则迟早会被你们公司的财务查到头上,到时候这件事就不是程序实施那么简单了。致谢感谢您阅读到这里,希望本文能对您有所帮助,谢谢。
