00:00
上一个步骤呢,我们做了异步通知的验签哈,那么做完异步通知验签之后呢,我们就要做我们的业务内容的二次校验了,那么我们来看一下我们的支付宝给我提供的文档,那么刚才我们做的就是这个步骤哈,异步通知验签,那么异步通知验签的具体的流程在上面这个地方有所描述,那么这个里面分了几个步骤,第一步,第二步,第三步,第四步和第五步,那么我们说下面的这个异步通知验签的具体的这个验签方法呢,实际上就是对前四个步骤的一个封装,而第五个步骤呢,就是我们所说的业务数据的二次校验,所以呢,我们要参考第五个步骤当中的1234,还有后续的一些说明呢,对我们的业务数据呢,进行一个二次校验哈,好,那接下来呢,我们来看一看,首先我们来判断这四个步骤的内容,我们先来判断第一个步骤就是商户需要验证该通知数据中的out trade number,也就是说我们的订单号。
01:00
是否为商户系统中创建的订单号,好,我们把这个复制一下。先呢,在我们的业务数据的二次校验的第一个步骤当中,完成这一个校验,那首先呢,我们需要把我们商户端的啊,在通知当中获取到的这个订单号呢,给他拿到,那它的参数呢,就是out to the number好。那接下来呢,我们根据这个out trade number呢,在我们的商户端的数据库当中去查询这个订单是否存在,如果能够查询到这个订单是存在的,我们就会认为它就是商户系统当中创建的订单,如果我们查询不到这个订单的话,那么我们就会认为他不是我们商务系统当中的订单,那么呢,我们要拒绝这个请求,也就是说根据。后面这个说明哈,上述1234有任何一个验证不通过,则表明本次通知是异常通知,也就是说具有风险的一个通知哈,有可能是黑客给你发过来的,那么务必忽略啊,好,那么我们在这个地方呢,就进行一个查询,你需要用到的是order in service啊,那我们呢,先把这个order info service呢做一个依赖注入。
02:23
Resource private order for service好,那后面呢,我们就使用这个order for service呢进行一个查询,第二这里面呢,有一个方法叫get order by order number,我们把out trade number呢给他。作为参数添加进去,然后呢,我们就会得到一个order,也就是我们的订单对象,哈,好,所以我们获取到订单对象之后呢,我们对这个订单对象是否存在做一个判断,如果它等于那样的话,那么我们就打印一个错误日志,叫做订单不存在,那么我们就忽略这个通知,我们就立即返回就可以了,Return result,好,接下来呢,我们来做第二个业务判断。
03:22
那第二个业务判断呢,就是判断total amount是否确实为该订单的实际金额。好,那所以呢,我们先得从我们的通知参数当中把total among给你获取出来,Paraters get,啊,好,那这个是我们的total amount,那么我们的。通知参数当中的total amount呢是以元为单位的,而我们订单当中的金额呢,是以分为单位的,所以两个之间要互相判断的话呢,我们先把它们转换成同样的一种数据类型,那我们呢,就先转换这个total amount,所以呢,我们先应用一下这个big decim total amount,然后呢,让他去multi play,一个100,所以我们再用一个这个decim 100,好,这样的话呢,我们就会啊得到一个。
04:27
那个单的值哈,那但是呢,其实我想得到一个in value啊好,这面呢,我们方便做比较,那这样的话呢,我们就会得到一个tota total amount in吧,好,然后接下来呢,我们在把我们订单当中的这个金额取出来,所以order get total fe,好,我们订单当中的这个金额呢,直接就是以分为单位的,所以呢,我们直接就total feed in,那么我们将这个total和total feed呢进行一个比较,所以呢,我们判断一下这个total amount in,如果不等于total fe的话,那么我们就会认为这个金额交验失败,log.error金额校验失败,那么同样我们返回result,那也就是说忽略。
05:28
这个通知不做后续的处理了,所以呢,这个是我们啊第二个步骤判断total amount,接下来呢,我们来看第三个步骤,校验通知中的CID啊,是否为out trade number,这笔单据所对应的操作方也就是商户了,好,我们把这个呢复制一下。好,这个后面我们就不用管它了啊,就看这个前面这个就可以了,那么CID,我们把通知参数当中的这个参数给它取出来,点get s ID,好,我们先拿到这个SID,也就是商家的PID啊,那么它啊实际上对于我们。
06:23
如果是沙箱环境的话,对于我们商家沙箱环境当中的这个商户PID啊,就是这个值,那么。如果它和我们那个商户PID是一致的话,那么它就是一个合法的通知,如果不一致的话,那么它就是一个不合法的通知,好,那如果不一致的话,你的钱可能付给就是参数当中的这个商户了,而不是我们商家这个商户是不是,所以这就是一个有风险的通知嘛,好我们也要忽略它,那所以呢,这边我们就要进行一个判断啊,在判断之前,我先把咱们沙箱当中的这个商家ID给取出来。
07:06
那么我们商家。ID在沙箱当中的配置呢,是这个位置。好,所以这款呢,就是我们沙箱当中的商家的PID了。Property吧,叫做CID。好,我们将SID和SD property呢进行一个比较,所以如果SID它不等于c ID property的话,那么我们就会认为商家PID教研。失败我们还是好,这个是第三个步骤,紧接着第四个步骤。
08:05
第四个步骤呢,就是验证APPID是否为该商户本身。好,我们先从参数当中拿到APPID,那这个是通知参数啊,然后我们get这个APPID,好,接下来呢,我们再从我们的沙箱参数当中拿到我们的APPID,那这个是我们真实的APPID,而我们得到的这个参数呢,因为是通过远程回调获取的,所以呢,我们要校验它是否为真实的一个远程回调,是否为真实的PID啊,所以呢,我们还是从肯费的当中第二第二层property拿到我们真实的PID。好。然后将从通知参数当中获取到的这个APPID,那它有可能是假的,是不是和我们真实的APPID进行比对,如果一致了,就说明呢,这是一个合法的通知,如果不一致,那么我们的APID交研失败,那么我们也要忽略这个毁掉通知啊,那么不会做继续的处理了,因为它是有风险的,好,Error,那么APPID校验,校验失败啊,校验失败啊,好,然后接下来呢,我们依然是一寸。
09:42
这是第四个步骤,那么最后校验成功后,在response中返回success,并继续商户自身的业务处理,校验失败返回飞力了。哈,好,这是我们后边要做的事情了,但是在这个后面要做的事情和整个前面这四个校验之间呢,其实我们还有一个呃工作要做,你看啊,上述1234有任何一个验证不通过,则表明本次通知是异常通知,务必忽略,那这个我们已经做过了,然后这个地方在支付宝的业务通知中,只有交易状态为success或者是trade finish的时候,支付宝才会认定卖家是付款成功的,那言外之意就是如果交易状态不是这两个之一,那么我们就会认为卖家付款没有成功,那没有成功,我们也是不会做后续的订单状态的改变呀,支付认知的记录呀等等啊这些事情,那么所以呢,我们要对这两个状态进行改变,但是对于我们这个业务来说。
10:43
那我们就判断这个trade success就行了,因为前面我们其实曾经介绍过哈,这个trade finished的呢,针对的是不支持退款功能的这样的一个啊功能的啊,也就是说在我们的支付功能当中,有一些呢是不支持退款功能的,当它不支持的时候,它才会有一个状态叫trade finish的,而我们当前做的这个支付流程呢,它是支持退款功能的,所以呢,我们就只判断trade success就可以了,那么在我们的应用程序当中呢,我们最后做一个判断啊,把这个复制过来。
11:28
好。那实际上对于我们来说,我们就判断这个trade的success就可以。所以在这面呢,我们从parameters当中先拿出它的交易状态,那么交易状态的字段是什么呢?我们来找一下,在业务参数当中有一个专门表示交易状态的字段,就是trade status。我们把它获取出来,好,然后接下来呢,我们用。
12:00
Trade success和这个trades呢进行比较好,第2EQUAL trade status接下来。如果满足这个条件的话,那么我们就支付未成功好,那么最后我们还是return造好。当以上所有的校验都通过了,也就是说以上if语句哪个也没走,那么我们就会来到最后的这个步骤啊,那么我们要处理自身的业务了,那么处理自身的业务怎么处理,处理什么是我们下一个步骤要做的呢?那么下一个步骤要做的内容呢?那么我们现在看来是包含修改订单状态啊,记录支付日志这样一些内容,那这个呢,是和之前我们在微信支付开发的过程当中,做这个支付回调啊,做这个支付通知的时候,哎,我们呢,也是需要有这样的一个步骤的,在通知校验都成功的情况下,我们就需要去处理我们的订单了,处理我们的支付日志了。
13:28
接下来呢,我们要对刚才我们所编写的这个代码呢,做一个测试,好,我们启动这个后端程序。好,我们已经启动成功了,然后接下来呢,我们来访问一下我们这个程序啊。还是选择支付宝。
14:10
我们还是选择支付宝的沙箱板进行扫码。好,我已经扫码成功了,然后呢,等待它跳转哈,好,那其实我们要看的呢,是我们的后台的日志啊,看一看他有没有打印任何一个啊,就是校验不成功的日志,如果打印了就说明我们的校验有问题啊,如果没有打印就说明我们所有的校验呢都通过了。那么我们来检查一下。在这个位置呢,就我们就啊调用了我们的支付通知,并且呢,我们的通知参数呢,也都在控制台上输出出来了,然后呢,支付成功,异务通知验签成功哈,然后在接下来呢,我们会发现没有任何一个失败的校验啊,那也就是说明我们整个的校验呢是成功的,并且最后呢,我们给支付宝返回了一个success的结果,好,这是我们所做的。
15:20
对支付结果当中的业务内容进行二次校验。
我来说两句