本系列主要先容话费充值相关业务以及开辟。
一、话费充值业务梳理
1.1.话费充值业务流程
电商首页全部商品分类下选择话费充值,来到充值信息填写页面,填写手机号并且选择充值金额,提交。此时会产生充值订单
并且来到支付确认页面,此时选择支付方式完成充值。充值乐成后就可以查看我们的订单。
下图是整个话费充值的业务流程:
首先选择话费充值,填写好充值信息之后点击提交订单。这个时候就会去创建一个充值的订单 。接下来就为订单完成支付,这是要对接支付系统。完成支付后大家要注意的是,此时的订单状态不是充值乐成的 状态,而只是充值处理中的状态。订单状态什么时候修改为充值乐成呢?
这个应该等到第三方的充值平台 帮我们完成充值之后 ,回调我们的系统。这个时候我们才将 订单状态修改为充值乐成的这么一个状态。以是支付完成订单状态是充值处理中的状态。支付完成后应该通知供应商对接模块去和供应商对接,通知的方式我们采用异步的方式通知。供应商对接模块接收到支付乐成通知消息之后,就要和供应商对接 ,也就是去调用供应商平台也就是第三方充值平台的充值接口。
调用第三方充值平台的充值接口之后,第三方充值平台供应商就会帮我们去完成充值。假如他帮我们完成充值之后,就会回调我们的系统,我们在进行订单状态的修改。
当然假如这个过程中产生了非常,有很多种情况,比如说我们的平台在供应商平台余额不敷了。假如余额不敷了供应商接口的平台就不让我们调用了。这个时候会有一个业务逻辑:供应商轮转的业务逻辑。有可能我们平台合作的供应商不止一家,在这家余额不敷不让我们调用他的接口,我们还可以轮转到下一家平台。
第二种逻辑:假如我们在调用供应商接口的时候产生了延迟,也就是说产生了网络故障。网络故障之后我们会添加一个延迟任务,比假如一分钟后重试。除此之外,我们调用第三方平台的接口的时候 ,假如它给我们返回充值失败,也可以做一个充值失败之后,一分钟之后的重试任务。当然重试任务不可能一直的重试下去,我们会做一个重试次数的阈值的设定值。假如凌驾阈值,则判断订单是失败的。这是业务逻辑的先容。
二、充吧工程模块先容
充吧工程模块先容及调用关系
项目模块先容:
chongba_recharge_web:话费服务工程,包含了页面,天生订单mock,支付mock,
chongba_recharge_trade:订单追踪模块mock,只包含操作订单的Mapper和订单实体
chongba_recharge_mock:供应商模块mock,模拟供应商系统
chongba_recharge_supplier:对接供应商下单模块 ,负责和各个供应商对接
服务之间的调用关系为:
虚拟业务最大技术特点和对接过程中由于网络,双方系统各种问题,会有延迟,重试,及末了订单同步乐成失败等一些列问题,以是充吧项目在话费充值业务这块主要实现了
1:接收充值乐成的消息然后去和供应商对接
2:对接失败进行重试,并且限定了重试次数
3:平台余额不敷进行供应商的轮转
4:网络非常进行重试
5:对接乐成后修改订单状态
三、充吧mock模块准备
3.1.工程导入
步骤1:资料/话费服务模块导入,将该目录下的三个工程模块拷贝到当前项目父工程模块下,
步骤2:在chongba_parent的pom文件中找到,在其中添加两个模块,设置如下- <module>chongba_recharge_trade</module>
- <module>chongba_recharge_web</module>
- <module>chongba_recharge_mock</module>
复制代码
步骤3:革新父工程,利用maven的清理命令清理父工程
步骤4:实行订单数据库脚本,创建订单数据库及表
- DROP database if exists `chongba_order_trade`;
- CREATE DATABASE `chongba_order_trade` DEFAULT CHARACTER SET utf8;
- USE `chongba_order_trade`;
- CREATE TABLE `order_trade` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '相当于流水号',
- `gmt_create` datetime DEFAULT NULL,
- `gmt_modified` datetime DEFAULT NULL,
- `order_status` tinyint(3) DEFAULT NULL COMMENT ' 1创建 处理中 2 成功 3 失败 9 未确认',
- `user_id` bigint(20) DEFAULT NULL COMMENT '下游用户ID',
- `category_id` tinyint(3) DEFAULT NULL COMMENT '商品类别(1充值,2兑换)',
- `brand_id` varchar(50) DEFAULT NULL COMMENT '商品编号',
- `sales_price` decimal(11,2) DEFAULT NULL COMMENT '销售价格',
- `face_price` double(20,0) DEFAULT NULL COMMENT '面值',
- `cost_price` double(11,0) DEFAULT NULL COMMENT '成本价',
- `mobile` char(11) DEFAULT NULL COMMENT '手机',
- `trade_no` bigint(20) DEFAULT NULL COMMENT '交易订单',
- `order_no` varchar(100) DEFAULT NULL COMMENT '订单号',
- `order_time` datetime DEFAULT NULL COMMENT '订单时间',
- PRIMARY KEY (`id`)
- )ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码
四、充吧话费web工程先容
充吧话费web工程先容和业务逻辑实现:
步骤1:查看设置文件,找到启动类:WebApplication并启动,访问:http://localhost:191/
步骤2:访问首先到达首页- @RequestMapping(value = "/")
- public ModelAndView index() {
- ModelAndView view =new ModelAndView("index");
- return view;
- }
复制代码
步骤3:首页点击:充值,来到选择充值信息页面:recharge.html,页面上点击提交实行javascript代码进行前端手机号校验,校验通事后发送请求创建订单- var href="/crtorder?mobile="+phone+"&pamt="+$("#price").html()+"&factPrice="+factPrice+"&brandId=789&categoryId=111";
复制代码
携带参数进行订单的天生,这里关于品牌,分类等相关信息直接是写成了固定的,
步骤4:在chongba_recharge_web工程中的OrderController中有方法createRechargeOrder模订定单的创建,真实情况是需要对接订单系统天生订单,接收订单系统(服务)返回的订单信息。
- /**
- * 充值操作(充值订单)
- * @param RechargeRequest 订单请求信息
- * @return
- */
- @RequestMapping(value = "/crtorder")
- public ModelAndView createRechargeOrder(RechargeRequest orRequest) {
- Result<RechargeResponse> result = null;
- ModelAndView view = null;
- try {
- //对接订单系统
- result = orderProcessService.recharge(orRequest);
- } catch (Exception e) {
- e.printStackTrace();
- view =new ModelAndView("recharge");
- }
- if(result.getCode()==200) {
- //成功
- view =new ModelAndView("pay");
- view.addObject("result",result);
- }else {
- //失败
- view =new ModelAndView("recharge");
- }
- return view;
- }
复制代码
步骤5:订单创建乐成后,跳转到:pay.html,并显示订单相关数据比如订单号,在pay.html页面中,选择支付方式,点击立即支付要完成支付,在我们chongba_recharge_web模块中的OrderController中模拟了一个对接支付的方法:payorder,支付乐成后通知与供应商对接的模块chongba_recharge_supplier进行对接供应商下单操作- [/code]
- [code]/**
- * 选择订单支付方式
- * @return
- */
- @RequestMapping(value = "/payorder")
- public ModelAndView payorder(String orderNo) {
- OrderTrade orderTrade = null;
- try {
- //根据订单号查询待支付订单
- orderTrade = orderProcessService.queryOrderByNo(orderNo);
- // 调用支付服务完成支付,接收支付结果
-
- //支付后通知供应商对接模块----异步通知
- RechargeRequest request =new RechargeRequest();
- request.setOrderNo(orderNo);
- request.setMobile(orderTrade.getMobile());
- request.setPamt(orderTrade.getSalesPrice());
-
- rocketMQTemplate.convertAndSend("pay", request);
- } catch (Exception e) {
- ModelAndView view =new ModelAndView("payfail");
- return view;
- }
- ModelAndView view =new ModelAndView("paysuccess");
- view.addObject("orderTrade", orderTrade);
- return view;
- }
复制代码
通知对接供应商下单模块chongba_recharge_supplier我们利用的是异步通知的方式,利用rocketMQ,进行系统解耦和。
我们充吧项目的核心业务就从对接供应商下单模块chongba_recharge_supplier接收异步通知开始!由chongba_recharge_supplier模块去对接第三方的供应商系统!
五、充吧供应商模块先容
充吧项目供应商对接模块chongba_recharge_supplier就是用于与其他外部供应商系统做对接的,但是由于一系列问题我们并未与真实的第三方话费供应商系统取得商业合作,因此我们只能模拟一个外部的供应商系统模块是:chongba_recharge_mock
1:打开chongba_recharge_mock模块,查看设置,与其他设置不一样的是设置了一个回调地址:notify-url
其作用就是用于第三方系统的回调,充吧系统调用第三方供应商系统进行充值下单,第三方供应商系统下单后进行话费充值,充值乐成后回调我们系统进行订单状态等的修改
2:模拟了两个供应商:MockJisuRechargeController,MockJuheRechargeController,在实际的企业业务中一般都会接多个供应商,这样当某一供应商系统调不通或者我们系统在对方平台余额不敷时还可以轮转到下一个供应商,保证业务不会中断。
3:MockJuheRechargeController中模拟了聚合平台系统,模拟了一种我们系统在聚合平台余额不敷的情况,是为了说明充吧系统的轮转业务
4:MockJisuRechargeController中模拟了极速平台系统,模拟了一种正常充值乐成的情况
5:在BaseController中的rechargeNotify方法模拟的是充值乐成后回调充吧系统进行订单状态的修改等相关操作
充吧系统模拟的供应商:
聚合:https://www.juhe.cn/docs/api/id/85
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |