00:00
这节课呢,我们再来看一下业务流程时序图,那么我们已经完成了生成订单展示二维码。异步通知这样的一个功能,接下来呢,还有一种情况就是如果商户后台迟迟没有收到异步通知结果的时候呢,那么商户呢,应该主动去调用微信支付的查单接口,也就是说我们呢,要实现这样的一个流程,我们在商户端应该向微信的服务器发起一个查询订单的这样的一个接口,调用查询呢,这个订单到底是否支付成功了,如果订单支付成功了呢,那么我们呢,根据返回的这个支付结果呢,就可以修改我们的订单状态,当然如果是实体商品的话呢,那么继而我们会有一些发货操作啊等等。好,这个功能呢,其实啊,涉及到几个问题。第一,商户端迟迟没有收到异步通知支付结果,那么这个迟迟是多长时间,比如说五分钟,比如说十分钟,那意味着我们呢,要在我们的商户端的后台程序当中设置一个定时任务,例如五分钟之后,如果没有收到异步通知结果,那么我们就调用查单接口啊,这是我们要做的第一件事情,第二件事情呢,就是查单接口的调用好,第三件事情呢,就是订单状态的修改,那么接下来呢,我们先做第二件事情啊,就是这个查单接口的调用,因为我们要在定时任务当中呢,去调用这个查单接口,所以呢,我们先来实现查单接口,然后呢在创建定时任务。
01:40
我们打开我们的idea。在微信配controller里面,我们创建一个查询订单的接口,当然这个啊,Controller层这个接口方法的创建呢,只是一会儿为了方便我们测试,实际上呢,我们直接创建业务方法就可以了,然后因为我们这个查单的功能呢,要被一个定时任务来调用,而不是controller层的接口,但是呢,创建这个接口呢,可以方便我们测试哈,Public。
02:12
啊。Very old。那我们呢?写一个get mapping好茶单,我们直接用get方式。看一下查询订单的API查询订单,API查询订单呢有两种方式,第一个呢是。根据transaction ID来查,那么transaction ID呢,是在微信的支付结果通知当中给我们返回的一个微信单的支付订单的唯一的业务编号,曾经呢,我们也把它存在了数据库当中。Ment字,微信支付。
03:04
接下来呢,还有第二种方式,第二种方式呢,是根据商户订单号查询,也就是我们的order了,那所以呢,我们用这种方式呢,会方便一些哈。好,因此呢,我们在这个地方呢,用第二种方式啊,用order number。那我们呢,还是写一个日志log.info查询订单。那么我们写微信pay service.query order,把order呢传递进去,好,我们希望呢,得到一个结果,这个结果呢就是返回值,就是查询订单。焊接口文档。最后呢,会有返回参数,那么这个返回参数呢,当然最终呢,也是以Jason的形式返回的哈,那么啊,因为我们查询订单之后呢,后续的处理过程呢,我们要在定时任务中去做,所以在这个接口方法当中呢,我们直接呢就返回字符串就可以了,因为我们呢就是要看一看啊,就是订单状态是什么样的啊,我们确认一下,所以呢,我们暂时不对这个结果呢做解析处理,好,那我们把它返回给前端吧,这样的话呢,一会我们通过拉测试的时候会方便一些。
04:45
好,那现在呢,我们在接口的参数当中呢,定义这个参数,我们希望呢,通过pass来传。接下来我们来实现这个业务方法。
05:04
啊。好,那么查询订单的这个API的组装呢,和之前都差不多,只不过呢,这一次我们的API呢,它的形式是。Get方式啊,然后呢,我们要组装的请求的URL地址呢,是这个中间呢,也有一个占位符,就是要替换成我们的订单号,那另外呢,这边请求参数除了这个商户订单号作为pass路径参数之外呢,还有一个查询参数,也就是说放在问号后面的这个参数,那么是我们的商户号啊,所以我们要做这样的一个URL地址的组装。我们先写一个日志。
06:01
好,接下来呢,我们来组装URL。依然呢是用string点微信API,点我们呢,查询订单的接口呢是。Query number,然后呢,我们把里面的这个。占位符用我们的订单号呢替换一下,所以这面form的第二个参数呢是订单号,好,这是我们的URL的片段,接下来呢,我们前面呢和我们的主机地址呢做一个连接。微信配费点get懂。呀。URL。接下来呢,后面我们还有一部分哈,还有一部分呢,就是。
07:03
商户号。要作为查询字符串连接在我们的URL地址后面,所以呢,在这面呢,我们再写一个连接,叫商户号MC hid等于前面呢要加一个问号。再连上我们的商户号的实际的值,微信配点get m ch ID。那接下来呢,我们来创建请求对象,请求对象呢,这一次是HTTP形式的对象。那么呢,我们可以参考之前的这个关单的这个。对象呢,来创建一下。那么我们之前创建的是post对象,那现在呢,我们应该给它改成get对象。
08:09
好,那在接下来呢,在我们的post请求当中呢,我们要设置的是请求体的内容,以及想要接收的返回数据的这样的一个数据格式,那这个呢,是放在请求头当中的,那因为我们是带的请求,所以呢只需要设置这个请求头就可以了。Ttp,那我希望接类型应好,接下来呢。我们还是。使用。微信配client来调用我们的。SQ的方法,从而执行一个远程请求的发送。那么我们把这个异常呢抛出去。
09:02
好,我们把它改成exception就可以了。那么它的接口也是一样的,改成exception。最后呢,我们来处理这个response,也就是返回结果,那么返回结果这个查单接口是有结果的啊,和刚才我们的这个关单接口不一样,所以呢,我们要参考我们之前的native pay。因为统一下单呢是有结果的,所以我们找到native pay,找到它的处理结果这一部分这个位置。好,我们再找到我们的query order。那么在最后我们把刚才处理结果这一部分呢粘过来,当然了,我们目前为止呢,只需要先暂时返回这个。Body as string就可以了啊,先暂时不用做处理,所以呢,直接return body as string。那么我们把这个结果呢到controller层好,Controller层这面呢,我们。
10:05
抛出一个异常,那这样的话呢,我们查单接口呢,就开发完成了,接下来呢,我们来做一个测试。好,我们的程序呢,已经启动了,我们。在S当中对这个接口呢做一个测试。我们找到网站微信支付API,找到刚才我们的查单接口。那我们在这个位置呢,输入一个订单号,所以呢,我们去数据库当中找到任意的一个订单号,那比如说最后这个用户已取消这个订单,我们把呢复制过来。粘贴在order number这个文本框当中,点击try it out,那现在呢,我们就得到了一个查询成功的结果,并且呢,我们的订单状态呢?
11:03
是订单已关闭。我们再找另外一个订单。比如说第一个订单,我们看一下他呢是支付成功。我们查询一下。好,点击try it out。那么我们来看它的结果。这面显示的呢,就是支付成功,那这个呢,就是我们的查单接口的一个实现和测试。
我来说两句