微服务项目:尚融宝(52)(核心业务流程:充值服务(2))

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 微服务项目:尚融宝(52)(核心业务流程:充值服务(2))

放弃幻想,认清现实,准备斗争


一、定义回调接口



1、controller


UserAccountController中创建回调方法


@ApiOperation(value = "用户充值异步回调")
@PostMapping("/notify")
public String notify(HttpServletRequest request) {
    Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());
    log.info("用户充值异步回调:" + JSON.toJSONString(paramMap));
    //校验签名
    if(RequestHelper.isSignEquals(paramMap)) {
        //充值成功交易
        if("0001".equals(paramMap.get("resultCode"))) {
            return userAccountService.notify(paramMap);
        } else {
            log.info("用户充值异步回调充值失败:" + JSON.toJSONString(paramMap));
            return "success";
        }
    } else {
        log.info("用户充值异步回调签名错误:" + JSON.toJSONString(paramMap));
        return "fail";
    }
}


2、Service


接口:UserAccountService


String notify(Map<String, Object> paramMap);


实现:UserAccountServiceImpl


@Transactional(rollbackFor = Exception.class)
@Override
public String notify(Map<String, Object> paramMap) {
    log.info("充值成功:" + JSONObject.toJSONString(paramMap));
    String bindCode = (String)paramMap.get("bindCode"); //充值人绑定协议号
    String chargeAmt = (String)paramMap.get("chargeAmt"); //充值金额
    //优化
    baseMapper.updateAccount(bindCode, new BigDecimal(chargeAmt), new BigDecimal(0));
    //增加交易流水
    //TODO
    return "success";
}



3、创建Mapper方法


接口:UserAccountMapper


void updateAccount(
    @Param("bindCode")String bindCode,
    @Param("amount")BigDecimal amount,
    @Param("freezeAmount")BigDecimal freezeAmount);



XML:UserAccountMapper.xml


<update id="updateAccount">
    update
    user_account
    set
    amount = amount + #{amount},
    freeze_amount = freeze_amount + #{freezeAmount}
    where
    user_id = (select id from user_info where bind_code = #{bindCode})
</update>


二、增加交易流水



1、枚举


TransTypeEnum


CHARGE(1,"充值"),
INVEST_LOCK(2,"投标锁定"),
INVEST_UNLOCK(3,"放款解锁"),
CANCEL_LEND(4,"撤标"),
BORROW_BACK(5,"放款到账"),
RETURN_DOWN(6,"还款扣减"),
INVEST_BACK(7,"出借回款"),
WITHDRAW(8,"提现"),
;



2、创建BO对象


@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransFlowBO {
    private String agentBillNo;
    private String bindCode;
    private BigDecimal amount;
    private TransTypeEnum transTypeEnum;
    private String memo;
}



3、保存交易流水业务


接口:TransFlowService


void saveTransFlow(TransFlowBO transFlowBO);


实现:TransFlowServiceImpl

 

@Resource
private UserInfoMapper userInfoMapper;
@Override
public void saveTransFlow(TransFlowBO transFlowBO) {
    //获取用户基本信息 user_info
    QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<>();
    userInfoQueryWrapper.eq("bind_code", transFlowBO.getBindCode());
    UserInfo userInfo = userInfoMapper.selectOne(userInfoQueryWrapper);
    //存储交易流水数据
    TransFlow transFlow = new TransFlow();
    transFlow.setUserId(userInfo.getId());
    transFlow.setUserName(userInfo.getName());
    transFlow.setTransNo(transFlowBO.getAgentBillNo());
    transFlow.setTransType(transFlowBO.getTransTypeEnum().getTransType());
    transFlow.setTransTypeName(transFlowBO.getTransTypeEnum().getTransTypeName());
    transFlow.setTransAmount(transFlowBO.getAmount());
    transFlow.setMemo(transFlowBO.getMemo());
    baseMapper.insert(transFlow);
}



4、notify中调用


UserAccountServiceImpl


@Resource
private TransFlowService transFlowService;
@Transactional(rollbackFor = Exception.class)
@Override
public String notify(Map<String, Object> paramMap) {
    ......
    //增加交易流水
    String agentBillNo = (String)paramMap.get("agentBillNo"); //商户充值订单号
    TransFlowBO transFlowBO = new TransFlowBO(
        agentBillNo,
        bindCode,
        new BigDecimal(chargeAmt),
        TransTypeEnum.RECHARGE,
        "充值");
    transFlowService.saveTransFlow(transFlowBO);
    return "success";
}



6edade3995064bb686c387d4ad2668eb.png

相关文章
|
16天前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
16天前
|
消息中间件 监控 开发工具
微服务(三)-实现自动刷新配置(不重启项目情况下)
微服务(三)-实现自动刷新配置(不重启项目情况下)
|
2天前
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
15天前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
18天前
|
消息中间件 缓存 NoSQL
构建高效后端服务:微服务架构的深度实践
本文旨在探讨如何通过采用微服务架构来构建高效的后端服务。我们将深入分析微服务的基本概念、设计原则以及在实际项目中的应用案例,揭示其在提升系统可维护性、扩展性和灵活性方面的优势。同时,本文还将讨论在实施微服务过程中可能遇到的挑战,如服务治理、分布式事务和数据一致性等问题,并分享相应的解决策略和最佳实践。通过阅读本文,读者将能够理解微服务架构的核心价值,并具备将其应用于实际项目的能力。 ##
|
16天前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
34 1
|
28天前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
26 5
|
16天前
|
测试技术 微服务
微服务(八)-服务网关zuul(四)
微服务(八)-服务网关zuul(四)
|
16天前
|
监控 前端开发 Java
微服务(七)-服务网关zuul(三)
微服务(七)-服务网关zuul(三)
|
16天前
|
负载均衡 前端开发 安全
微服务(六)-服务网关zuul(二)
微服务(六)-服务网关zuul(二)