假造电商-话费充值业务(二)话费充值对接供应商模块开发 ...

打印 上一主题 下一主题

主题 1543|帖子 1543|积分 4629

  一、对接供应商模块开发


  供应商对接模块chongba_recharge_supplier主要负责的就是调用外部的供应商系统进行充值下单,这种调用是一种基于HTTP协议的调用。
  别的在供应商对接模块中主要是实现的业务逻辑有:
1:余额或押金不敷情况下的失败轮转
2:网络故障/充值失败重试,需要添加一个重试任务
3:重试次数到达阈值后停止供应商对接
4:供应商异步回调,订单状态修改
  二、对接供应商服务接口界说


  chongba_recharge_supplier监听到支付乐成消息之后,接收到的消息:RechargeRequest,具体对接的不直接写在监听类中,单独界说一个对接供应商服务接口
  步骤1:在chongba_recharge_supplier模块下创建包:com.chongba.supplier.inf,在该包下创建充吧系统对接供应商接口:SupplierService,接口中界说一个对接方法:void recharge(RechargeRequest rechargeRequest);
 
  1. public interface SupplierService {
  2.     /**
  3.      * 对接供应商下单
  4.      * @param rechargeRequest
  5.      */
  6.     public void recharge(RechargeRequest rechargeRequest);
  7. }
复制代码
 

步骤2:在chongba_recharge_supplier模块下创建包:com.chongba.supplier.service,在该包下创建一个接口的实现类:SupplierServiceImpl
 
  1. @Slf4j
  2. @Service
  3. public class SupplierServiceImpl implements SupplierService{   
  4.     @Override
  5.     public void recharge(RechargeRequest rechargeRequest) {
  6.     }
  7. }
复制代码
 

步骤3:配置供应商系统的接口地点,在实际业务中调用第三方系统接口大都基于HTTP协议调用,充吧系统在模块中模拟了两个供应商,注意这个模块并没有在充吧的注册中心去注册,由于我们模拟的是外部系统,所以我们要调用外部系统必须得知道系统接口的调用地点;
在application-dev.yml中配置如下:
  1. supplier:
  2.   apis: {
  3.           "jisuapi": "http://127.0.0.1:8090/jisuapi/mobilerecharge/recharge",
  4.           "juheapi": "http://127.0.0.1:8090/juheapi/recharge"
  5.          }
复制代码
 

步骤4:编写配置类读取配置,在chongba_recharge_supplier模块下创建包:com.chongba.supplier.conf,在该包下创建配置类:SupplierConfig
  1. @Data
  2. @Component
  3. @ConfigurationProperties(prefix = "supplier")
  4. public class SupplierConfig {
  5.    
  6.     private Map<String,String> apis; //加载供应商api地址
  7. }
复制代码
 

步骤5:在对接服务实现类:SupplierServiceImpl中注入配置类SupplierConfig,并测试配置能否正常读取
 
  1. @Slf4j
  2. @Service
  3. public class SupplierServiceImpl implements SupplierService{
  4.     @Autowired
  5.     private SupplierConfig supplierConfig;
  6.    
  7.     @PostConstruct
  8.     public void init(){
  9.         System.out.println("加载到的配置如下:"+supplierConfig.getApis());
  10.     }
  11.     @Override
  12.     public void recharge(RechargeRequest rechargeRequest) {
  13.         
  14.     }
  15. }
复制代码
 

运行启动类:SupplierApplication,查看控制台输出:
  三、对接供应商逻辑编写


  配置正常加载之后需要编写对接供应商的处理逻辑,先将代码布局实现,然后增补细节
   1).编写对接逻辑分发方法:doDispatchSupplier(RechargeRequest rechargeRequest),根据供应商编号进行分发
   2).编写对接聚合的方法:doPostJuhe(RechargeRequest rechargeRequest)
   3).编写对接极速的方法:doPostJisu(RechargeRequest rechargeRequest)
   对接第三方其实就是向第三方系统接口地点发起HTTP请求,我们可以使用HttpClient、PostMan等工具。
步骤1:在启动类SupplierApplication中向容器注入RestTemplate
  1. @Bean
  2. public RestTemplate restTemplate(){
  3.     return new RestTemplate();
  4. }
复制代码
 

步骤2:整体对接代码布局如下:
 
  1. @Autowired
  2.     private RestTemplate restTemplate;
  3. @Override
  4.     public void recharge(RechargeRequest rechargeRequest) {
  5.         doDispatchSupplier(rechargeRequest);
  6.     }
  7.     /**
  8.      * 对接逻辑分发
  9.      * @param rechargeRequest
  10.      */
  11.     private void doDispatchSupplier(RechargeRequest rechargeRequest) {
  12.         //设置供应商的调用地址:
  13.         String url = supplierConfig.getApis().get(rechargeRequest.getSupply());
  14.         rechargeRequest.setRechargeUrl(url);
  15.         //根据需要对接的供应商的编号确定不同的对接方式---不同的api需要传递的参数类型和参数名称等各不相同
  16.         if(Constants.juheapi.equals(rechargeRequest.getSupply())){
  17.             //对接聚合
  18.             doPostJuhe(rechargeRequest);
  19.         }else if(Constants.jisuapi.equals(rechargeRequest.getSupply())) {
  20.             //对接极速
  21.             doPostJisu(rechargeRequest);
  22.         }
  23.     }
  24.     private void doPostJuhe(RechargeRequest rechargeRequest) {
  25.         //聚合要求传递的是json格式的数据
  26.         //创建并设置请求头
  27.         HttpHeaders headers = new HttpHeaders();
  28.         headers.setContentType(MediaType.APPLICATION_JSON);
  29.         //创建请求实体
  30.         HttpEntity httpEntity = new HttpEntity(JSON.toJSONString(rechargeRequest),headers);
  31.         //发送请求
  32.         ResponseEntity<String> responseEntity = restTemplate.postForEntity(rechargeRequest.getRechargeUrl(), httpEntity, String.class);
  33.         //获得结果
  34.         String body = responseEntity.getBody();
  35.         System.out.println(body);
  36.     }
  37.     private void doPostJisu(RechargeRequest rechargeRequest) {
  38.         
  39.     }
复制代码
 
 
然后注意:在我们监听类中监听到消息之后,要去调用我们供应商对接服务接口方法:
 
 
  1. @Component
  2. @Slf4j
  3. @RocketMQMessageListener(topic = "pay",consumerGroup = "order-paid-consumer")
  4. public class PayRocketListener implements RocketMQListener<RechargeRequest>{
  5.     @Autowired
  6.     private SupplierService supplierService;
  7.     /**
  8.      * 监听消息:
  9.      * @param rechargeRequest
  10.      */
  11.     @Override
  12.     public void onMessage(RechargeRequest rechargeRequest) {
  13.         log.info("PayRocketListener 监听到了消息,{}",rechargeRequest);
  14.         supplierService.recharge(rechargeRequest);
  15.     }
  16. }
复制代码
 
启动测试:
启动chongba_recharge_web工程,chongba_recharge_mock工程,chongba_recharge_supplier工程
访问:http://localhost:191/进行充值,查看结果
步骤3:供应商返回结果封装处理:对于供应商的返回结果数据我们可以统一封装处理
对进行泛型的反序列化,使用TypeReference可以明确的指定反序列化的类型
 
  1. @Override
  2.     public void recharge(RechargeRequest rechargeRequest) {
  3.         Result<RechargeResponse> result = doDispatchSupplier(rechargeRequest);
  4.         if(result !=null){           
  5.         }
  6.     }
  7.     /**
  8.      * 对接逻辑分发
  9.      * @param rechargeRequest
  10.      */
  11.     private Result<RechargeResponse> doDispatchSupplier(RechargeRequest rechargeRequest) {
  12.         //设置供应商的调用地址:
  13.         String url = supplierConfig.getApis().get(rechargeRequest.getSupply());
  14.         rechargeRequest.setRechargeUrl(url);
  15.         //根据需要对接的供应商的编号确定不同的对接方式---不同的api需要传递的参数类型和参数名称等各不相同
  16.         if(Constants.juheapi.equals(rechargeRequest.getSupply())){
  17.             //对接聚合
  18.             return  doPostJuhe(rechargeRequest);
  19.         }else if(Constants.jisuapi.equals(rechargeRequest.getSupply())) {
  20.             //对接极速
  21.             return  doPostJisu(rechargeRequest);
  22.         }
  23.         return null;
  24.     }
  25.     private Result<RechargeResponse> doPostJuhe(RechargeRequest rechargeRequest) {
  26.         //聚合要求传递的是json格式的数据
  27.         //创建并设置请求头
  28.         HttpHeaders headers = new HttpHeaders();
  29.         headers.setContentType(MediaType.APPLICATION_JSON);
  30.         //创建请求实体
  31.         HttpEntity httpEntity = new HttpEntity(JSON.toJSONString(rechargeRequest),headers);
  32.         //发送请求
  33.         ResponseEntity<String> responseEntity = restTemplate.postForEntity(rechargeRequest.getRechargeUrl(), httpEntity, String.class);
  34.         //获得结果
  35.         /*String body = responseEntity.getBody();// Result<RechargeResponse>
  36.         Result result = JSON.parseObject(body, Result.class);//因为泛型的问题可能会导致出现问题
  37.         System.out.println(body);*/
  38.         Result<RechargeResponse> result = JSON.parseObject(responseEntity.getBody(), new TypeReference<Result<RechargeResponse>>(){});
  39.         return result;
  40.     }
  41.     // 对接极速
  42.     private Result<RechargeResponse> doPostJisu(RechargeRequest rechargeRequest) {
  43.         return null;
  44.     }
复制代码
 
 
  四、对接供应商测试


  业务逻辑:
  选择手机充值进行话费充值。进行充值,然后生成订单并支付乐成。支付乐成后,对接供应商模块,发送消息到供应商平台,然后接收聚合供应商返回的消息。进行处理。
  选择充值:

 

  进行充值:

 
  充值话费乐成:

 
  对接供应商模块,发送消息到供应商平台,然后接收聚合供应商返回的消息(余额不敷)。对接乐成。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表